dotnet / roslyn

The Roslyn .NET compiler provides C# and Visual Basic languages with rich code analysis APIs.
https://docs.microsoft.com/dotnet/csharp/roslyn-sdk/
MIT License
18.9k stars 4.01k forks source link

Crash in BindImports when used from lsif generator. #51460

Open CyrusNajmabadi opened 3 years ago

CyrusNajmabadi commented 3 years ago

Running the lsifgenerator on Roslyn.sln itself produces this crash:

Unhandled exception: System.NullReferenceException: Object reference not set to an instance of an object.
   at Microsoft.CodeAnalysis.VisualBasic.Symbols.SourceModuleSymbol.BindImports(CancellationToken cancellationToken) in C:\github\roslyn\src\Compilers\VisualBasic\Portable\Symbols\Source\SourceModuleSymbol.vb:line 377
   at Microsoft.CodeAnalysis.VisualBasic.Symbols.SourceModuleSymbol.EnsureImportsAreBound(CancellationToken cancellationToken) in C:\github\roslyn\src\Compilers\VisualBasic\Portable\Symbols\Source\SourceModuleSymbol.vb:line 353
   at Microsoft.CodeAnalysis.VisualBasic.BinderBuilder.CreateBinderForSourceFile(SourceModuleSymbol moduleSymbol, SyntaxTree tree) in C:\github\roslyn\src\Compilers\VisualBasic\Portable\Binding\BinderBuilder.vb:line 90
   at Microsoft.CodeAnalysis.VisualBasic.BinderBuilder.CreateBinderForNamespace(SourceModuleSymbol moduleSymbol, SyntaxTree tree, NamespaceSymbol nsSymbol) in C:\github\roslyn\src\Compilers\VisualBasic\Portable\Binding\BinderBuilder.vb:line 180
   at Microsoft.CodeAnalysis.VisualBasic.Symbol.GetAttributeBinder(SyntaxList`1 syntaxList, SourceModuleSymbol sourceModule) in C:\github\roslyn\src\Compilers\VisualBasic\Portable\Symbols\Symbol_Attributes.vb:line 355
   at Microsoft.CodeAnalysis.VisualBasic.Symbol.GetAttributesToBind(OneOrMany`1 attributeDeclarationSyntaxLists, AttributeLocation symbolPart, VisualBasicCompilation compilation, ImmutableArray`1& binders) in C:\github\roslyn\src\Compilers\VisualBasic\Portable\Symbols\Symbol_Attributes.vb:line 327
   at Microsoft.CodeAnalysis.VisualBasic.Symbol.LoadAndValidateAttributes(OneOrMany`1 attributeBlockSyntaxList, CustomAttributesBag`1& lazyCustomAttributesBag, AttributeLocation symbolPart) in C:\github\roslyn\src\Compilers\VisualBasic\Portable\Symbols\Symbol_Attributes.vb:line 248
   at Microsoft.CodeAnalysis.VisualBasic.Symbols.SourceAssemblySymbol.EnsureAttributesAreBound() in C:\github\roslyn\src\Compilers\VisualBasic\Portable\Symbols\Source\SourceAssemblySymbol.vb:line 798
   at Microsoft.CodeAnalysis.VisualBasic.Symbols.SourceAssemblySymbol.get_IsDelaySigned() in C:\github\roslyn\src\Compilers\VisualBasic\Portable\Symbols\Source\SourceAssemblySymbol.vb:line 1374
   at Microsoft.CodeAnalysis.Compilation.get_HasStrongName() in C:\github\roslyn\src\Compilers\Core\Portable\Compilation\Compilation.cs:line 2108
   at Microsoft.CodeAnalysis.Compilation.ConstructModuleSerializationProperties(EmitOptions emitOptions, String targetRuntimeVersion, Guid moduleVersionId) in C:\github\roslyn\src\Compilers\Core\Portable\Compilation\Compilation.cs:line 1967
   at Microsoft.CodeAnalysis.VisualBasic.VisualBasicCompilation.CreateModuleBuilder(EmitOptions emitOptions, IMethodSymbol debugEntryPoint, Stream sourceLinkStream, IEnumerable`1 embeddedTexts, IEnumerable`1 manifestResources, CompilationTestData testData, DiagnosticBag diagnostics, ImmutableArray`1 additionalTypes, CancellationToken cancellationToken) in C:\github\roslyn\src\Compilers\VisualBasic\Portable\Compilation\VisualBasicCompilation.vb:line 2378
   at Microsoft.CodeAnalysis.VisualBasic.VisualBasicCompilation.CreateModuleBuilder(EmitOptions emitOptions, IMethodSymbol debugEntryPoint, Stream sourceLinkStream, IEnumerable`1 embeddedTexts, IEnumerable`1 manifestResources, CompilationTestData testData, DiagnosticBag diagnostics, CancellationToken cancellationToken) in C:\github\roslyn\src\Compilers\VisualBasic\Portable\Compilation\VisualBasicCompilation.vb:line 2348
   at Microsoft.CodeAnalysis.Compilation.CheckOptionsAndCreateModuleBuilder(DiagnosticBag diagnostics, IEnumerable`1 manifestResources, EmitOptions options, IMethodSymbol debugEntryPoint, Stream sourceLinkStream, IEnumerable`1 embeddedTexts, CompilationTestData testData, CancellationToken cancellationToken) in C:\github\roslyn\src\Compilers\Core\Portable\Compilation\Compilation.cs:line 2824
   at Microsoft.CodeAnalysis.Compilation.Emit(Stream peStream, Stream metadataPEStream, Stream pdbStream, Stream xmlDocumentationStream, Stream win32Resources, IEnumerable`1 manifestResources, EmitOptions options, IMethodSymbol debugEntryPoint, Stream sourceLinkStream, IEnumerable`1 embeddedTexts, Nullable`1 pdbOptionsBlobReader, CompilationTestData testData, CancellationToken cancellationToken) in C:\github\roslyn\src\Compilers\Core\Portable\Compilation\Compilation.cs:line 2613
   at Microsoft.CodeAnalysis.Compilation.Emit(Stream peStream, Stream pdbStream, Stream xmlDocumentationStream, Stream win32Resources, IEnumerable`1 manifestResources, EmitOptions options, IMethodSymbol debugEntryPoint, Stream sourceLinkStream, IEnumerable`1 embeddedTexts, Stream metadataPEStream, Nullable`1 pdbOptionsBlobReader, CancellationToken cancellationToken) in C:\github\roslyn\src\Compilers\Core\Portable\Compilation\Compilation.cs:line 2570
   at Microsoft.CodeAnalysis.MetadataOnlyImage.Create(Workspace workspace, ITemporaryStorageService service, Compilation compilation, CancellationToken cancellationToken) in C:\github\roslyn\src\Workspaces\Core\Portable\Workspace\Solution\MetadataOnlyImage.cs:line 48
   at Microsoft.CodeAnalysis.MetadataOnlyReference.GetOrBuildReference(SolutionState solution, ProjectReference projectReference, Compilation finalCompilation, VersionStamp version, CancellationToken cancellationToken) in C:\github\roslyn\src\Workspaces\Core\Portable\Workspace\Solution\MetadataOnlyReference.cs:line 92
   at Microsoft.CodeAnalysis.SolutionState.CompilationTracker.<GetMetadataOnlyImageReferenceAsync>d__35.MoveNext() in C:\github\roslyn\src\Workspaces\Core\Portable\Workspace\Solution\SolutionState.CompilationTracker.cs:line 983
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.CodeAnalysis.SolutionState.CompilationTracker.<GetMetadataReferenceAsync>d__33.MoveNext() in C:\github\roslyn\src\Workspaces\Core\Portable\Workspace\Solution\SolutionState.CompilationTracker.cs:line 927
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at Microsoft.CodeAnalysis.SolutionState.CompilationTracker.<FinalizeCompilationAsync>d__31.MoveNext() in C:\github\roslyn\src\Workspaces\Core\Portable\Workspace\Solution\SolutionState.CompilationTracker.cs:line 771
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.CodeAnalysis.SolutionState.CompilationTracker.<BuildCompilationInfoFromScratchAsync>d__25.MoveNext() in C:\github\roslyn\src\Workspaces\Core\Portable\Workspace\Solution\SolutionState.CompilationTracker.cs:line 614
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.CodeAnalysis.SolutionState.CompilationTracker.<GetOrBuildCompilationInfoAsync>d__23.MoveNext() in C:\github\roslyn\src\Workspaces\Core\Portable\Workspace\Solution\SolutionState.CompilationTracker.cs:line 537
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.CodeAnalysis.SolutionState.CompilationTracker.<GetCompilationSlowAsync>d__21.MoveNext() in C:\github\roslyn\src\Workspaces\Core\Portable\Workspace\Solution\SolutionState.CompilationTracker.cs:line 453
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.CodeAnalysis.SolutionState.CompilationTracker.<GetMetadataReferenceAsync>d__33.MoveNext() in C:\github\roslyn\src\Workspaces\Core\Portable\Workspace\Solution\SolutionState.CompilationTracker.cs:line 921
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at Microsoft.CodeAnalysis.SolutionState.CompilationTracker.<FinalizeCompilationAsync>d__31.MoveNext() in C:\github\roslyn\src\Workspaces\Core\Portable\Workspace\Solution\SolutionState.CompilationTracker.cs:line 771
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.CodeAnalysis.SolutionState.CompilationTracker.<BuildCompilationInfoFromScratchAsync>d__25.MoveNext() in C:\github\roslyn\src\Workspaces\Core\Portable\Workspace\Solution\SolutionState.CompilationTracker.cs:line 614
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.CodeAnalysis.SolutionState.CompilationTracker.<GetOrBuildCompilationInfoAsync>d__23.MoveNext() in C:\github\roslyn\src\Workspaces\Core\Portable\Workspace\Solution\SolutionState.CompilationTracker.cs:line 537
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.CodeAnalysis.SolutionState.CompilationTracker.<GetCompilationSlowAsync>d__21.MoveNext() in C:\github\roslyn\src\Workspaces\Core\Portable\Workspace\Solution\SolutionState.CompilationTracker.cs:line 453
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.CodeAnalysis.SolutionState.CompilationTracker.<GetMetadataReferenceAsync>d__33.MoveNext() in C:\github\roslyn\src\Workspaces\Core\Portable\Workspace\Solution\SolutionState.CompilationTracker.cs:line 921
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at Microsoft.CodeAnalysis.SolutionState.CompilationTracker.<FinalizeCompilationAsync>d__31.MoveNext() in C:\github\roslyn\src\Workspaces\Core\Portable\Workspace\Solution\SolutionState.CompilationTracker.cs:line 771
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.CodeAnalysis.SolutionState.CompilationTracker.<BuildCompilationInfoFromScratchAsync>d__25.MoveNext() in C:\github\roslyn\src\Workspaces\Core\Portable\Workspace\Solution\SolutionState.CompilationTracker.cs:line 614
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.CodeAnalysis.SolutionState.CompilationTracker.<GetOrBuildCompilationInfoAsync>d__23.MoveNext() in C:\github\roslyn\src\Workspaces\Core\Portable\Workspace\Solution\SolutionState.CompilationTracker.cs:line 537
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.CodeAnalysis.SolutionState.CompilationTracker.<GetCompilationSlowAsync>d__21.MoveNext() in C:\github\roslyn\src\Workspaces\Core\Portable\Workspace\Solution\SolutionState.CompilationTracker.cs:line 453
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at Microsoft.CodeAnalysis.LanguageServerIndexFormat.Generator.Program.<GenerateWithMSBuildLocatedAsync>d__5.MoveNext() in C:\github\roslyn\src\Features\Lsif\Generator\Program.cs:line 149
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.CodeAnalysis.LanguageServerIndexFormat.Generator.Program.<GenerateFromSolutionAsync>d__4.MoveNext() in C:\github\roslyn\src\Features\Lsif\Generator\Program.cs:line 117
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.CodeAnalysis.LanguageServerIndexFormat.Generator.Program.<GenerateAsync>d__1.MoveNext() in C:\github\roslyn\src\Features\Lsif\Generator\Program.cs:line 58****

To run the lsifgenerator you can run:

C:\github\roslyn\artifacts\bin\Microsoft.CodeAnalysis.LanguageServerIndexFormat.Generator\Release\net472\Microsoft.CodeAnalysis.LanguageServerIndexFormat.Generator.exe --solution .\Roslyn.sln --log c:\temp\log.txt --output c:\temp\lsif.json

Workign to see if i can get a dump now.

CyrusNajmabadi commented 3 years ago

Very weird. The crash is on this line (According to the debugger in release mode):

                    diagBagForThisImport.Clear()
 -->                Dim data = New ModuleImportData(globalImport, membersMap, aliasesMap, membersBuilder, membersInfoBuilder, aliasesBuilder, aliasesInfoBuilder, xmlNamespaces, diagBagForThisImport.DependenciesBag)
                    Dim binder As Binder = BinderBuilder.CreateBinderForProjectImports(Me, VisualBasicSyntaxTree.Dummy)

However, tehre aren't any derefs on that line that are null. diagBagForThisImport shows in the debugger as non-null.

CyrusNajmabadi commented 3 years ago

Ah, it's a debugger issue, the line in questino is:

                    binder.BindImportClause(globalImport.Clause, data, diagBagForThisImport.DiagnosticBag)

globalImport is null here. So taht seems like an issue that likely happened earlier, but wasn't caught until now.

CyrusNajmabadi commented 3 years ago

Looks like we're failling to parse these global imports: Microsoft.VisualBasic,System,System.Collections,System.Collections.Generic,System.Diagnostics,System.Linq,IdentifierComparison = Microsoft.CodeAnalysis.CaseInsensitiveComparison,Roslyn.Utilities,Microsoft.VisualBasic,System,System.Collections,System.Collections.Generic,System.Diagnostics,System.Linq,System.Xml.Linq,System.Threading.Tasks investigating further.

CyrusNajmabadi commented 3 years ago

Compiler does produce this diagnostic, which it puts into its diag bag,

error BC30205: Error in project-level import 'Microsoft.VisualBasic,System,System.Collections,System.Collections.Generic,System.Diagnostics,System.Linq,IdentifierComparison = Microsoft.CodeAnalysis.CaseInsensitiveComparison,Roslyn.Utilities,Microsoft.VisualBasic,System,System.Collections,System.Collections.Generic,System.Diagnostics,System.Linq,System.Xml.Linq,System.Threading.Tasks' at 'System' : End of statement expected

However, it then crashes moments later so it can't be seen. Looks like VisualBasicOptions needs to be hardened to this so we can avoid the crash later on.