Browse Source

Fix stack overflow exception in CSharpResolver

pull/3471/head
ds5678 2 months ago committed by Jeremy Pritts
parent
commit
1bba26cdb0
  1. 2
      ICSharpCode.Decompiler.Tests/ICSharpCode.Decompiler.Tests.csproj
  2. 6
      ICSharpCode.Decompiler.Tests/ILPrettyTestRunner.cs
  3. 14
      ICSharpCode.Decompiler.Tests/TestCases/ILPretty/Issue3466.cs
  4. 49
      ICSharpCode.Decompiler.Tests/TestCases/ILPretty/Issue3466.il
  5. 2
      ICSharpCode.Decompiler/CSharp/Resolver/CSharpResolver.cs

2
ICSharpCode.Decompiler.Tests/ICSharpCode.Decompiler.Tests.csproj

@ -94,6 +94,7 @@ @@ -94,6 +94,7 @@
<None Include="TestCases\ILPretty\GuessAccessors.il" />
<None Include="TestCases\ILPretty\Issue2260SwitchString.il" />
<None Include="TestCases\ILPretty\Issue3442.il" />
<None Include="TestCases\ILPretty\Issue3466.il" />
<None Include="TestCases\ILPretty\MonoFixed.il" />
<None Include="TestCases\Correctness\NonGenericConstrainedCallVirt.il" />
<None Include="TestCases\ILPretty\UnknownTypes.cs" />
@ -135,6 +136,7 @@ @@ -135,6 +136,7 @@
<Compile Include="TestAssemblyResolver.cs" />
<Compile Include="TestCases\ILPretty\Issue3421.cs" />
<Compile Include="TestCases\ILPretty\Issue3442.cs" />
<Compile Include="TestCases\ILPretty\Issue3466.cs" />
<Compile Include="TestCases\ILPretty\MonoFixed.cs" />
<Compile Include="TestCases\Pretty\Comparisons.cs" />
<Compile Include="TestCases\Pretty\GloballyQualifiedTypeInStringInterpolation.cs" />

6
ICSharpCode.Decompiler.Tests/ILPrettyTestRunner.cs

@ -219,6 +219,12 @@ namespace ICSharpCode.Decompiler.Tests @@ -219,6 +219,12 @@ namespace ICSharpCode.Decompiler.Tests
await Run();
}
[Test]
public async Task Issue3466()
{
await Run();
}
[Test]
public async Task Issue2260SwitchString()
{

14
ICSharpCode.Decompiler.Tests/TestCases/ILPretty/Issue3466.cs

@ -0,0 +1,14 @@ @@ -0,0 +1,14 @@
namespace ICSharpCode.Decompiler.Tests.TestCases.ILPretty
{
public class Issue3466<T>
{
public static implicit operator Issue3466<T>(T t)
{
return null;
}
public static bool M(Issue3466<object> x)
{
return x != null;
}
}
}

49
ICSharpCode.Decompiler.Tests/TestCases/ILPretty/Issue3466.il

@ -0,0 +1,49 @@ @@ -0,0 +1,49 @@
.assembly extern System.Runtime
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 4:0:0:0
}
.assembly Issue3466
{
.hash algorithm 0x00008004 // SHA1
.ver 0:0:0:0
}
.class public auto ansi beforefieldinit ICSharpCode.Decompiler.Tests.TestCases.ILPretty.Issue3466`1<T>
extends [System.Runtime]System.Object
{
.method public hidebysig specialname static
class ICSharpCode.Decompiler.Tests.TestCases.ILPretty.Issue3466`1<!T> op_Implicit (
!T t
) cil managed
{
.maxstack 8
IL_0000: ldnull
IL_0001: ret
}
.method public final hidebysig static bool M(class ICSharpCode.Decompiler.Tests.TestCases.ILPretty.Issue3466`1<object> x) cil managed
{
.maxstack 8
IL_0000: ldarg.0
IL_0001: brtrue.s IL_0004
IL_0002: ldc.i4.0
IL_0003: br.s IL_0005
IL_0004: ldc.i4.1
IL_0005: ret
}
.method public hidebysig specialname rtspecialname
instance void .ctor () cil managed
{
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [System.Runtime]System.Object::.ctor()
IL_0006: ret
}
}

2
ICSharpCode.Decompiler/CSharp/Resolver/CSharpResolver.cs

@ -805,7 +805,7 @@ namespace ICSharpCode.Decompiler.CSharp.Resolver @@ -805,7 +805,7 @@ namespace ICSharpCode.Decompiler.CSharp.Resolver
}
if (op == BinaryOperatorType.Equality || op == BinaryOperatorType.InEquality)
{
if (lhsType.IsReferenceType == true && rhsType.IsReferenceType == true
if (lhsType.IsReferenceType == true && rhsType.IsReferenceType == true && rhsType.Kind != TypeKind.Null
&& (conversions.IdentityConversion(lhsType, rhsType)
|| conversions.ExplicitConversion(lhsType, rhsType).IsReferenceConversion
|| conversions.ExplicitConversion(rhsType, lhsType).IsReferenceConversion))

Loading…
Cancel
Save