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

NullabilityInfoContext returns incorrect result for parameter of private constructor in a public-only assembly #63853

Closed
madelson opened this issue Jan 17, 2022 · 1 comment · Fixed by #64143

Comments

@madelson
Copy link
Contributor

Description

See reproduction.

Reproduction Steps

        var context = new NullabilityInfoContext();
        // private IndexOutOfRangeException(SerializationInfo info, StreamingContext context)
        var constructor = typeof(IndexOutOfRangeException)
            .GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, new[] { typeof(SerializationInfo), typeof(StreamingContext) })!;
        var info = context.Create(constructor.GetParameters()[0]);
        Console.WriteLine(info.WriteState); // Nullable (should be Unknown)

        // printout includes System.Runtime.CompilerServices.NullablePublicOnlyAttribute
        Console.WriteLine(string.Join(", ", typeof(IndexOutOfRangeException).Module.GetCustomAttributes().Select(a => a.GetType())));

Expected behavior

Because of the NullablePublicOnlyAttribute, the parameter nullability for the reference type parameter on the private constructor should be Unknown.

Actual behavior

Returns Nullable.

Regression?

No response

Known Workarounds

No response

Configuration

VS 17.0.2, .NET 6, Windows 10 x64.

I don't have any reason to believe this is configuration specific.

Other information

I think the problem is this line in NullabilityInfoContext:

if (parameterInfo.Member is MethodInfo method && IsPrivateOrInternalMethodAndAnnotationDisabled(method))

Because ConstructorInfo is MethodBase but not MethodInfo, this check misses.

CC @Shane32

@dotnet-issue-labeler dotnet-issue-labeler bot added area-System.Reflection untriaged New issue has not been triaged by the area owner labels Jan 17, 2022
@ghost
Copy link

ghost commented Jan 17, 2022

Tagging subscribers to this area: @dotnet/area-system-reflection
See info in area-owners.md if you want to be subscribed.

Issue Details

Description

See reproduction.

Reproduction Steps

        var context = new NullabilityInfoContext();
        // private IndexOutOfRangeException(SerializationInfo info, StreamingContext context)
        var constructor = typeof(IndexOutOfRangeException)
            .GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, new[] { typeof(SerializationInfo), typeof(StreamingContext) })!;
        var info = context.Create(constructor.GetParameters()[0]);
        Console.WriteLine(info.WriteState); // Nullable (should be Unknown)

        // printout includes System.Runtime.CompilerServices.NullablePublicOnlyAttribute
        Console.WriteLine(string.Join(", ", typeof(IndexOutOfRangeException).Module.GetCustomAttributes().Select(a => a.GetType())));

Expected behavior

Because of the NullablePublicOnlyAttribute, the parameter nullability for the reference type parameter on the private constructor should be Unknown.

Actual behavior

Returns Nullable.

Regression?

No response

Known Workarounds

No response

Configuration

VS 17.0.2, .NET 6, Windows 10 x64.

I don't have any reason to believe this is configuration specific.

Other information

I think the problem is this line in NullabilityInfoContext:

if (parameterInfo.Member is MethodInfo method && IsPrivateOrInternalMethodAndAnnotationDisabled(method))

Because ConstructorInfo is MethodBase but not MethodInfo, this check misses.

CC @Shane32

Author: madelson
Assignees: -
Labels:

area-System.Reflection, untriaged

Milestone: -

@buyaa-n buyaa-n removed the untriaged New issue has not been triaged by the area owner label Jan 19, 2022
@buyaa-n buyaa-n added this to the 7.0.0 milestone Jan 19, 2022
madelson added a commit to madelson/runtime that referenced this issue Jan 22, 2022
In several cases, NullabilityInfoContext would return values which were
out of sync with the C# compiler's interpretation of the nullability
metadata. This fixes the following cases:
* The `NullablePublicOnly` attribute was not considered when analyzing
private constructor parameters.
* CodeAnalysis attributes on indexer properties were not recognized.
* CodeAnalysis attributes were not recognized in a `#nullable disabled`
context.
* Private value-typed members lacking nullable annotations were not
properly marked as nullable/notnull.
* Mixing CodeAnalysis attributes with opposite meanings (e. g.
`AllowNull` and `DisallowNull` produced the wrong result.
* Analysis of members inherited from generic base types did not
incorporate the nullable metadata associated with the inheritance.

Fix dotnet#63555
Fix dotnet#63846
Fix dotnet#63847
Fix dotnet#63848
Fix dotnet#63849
Fix dotnet#63853
@ghost ghost added the in-pr There is an active PR which will close this issue when it is merged label Jan 22, 2022
@ghost ghost removed the in-pr There is an active PR which will close this issue when it is merged label Jan 26, 2022
@ghost ghost locked as resolved and limited conversation to collaborators Feb 26, 2022
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants