diff --git a/analyzers/src/SonarAnalyzer.CSharp/SymbolicExecution/Roslyn/PublicMethodArgumentsShouldBeCheckedForNull.cs b/analyzers/src/SonarAnalyzer.CSharp/SymbolicExecution/Roslyn/PublicMethodArgumentsShouldBeCheckedForNull.cs index 1dd0045603b..5fad798f46c 100644 --- a/analyzers/src/SonarAnalyzer.CSharp/SymbolicExecution/Roslyn/PublicMethodArgumentsShouldBeCheckedForNull.cs +++ b/analyzers/src/SonarAnalyzer.CSharp/SymbolicExecution/Roslyn/PublicMethodArgumentsShouldBeCheckedForNull.cs @@ -30,16 +30,6 @@ public class PublicMethodArgumentsShouldBeCheckedForNull : SymbolicRuleCheck private const string DiagnosticId = "S3900"; private const string MessageFormat = "{0}"; - private static readonly OperationKind[] DereferenceOperations = new[] - { - OperationKindEx.Invocation, - OperationKindEx.FieldReference, - OperationKindEx.PropertyReference, - OperationKindEx.EventReference, - OperationKindEx.Await, - OperationKindEx.ArrayElementReference - }; - internal static readonly DiagnosticDescriptor S3900 = DescriptorFactory.Create(DiagnosticId, MessageFormat); protected override DiagnosticDescriptor Rule => S3900; @@ -101,8 +91,9 @@ bool NullableStateIsNotKnownForParameter(IParameterSymbol symbol) => context.State[symbol] is null || !context.State[symbol].HasConstraint(); } - private static IOperation NullDereferenceCandidate(IOperation operation) => - operation.Kind switch + private static IOperation NullDereferenceCandidate(IOperation operation) + { + var candidate = operation.Kind switch { OperationKindEx.Invocation => operation.ToInvocation().Instance, OperationKindEx.FieldReference => operation.ToFieldReference().Instance, @@ -113,6 +104,16 @@ private static IOperation NullDereferenceCandidate(IOperation operation) => _ => null, }; + return candidate?.Kind == OperationKindEx.Conversion + ? ConversionOperand(candidate) + : candidate; + } + + private static IOperation ConversionOperand(IOperation operation) => + operation.Kind == OperationKindEx.Conversion + ? ConversionOperand(operation.ToConversion().Operand) + : operation; + private sealed class ArgumentDereferenceWalker : SafeCSharpSyntaxWalker { private readonly ISet argumentNames;