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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions