icsharpcode / ILSpy

.NET Decompiler with support for PDB generation, ReadyToRun, Metadata (&more) - cross-platform!
21.45k stars 3.35k forks source link

Decompiler should not crash when decompiling a reference assembly #993

Closed siegfriedpammer closed 6 years ago

siegfriedpammer commented 6 years ago

The decompiler engine should not crash when dealing with a reference assembly: File: C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\mscorlib.dll

System.ArgumentNullException: Value cannot be null.
Parameter name: key
   at System.ThrowHelper.ThrowArgumentNullException(ExceptionArgument argument)
   at System.Collections.Generic.Dictionary`2.FindEntry(TKey key)
   at System.Collections.Generic.Dictionary`2.TryGetValue(TKey key, TValue& value)
   at ICSharpCode.Decompiler.FlowAnalysis.DataFlowVisitor`1.GetBlockInputState(Block block) in C:\Users\Siegfried\Projects\ILSpy\ICSharpCode.Decompiler\FlowAnalysis\DataFlowVisitor.cs:line 346
   at ICSharpCode.Decompiler.FlowAnalysis.DataFlowVisitor`1.VisitBlockContainer(BlockContainer container) in C:\Users\Siegfried\Projects\ILSpy\ICSharpCode.Decompiler\FlowAnalysis\DataFlowVisitor.cs:line 367
   at ICSharpCode.Decompiler.IL.BlockContainer.AcceptVisitor(ILVisitor visitor) in C:\Users\Siegfried\Projects\ILSpy\ICSharpCode.Decompiler\IL\Instructions.cs:line 657
   at ICSharpCode.Decompiler.IL.Transforms.SplitVariables.Run(ILFunction function, ILTransformContext context) in C:\Users\Siegfried\Projects\ILSpy\ICSharpCode.Decompiler\IL\Transforms\SplitVariables.cs:line 35
   at ICSharpCode.Decompiler.CSharp.CSharpDecompiler.DecompileBody(MethodDefinition methodDefinition, IMethod method, EntityDeclaration entityDecl, ITypeResolveContext decompilationContext) in C:\Users\Siegfried\Projects\ILSpy\ICSharpCode.Decompiler\CSharp\CSharpDecompiler.cs:line 761
   at ICSharpCode.Decompiler.CSharp.CSharpDecompiler.DoDecompile(MethodDefinition methodDefinition, IMethod method, ITypeResolveContext decompilationContext) in C:\Users\Siegfried\Projects\ILSpy\ICSharpCode.Decompiler\CSharp\CSharpDecompiler.cs:line 728
   at ICSharpCode.Decompiler.CSharp.CSharpDecompiler.DoDecompile(ITypeDefinition typeDef, ITypeResolveContext decompilationContext) in C:\Users\Siegfried\Projects\ILSpy\ICSharpCode.Decompiler\CSharp\CSharpDecompiler.cs:line 660
   at ICSharpCode.Decompiler.CSharp.CSharpDecompiler.Decompile(IList`1 definitions) in C:\Users\Siegfried\Projects\ILSpy\ICSharpCode.Decompiler\CSharp\CSharpDecompiler.cs:line 471
   at ICSharpCode.Decompiler.CSharp.CSharpDecompiler.Decompile(IMemberDefinition[] definitions) in C:\Users\Siegfried\Projects\ILSpy\ICSharpCode.Decompiler\CSharp\CSharpDecompiler.cs:line 446
   at ICSharpCode.ILSpy.CSharpLanguage.DecompileType(TypeDefinition type, ITextOutput output, DecompilationOptions options) in C:\Users\Siegfried\Projects\ILSpy\ILSpy\Languages\CSharpLanguage.cs:line 252
   at ICSharpCode.ILSpy.TreeNodes.TypeTreeNode.Decompile(Language language, ITextOutput output, DecompilationOptions options) in C:\Users\Siegfried\Projects\ILSpy\ILSpy\TreeNodes\TypeTreeNode.cs:line 108
   at ICSharpCode.ILSpy.TextView.DecompilerTextView.DecompileNodes(DecompilationContext context, ITextOutput textOutput) in C:\Users\Siegfried\Projects\ILSpy\ILSpy\TextView\DecompilerTextView.cs:line 534
   at ICSharpCode.ILSpy.TextView.DecompilerTextView.<>c__DisplayClass33_0.<DecompileAsync>b__0() in C:\Users\Siegfried\Projects\ILSpy\ILSpy\TextView\DecompilerTextView.cs:line 513
siegfriedpammer commented 6 years ago

This happens because the block container is empty, i.e., there is no entry-point... BlockContainer.EntryPoint is null...

spottedmahn commented 6 years ago

reference assembly

What is a reference assembly? I didn't know there we different types of assemblies... Googling "reference assembly" doesn't yield good results...

I tried reviewing Task.FromResult<TResult>(TResult) and I'm getting:

public static Task<TResult> FromResult<TResult>(TResult result)
{
    /*Error: Empty body found. Decompiled assembly might be a reference assembly.*/;
}

I'm trying to find the implementation of it...

riQQ commented 6 years ago

http://zuga.net/articles/dotnet-what-are-reference-assemblies/