From 1d1760abf530f0eb27819d3fb9f96a01c755264e Mon Sep 17 00:00:00 2001 From: Tim Pohlmann Date: Fri, 24 Mar 2023 13:41:51 +0100 Subject: [PATCH] Fix S3655 FN: VB assignments (#6976) --- .../Roslyn/EmptyNullableValueAccess.cs | 3 +++ .../Roslyn/EmptyNullableValueAccess.vb | 26 +++++++++++-------- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/analyzers/src/SonarAnalyzer.VisualBasic/SymbolicExecution/Roslyn/EmptyNullableValueAccess.cs b/analyzers/src/SonarAnalyzer.VisualBasic/SymbolicExecution/Roslyn/EmptyNullableValueAccess.cs index 51a41ae0db3..2abc18ac394 100644 --- a/analyzers/src/SonarAnalyzer.VisualBasic/SymbolicExecution/Roslyn/EmptyNullableValueAccess.cs +++ b/analyzers/src/SonarAnalyzer.VisualBasic/SymbolicExecution/Roslyn/EmptyNullableValueAccess.cs @@ -76,5 +76,8 @@ public override void VisitInvocationExpression(InvocationExpressionSyntax node) base.VisitInvocationExpression(node); } } + + public override void VisitAssignmentStatement(AssignmentStatementSyntax node) => + HasPotentialNullableValueAccess = true; } } diff --git a/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/EmptyNullableValueAccess.vb b/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/EmptyNullableValueAccess.vb index d077a9dcc83..762f59c1f82 100644 --- a/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/EmptyNullableValueAccess.vb +++ b/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/EmptyNullableValueAccess.vb @@ -136,11 +136,11 @@ Class NullableOfCustomTypes nullable = New Nullable(Of AStruct)() x = nullable.Value ' Noncompliant - x = (New Nullable(Of AStruct)()).Value ' FIXME Non-compliant - x = (CTypeDynamic(Of AStruct?)(Nothing)).Value ' FIXME Non-compliant + x = (New Nullable(Of AStruct)()).Value ' FN + x = (CTypeDynamic(Of AStruct?)(Nothing)).Value ' FN nullable = Nothing - x = (CType(nullable, AStruct?)).Value ' FIXME Non-compliant + x = (CType(nullable, AStruct?)).Value ' FN x = (CTypeDynamic(Of AStruct?)(nullable)).Value ' Compliant, when reached .Value above implies nullable is not null x = (CType((CTypeDynamic(Of AStruct?)(nullable)), AStruct?)).Value ' Compliant, same as above End Sub @@ -507,7 +507,11 @@ Class Assignments Sub Assignment(nullable As Integer?) Dim x As Integer = nullable ' Compliant nullable = Nothing - Dim y As Integer = nullable ' FIXME Non-compliant + Dim y As Integer = nullable ' Noncompliant + End Sub + Sub Assignment2() + Dim nullable As Integer? = Nothing + Dim x As Integer = nullable ' FN End Sub End Class @@ -542,13 +546,13 @@ Class Casts End Sub Sub UpcastWithNull() - Dim x = (CType(Nothing, Integer?)).Value ' FIXME Non-compliant + Dim x = (CType(Nothing, Integer?)).Value ' FN End Sub Sub UpcastWithReassignment(i As Integer?) - Dim x = (CType(Nothing, Integer?)).Value ' FIXME Non-compliant + Dim x = (CType(Nothing, Integer?)).Value ' FN i = Nothing - x = (CType(i, Integer?)).Value ' FIXME Non-compliant + x = (CType(i, Integer?)).Value ' FN End Sub Sub UpcastWithNonNullLiteral(i As Integer?) @@ -556,15 +560,15 @@ Class Casts End Sub Sub CTypeDynamicAndUnreachability(i As Integer?) - Dim x = (CTypeDynamic(Of Integer?)(Nothing)).Value ' FIXME Non-compliant + Dim x = (CTypeDynamic(Of Integer?)(Nothing)).Value ' FN i = Nothing - x = (CTypeDynamic(Of Integer?)(i)).Value ' FIXME Non-compliant + x = (CTypeDynamic(Of Integer?)(i)).Value ' FN End Sub Sub CTypeDynamicWithUnknownAndReassignment(i As Integer?) Dim x = (CTypeDynamic(Of Integer?)(i)).Value ' Compliant i = Nothing - x = (CTypeDynamic(Of Integer?)(i)).Value ' FIXME Non-compliant + x = (CTypeDynamic(Of Integer?)(i)).Value ' FN End Sub Sub CTypeDynamicWithNonNullLiteral(i As Integer?) @@ -576,7 +580,7 @@ Class WithAliases Private Sub Basics(ByVal i As MaybeInt) Dim x = i.Value i = Nothing - x = (CTypeDynamic(Of Integer?)(i)).Value ' FIXME Non-compliant + x = (CTypeDynamic(Of Integer?)(i)).Value ' FN End Sub End Class