Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Stack overflow when attribute is applied on it's own constructor and nullability is enabled #40136

Closed
addabis opened this issue Dec 4, 2019 · 5 comments

Comments

@addabis
Copy link

addabis commented Dec 4, 2019

Version Used:
3.4.0 (VS 16.4.0, .NET Core SDK 3.1.100)

Worked on 3.3.1 (VS 16.3.x, .NET Core SDK 3.0.101)

Steps to Reproduce:

Enabled nullability (either in MSBuild or using #nullable enable).

Use the following:

[AttributeUsage(AttributeTargets.All)]
[ExplicitCrossPackageInternal]
internal sealed class ExplicitCrossPackageInternalAttribute : Attribute
{
    // Just for fun.
    [ExplicitCrossPackageInternal]
    internal ExplicitCrossPackageInternalAttribute()
    {
    }
}

The comment is two years old.

Expected Behavior:

Not crashing.

Actual Behavior:

Process is terminated due to StackOverflowException.
@RikkiGibson
Copy link
Contributor

Here's a representative loop from the stack:

...
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.NullableWalker.VisitArguments(Microsoft.CodeAnalysis.CSharp.BoundExpression node, System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.CSharp.BoundExpression> arguments, System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.RefKind> refKindsOpt, System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.CSharp.Symbols.ParameterSymbol> parametersOpt, System.Collections.Immutable.ImmutableArray<int> argsToParamsOpt, bool expanded, bool invokedAsExtensionMethod, Microsoft.CodeAnalysis.CSharp.Symbols.MethodSymbol method) Line 3606	C#
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.NullableWalker.VisitArguments(Microsoft.CodeAnalysis.CSharp.BoundExpression node, System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.CSharp.BoundExpression> arguments, System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.RefKind> refKindsOpt, Microsoft.CodeAnalysis.CSharp.Symbols.MethodSymbol method, System.Collections.Immutable.ImmutableArray<int> argsToParamsOpt, bool expanded, bool invokedAsExtensionMethod) Line 3479	C#
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.NullableWalker.VisitAttribute(Microsoft.CodeAnalysis.CSharp.BoundAttribute node) Line 7822	C#
[External Code]	
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.NullableWalker.VisitExpressionWithoutStackGuard(Microsoft.CodeAnalysis.CSharp.BoundExpression node) Line 1685	C#
[External Code]	
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.AbstractFlowPass<Microsoft.CodeAnalysis.CSharp.NullableWalker.LocalState, Microsoft.CodeAnalysis.CSharp.NullableWalker.LocalFunctionState>.VisitAlways(Microsoft.CodeAnalysis.CSharp.BoundNode node) Line 340	C#
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.AbstractFlowPass<Microsoft.CodeAnalysis.CSharp.NullableWalker.LocalState, Microsoft.CodeAnalysis.CSharp.NullableWalker.LocalFunctionState>.Visit(Microsoft.CodeAnalysis.CSharp.BoundNode node) Line 315	C#
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.NullableWalker.Visit(Microsoft.CodeAnalysis.CSharp.BoundNode node, bool expressionIsRead) Line 1777	C#
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.NullableWalker.Visit(Microsoft.CodeAnalysis.CSharp.BoundNode node) Line 1763	C#
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.AbstractFlowPass<Microsoft.CodeAnalysis.CSharp.NullableWalker.LocalState, Microsoft.CodeAnalysis.CSharp.NullableWalker.LocalFunctionState>.Scan(ref bool badRegion) Line 400	C#
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.NullableWalker.Scan(ref bool badRegion) Line 443	C#
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.AbstractFlowPass<Microsoft.CodeAnalysis.CSharp.NullableWalker.LocalState, Microsoft.CodeAnalysis.CSharp.NullableWalker.LocalFunctionState>.Analyze(ref bool badRegion, Microsoft.CodeAnalysis.Optional<Microsoft.CodeAnalysis.CSharp.NullableWalker.LocalState> initialState) Line 423	C#
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.NullableWalker.Analyze(Microsoft.CodeAnalysis.CSharp.NullableWalker walker, Microsoft.CodeAnalysis.CSharp.Symbol symbol, Microsoft.CodeAnalysis.DiagnosticBag diagnostics, Microsoft.CodeAnalysis.CSharp.NullableWalker.VariableState initialState, Microsoft.CodeAnalysis.CSharp.NullableWalker.SnapshotManager.Builder snapshotBuilderOpt) Line 667	C#
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.NullableWalker.Analyze(Microsoft.CodeAnalysis.CSharp.CSharpCompilation compilation, Microsoft.CodeAnalysis.CSharp.Symbol symbol, Microsoft.CodeAnalysis.CSharp.BoundNode node, Microsoft.CodeAnalysis.CSharp.Binder binder, Microsoft.CodeAnalysis.CSharp.Conversions conversions, Microsoft.CodeAnalysis.DiagnosticBag diagnostics, bool useMethodSignatureParameterTypes, Microsoft.CodeAnalysis.CSharp.Symbols.MethodSymbol delegateInvokeMethodOpt, Microsoft.CodeAnalysis.CSharp.NullableWalker.VariableState initialState, System.Collections.Immutable.ImmutableDictionary<Microsoft.CodeAnalysis.CSharp.BoundExpression, (Microsoft.CodeAnalysis.NullabilityInfo, Microsoft.CodeAnalysis.CSharp.Symbols.TypeSymbol)>.Builder analyzedNullabilityMapOpt, Microsoft.CodeAnalysis.CSharp.NullableWalker.SnapshotManager.Builder snapshotBuilderOpt, Microsoft.CodeAnalysis.PooledObjects.ArrayBuilder<(Microsoft.CodeAnalysis.CSharp.BoundReturnStatement, Microsoft.CodeAnalysis.CSharp.Symbols.TypeWithAnnotations)> returnTypesOpt) Line 647	C#
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.NullableWalker.AnalyzeIfNeeded(Microsoft.CodeAnalysis.CSharp.Binder binder, Microsoft.CodeAnalysis.CSharp.BoundAttribute attribute, Microsoft.CodeAnalysis.DiagnosticBag diagnostics) Line 577	C#
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.Binder.GetAttribute(Microsoft.CodeAnalysis.CSharp.BoundAttribute boundAttribute, Microsoft.CodeAnalysis.DiagnosticBag diagnostics) Line 196	C#
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.Binder.GetAttribute(Microsoft.CodeAnalysis.CSharp.Syntax.AttributeSyntax node, Microsoft.CodeAnalysis.CSharp.Symbols.NamedTypeSymbol boundAttributeType, Microsoft.CodeAnalysis.DiagnosticBag diagnostics) Line 100	C#
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.Binder.GetAttributes(System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.CSharp.Binder> binders, System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.CSharp.Syntax.AttributeSyntax> attributesToBind, System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.CSharp.Symbols.NamedTypeSymbol> boundAttributeTypes, Microsoft.CodeAnalysis.CSharp.Symbols.CSharpAttributeData[] attributesBuilder, Microsoft.CodeAnalysis.DiagnosticBag diagnostics) Line 74	C#
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.Symbol.LoadAndValidateAttributes(Roslyn.Utilities.OneOrMany<Microsoft.CodeAnalysis.SyntaxList<Microsoft.CodeAnalysis.CSharp.Syntax.AttributeListSyntax>> attributesSyntaxLists, ref Microsoft.CodeAnalysis.CustomAttributesBag<Microsoft.CodeAnalysis.CSharp.Symbols.CSharpAttributeData> lazyCustomAttributesBag, Microsoft.CodeAnalysis.CSharp.Symbols.AttributeLocation symbolPart, bool earlyDecodingOnly, Microsoft.CodeAnalysis.CSharp.Binder binderOpt, System.Func<Microsoft.CodeAnalysis.CSharp.Syntax.AttributeSyntax, bool> attributeMatchesOpt) Line 317	C#
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.Symbols.SourceMemberMethodSymbol.GetAttributesBag(ref Microsoft.CodeAnalysis.CustomAttributesBag<Microsoft.CodeAnalysis.CSharp.Symbols.CSharpAttributeData> lazyCustomAttributesBag, bool forReturnType) Line 1041	C#
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.Symbols.SourceMemberMethodSymbol.GetAttributesBag() Line 999	C#
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.Symbols.SourceMemberMethodSymbol.GetDecodedWellKnownAttributeData() Line 962	C#
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.Symbols.SourceMemberMethodSymbol.FlowAnalysisAnnotations.get() Line 1262	C#
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.NullableWalker.VisitArguments(Microsoft.CodeAnalysis.CSharp.BoundExpression node, System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.CSharp.BoundExpression> arguments, System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.RefKind> refKindsOpt, System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.CSharp.Symbols.ParameterSymbol> parametersOpt, System.Collections.Immutable.ImmutableArray<int> argsToParamsOpt, bool expanded, bool invokedAsExtensionMethod, Microsoft.CodeAnalysis.CSharp.Symbols.MethodSymbol method) Line 3606	C#
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.NullableWalker.VisitArguments(Microsoft.CodeAnalysis.CSharp.BoundExpression node, System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.CSharp.BoundExpression> arguments, System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.RefKind> refKindsOpt, Microsoft.CodeAnalysis.CSharp.Symbols.MethodSymbol method, System.Collections.Immutable.ImmutableArray<int> argsToParamsOpt, bool expanded, bool invokedAsExtensionMethod) Line 3479	C#
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.NullableWalker.VisitAttribute(Microsoft.CodeAnalysis.CSharp.BoundAttribute node) Line 7822	C#

@jcouv
Copy link
Member

jcouv commented Dec 11, 2019

For some reason (maybe different compilation options?), the issue doesn't repro on sharplab.

@RikkiGibson RikkiGibson added this to the 16.4 milestone Dec 11, 2019
@RikkiGibson
Copy link
Contributor

The fix will be shipped in a 16.4 patch release. Thank you for reporting @addabis!

@addabis
Copy link
Author

addabis commented Dec 11, 2019

@RikkiGibson Thanks to you for fixing!

@addabis
Copy link
Author

addabis commented Dec 11, 2019

@jcouv If you add #nullable enable to the source code, it should do the job.

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

No branches or pull requests

3 participants