Skip to content

System.ArgumentOutOfRangeException: Index was out of range. (nested deconstruction causing crashes) #3803

Description

@NoahBPeterson

Steps to reproduce

  1. ilspycmd -t Microsoft.CodeAnalysis.LanguageServer.LspWorkspaceManager Microsoft.CodeAnalysis.LanguageServer.Protocol.dll, OR
  2. ilspycmd -t CForEach M.dll OR
  3. ilspycmd -t CAssign M.dll

Error message shown

ilspycmd -t Microsoft.CodeAnalysis.LanguageServer.LspWorkspaceManager \                                                                                                                  ✔ 
    "/Users/noahpeterson/.vscode/extensions2/ms-dotnettools.csharp-2.120.3-darwin-arm64/.roslyn/Microsoft.CodeAnalysis.LanguageServer.Protocol.dll"
Error decompiling @06000E51 Microsoft.CodeAnalysis.LanguageServer.LspWorkspaceManager.GetLspSolutionsAsync
in assembly "/Users/noahpeterson/.vscode/extensions2/ms-dotnettools.csharp-2.120.3-darwin-arm64/.roslyn/Microsoft.CodeAnalysis.LanguageServer.Protocol.dll"
 ---> System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection. (Parameter 'index')
   at System.ThrowHelper.ThrowArgumentOutOfRange_IndexMustBeLessException() in offset 0
   at System.Collections.Generic.List`1.get_Item(Int32 index) in offset 9
   at ICSharpCode.Decompiler.IL.InstructionCollection`1.get_Item(Int32 index) in InstructionCollection.cs:line 46
   at ICSharpCode.Decompiler.CSharp.StatementBuilder.<TranslateDeconstructionDesignation>g__ConstructDesignation|43_0(MatchInstruction matchInstruction, <>c__DisplayClass43_0&) in StatementBuilder.cs:line 824
   at ICSharpCode.Decompiler.CSharp.StatementBuilder.TranslateDeconstructionDesignation(DeconstructInstruction inst, Boolean isForeach) in StatementBuilder.cs:line 812
   at ICSharpCode.Decompiler.CSharp.StatementBuilder.TransformToForeach(UsingInstruction inst, Expression resource) in StatementBuilder.cs:line 742
   at ICSharpCode.Decompiler.CSharp.StatementBuilder.VisitUsingInstruction(UsingInstruction inst) in StatementBuilder.cs:line 530
   at ICSharpCode.Decompiler.IL.UsingInstruction.AcceptVisitor[T](ILVisitor`1 visitor) in Instructions.cs:line 2076
   at ICSharpCode.Decompiler.CSharp.StatementBuilder.Convert(ILInstruction inst) in StatementBuilder.cs:line 79
   at ICSharpCode.Decompiler.CSharp.StatementBuilder.ConvertBlockContainer(BlockStatement blockStatement, BlockContainer container, IEnumerable`1 blocks, Boolean isLoop) in StatementBuilder.cs:line 1450
   at ICSharpCode.Decompiler.CSharp.StatementBuilder.ConvertBlockContainer(BlockContainer container, Boolean isLoop) in StatementBuilder.cs:line 1344
   at ICSharpCode.Decompiler.CSharp.StatementBuilder.VisitBlockContainer(BlockContainer container) in StatementBuilder.cs:line 1230
   at ICSharpCode.Decompiler.IL.BlockContainer.AcceptVisitor[T](ILVisitor`1 visitor) in Instructions.cs:line 854
   at ICSharpCode.Decompiler.CSharp.StatementBuilder.Convert(ILInstruction inst) in StatementBuilder.cs:line 79
   at ICSharpCode.Decompiler.CSharp.StatementBuilder.ConvertAsBlock(ILInstruction inst) in StatementBuilder.cs:line 84
   at ICSharpCode.Decompiler.CSharp.StatementBuilder.<DeclareLocalFunctions>g__TranslateFunction|61_0(ILFunction function) in StatementBuilder.cs:line 1410
   at ICSharpCode.Decompiler.CSharp.StatementBuilder.DeclareLocalFunctions(ILFunction currentFunction, BlockContainer container, BlockStatement blockStatement) in StatementBuilder.cs:line 1381
   at ICSharpCode.Decompiler.CSharp.StatementBuilder.ConvertBlockContainer(BlockContainer container, Boolean isLoop) in StatementBuilder.cs:line 1345
   at ICSharpCode.Decompiler.CSharp.StatementBuilder.VisitBlockContainer(BlockContainer container) in StatementBuilder.cs:line 1230
   at ICSharpCode.Decompiler.IL.BlockContainer.AcceptVisitor[T](ILVisitor`1 visitor) in Instructions.cs:line 854
   at ICSharpCode.Decompiler.CSharp.StatementBuilder.Convert(ILInstruction inst) in StatementBuilder.cs:line 79
   at ICSharpCode.Decompiler.CSharp.StatementBuilder.ConvertAsBlock(ILInstruction inst) in StatementBuilder.cs:line 84
   at ICSharpCode.Decompiler.CSharp.CSharpDecompiler.DecompileBody(IMethod method, EntityDeclaration entityDecl, DecompileRun decompileRun, ITypeResolveContext decompilationContext, ExtensionInfo extensionInfo) in CSharpDecompiler.cs:line 2098
-- continuing with outer exception (ICSharpCode.Decompiler.DecompilerException) --
   at ICSharpCode.Decompiler.CSharp.CSharpDecompiler.DecompileBody(IMethod method, EntityDeclaration entityDecl, DecompileRun decompileRun, ITypeResolveContext decompilationContext, ExtensionInfo extensionInfo) in CSharpDecompiler.cs:line 2113
   at ICSharpCode.Decompiler.CSharp.CSharpDecompiler.DoDecompile(IMethod method, DecompileRun decompileRun, ITypeResolveContext decompilationContext, ExtensionInfo extensionInfo) in CSharpDecompiler.cs:line 1953
   at ICSharpCode.Decompiler.CSharp.CSharpDecompiler.<DoDecompile>g__DoDecompileMember|76_0(IEntity entity, RecordDecompiler recordDecompiler, PartialTypeInfo partialType, ExtensionInfo extensionInfo, <>c__DisplayClass76_0&) in CSharpDecompiler.cs:line 1789
   at ICSharpCode.Decompiler.CSharp.CSharpDecompiler.DoDecompile(ITypeDefinition typeDef, DecompileRun decompileRun, ITypeResolveContext decompilationContext, Boolean asExtension) in CSharpDecompiler.cs:line 1641
   at ICSharpCode.Decompiler.CSharp.CSharpDecompiler.DoDecompileTypes(IEnumerable`1 types, DecompileRun decompileRun, ITypeResolveContext decompilationContext, SyntaxTree syntaxTree) in CSharpDecompiler.cs:line 805
   at ICSharpCode.Decompiler.CSharp.CSharpDecompiler.DecompileType(FullTypeName fullTypeName) in CSharpDecompiler.cs:line 1195
   at ICSharpCode.Decompiler.CSharp.CSharpDecompiler.DecompileTypeAsString(FullTypeName fullTypeName) in CSharpDecompiler.cs:line 1208
   at ICSharpCode.ILSpyCmd.ILSpyCmdProgram.Decompile(String assemblyFileName, TextWriter output, String typeName) in IlspyCmdProgram.cs:line 595
   at ICSharpCode.ILSpyCmd.ILSpyCmdProgram.<OnExecuteAsync>g__PerformPerFileAction|99_0(String fileName, <>c__DisplayClass99_0&, <>c__DisplayClass99_1&) in IlspyCmdProgram.cs:line 351
   at ICSharpCode.ILSpyCmd.ILSpyCmdProgram.<OnExecuteAsync>d__99.MoveNext() in IlspyCmdProgram.cs:line 258

Details

  • Product in use: ilspycmd
  • Version in use: ilspycmd: 11.0.0.0, ICSharpCode.Decompiler: 11.0.0.0
  • Any other relevant information to the issue, or your interest in contributing a fix.

Minimum viable reproduction:

M.cs

  using System.Collections.Generic;

  struct Inner { public void Deconstruct(out int a, out int b) { a = 0; b = 0; } }
  struct Outer { public void Deconstruct(out int x, out Inner inner) { x = 0; inner = default; } }

  class CForEach   // -> crashes ConstructDesignation (StatementBuilder.cs:824)
  {
      public int M(IEnumerable<Outer> items)
      {
          int n = 0;
          foreach (var (x, (a, b)) in items) n += x + a + b;
          return n;
      }
  }

  class CAssign    // -> crashes ConstructTuple (ExpressionBuilder.cs:4747)
  {
      public int M(Outer o)
      {
          var (x, (a, b)) = o;
          return x + a + b;
      }
  }

M.csproj: net8.0, <Optimize>true</Optimize>, OutputType=Library.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions