From 14f5c7e2d61601eeb2feeb521577e0b8bb53ea70 Mon Sep 17 00:00:00 2001 From: Zsolt Kolbay Date: Mon, 11 Dec 2023 22:27:35 +0100 Subject: [PATCH] Update UTs --- .../ConditionEvaluatesToConstant.CSharp10.cs | 32 ++++++++ .../ConditionEvaluatesToConstant.CSharp7.cs | 4 +- .../ConditionEvaluatesToConstant.CSharp8.cs | 4 +- .../ConditionEvaluatesToConstant.CSharp9.cs | 4 +- .../Roslyn/ConditionEvaluatesToConstant.cs | 77 +++++++++++++++---- ...llectionsShouldNotBeEnumerated.CSharp10.cs | 4 +- .../EmptyNullableValueAccess.CSharp10.cs | 2 +- .../Roslyn/EmptyNullableValueAccess.cs | 16 ++-- ...hesShouldHaveUnpredictableSalt.CSharp10.cs | 2 +- ...ializationVectorShouldBeRandom.CSharp10.cs | 2 +- .../Roslyn/NullPointerDereference.CSharp10.cs | 5 +- .../ObjectsShouldNotBeDisposedMoreThanOnce.cs | 2 +- 12 files changed, 118 insertions(+), 36 deletions(-) diff --git a/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/ConditionEvaluatesToConstant.CSharp10.cs b/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/ConditionEvaluatesToConstant.CSharp10.cs index ee7913755f9..067c4afdf84 100644 --- a/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/ConditionEvaluatesToConstant.CSharp10.cs +++ b/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/ConditionEvaluatesToConstant.CSharp10.cs @@ -26,3 +26,35 @@ public static void DoSomething() else if (myStruct.y) { } // FN } } + +// https://github.com/SonarSource/sonar-dotnet/issues/7057 +public class Repro_7057 +{ + private (string, int) SomeTuple() => ("hello", 1); + private string SomeString() => "hello"; + + public void WithTuple() + { + string text1 = null; + (text1, var (text2, _)) = (SomeString(), SomeTuple()); + if (text1 == null) // Compliant + { + Console.WriteLine(); + } + if (text2 == null) // Compliant + { + Console.WriteLine(); + } + + string text3 = null; + ((text3, _), var (text4, _)) = ((null, 42), ("hello", 42)); + if (text3 == null) // Noncompliant + { + Console.WriteLine(); + } + if (text4 == null) // Noncompliant + { + Console.WriteLine(); // Secondary + } + } +} diff --git a/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/ConditionEvaluatesToConstant.CSharp7.cs b/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/ConditionEvaluatesToConstant.CSharp7.cs index f13b139fdaa..fa347eef33e 100644 --- a/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/ConditionEvaluatesToConstant.CSharp7.cs +++ b/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/ConditionEvaluatesToConstant.CSharp7.cs @@ -294,7 +294,7 @@ public void GoGoGo() { var tmp = 0; var flag = true; - while (flag) // Noncompliant + while (flag) // Compliant { (flag, tmp) = (false, 5); } @@ -329,7 +329,7 @@ public void MutedNull() { var tmp = 0; var flag = "x"; - while (flag != null) // Noncompliant + while (flag != null) // Compliant { (flag, tmp) = (null, 5); } diff --git a/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/ConditionEvaluatesToConstant.CSharp8.cs b/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/ConditionEvaluatesToConstant.CSharp8.cs index 8d517adfd6f..570f6e77c3a 100644 --- a/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/ConditionEvaluatesToConstant.CSharp8.cs +++ b/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/ConditionEvaluatesToConstant.CSharp8.cs @@ -133,8 +133,8 @@ public void ParenthesizedVariableDesignation_Nested(object arg) public void NestedDeconstructionAssignment() { var (a, (b, _)) = (true, (true, true)); - if (a) { } // FN - if (b) { } // FN + if (a) { } // Noncompliant + if (b) { } // Noncompliant } int UsingDeclaration_Null() diff --git a/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/ConditionEvaluatesToConstant.CSharp9.cs b/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/ConditionEvaluatesToConstant.CSharp9.cs index 82c41904b0f..0d717082c42 100644 --- a/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/ConditionEvaluatesToConstant.CSharp9.cs +++ b/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/ConditionEvaluatesToConstant.CSharp9.cs @@ -121,11 +121,11 @@ public object InitWithTupleAssignment { var tmp = 0; var flag = true; - while (flag) // Noncompliant + while (flag) // Compliant { (flag, tmp) = (false, 5); } - o = value; // Secondary + o = value; } } } diff --git a/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/ConditionEvaluatesToConstant.cs b/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/ConditionEvaluatesToConstant.cs index 916e8166433..8407872b2f1 100644 --- a/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/ConditionEvaluatesToConstant.cs +++ b/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/ConditionEvaluatesToConstant.cs @@ -3125,7 +3125,7 @@ public void Go() (memoryStream, str) = GetData(); - if (memoryStream != null) // Noncompliant FP: memoryStream was reassigned as a tuple + if (memoryStream != null) // Compliant: memoryStream was reassigned as a tuple { // some code } @@ -3142,27 +3142,78 @@ public class Repro_7057 public void WithTuple() { - string current = null; - string last; - do + string text1 = null; + (text1, _) = SomeTuple(); + if (text1 == null) // Compliant + { + Console.WriteLine(); + } + + string text2 = ""; + (text2, _) = (null, 42); + if (text2 == null) // Noncompliant + { + Console.WriteLine(); + } + + string text3 = null; + ((text3, _), _) = (SomeTuple(), 42); + if (text3 == null) // Compliant + { + Console.WriteLine(); + } + + var (text4, _) = SomeTuple(); + if (text4 == null) // Compliant + { + Console.WriteLine(); + } + + var (text5, _) = (null as string, 42); + if (text5 == null) // Noncompliant + { + Console.WriteLine(); + } + + string text6 = null; + (_, (text6, _)) = (42, SomeTuple()); + if (text6 == null) // Compliant + { + Console.WriteLine(); + } + + string text7 = ""; + (_, (text7, _)) = (SomeTuple(), (null, 42)); + if (text7 == null) // Noncompliant + { + Console.WriteLine(); + } + + string text8, text9, text10; + text8 = text9 = text10 = SomeString(); + (text8, (text9, text10)) = ("", ("", "")); + if (text8 == null // Noncompliant + || text9 == null // Noncompliant + || text10 == null) // Noncompliant { - last = current; - (current, _) = SomeTuple(); + Console.WriteLine(); // Secondary + } + + var tuple = ("hello", 42); + if (tuple.Item1 == null) // FN + { + Console.WriteLine(); } - while (last == null); // Noncompliant FP } public void WithString() { string current = null; - string last; - - do + current = SomeString(); + if (current == null) // Compliant { - last = current; - current = SomeString(); + Console.WriteLine(); } - while (last == null); } } diff --git a/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/EmptyCollectionsShouldNotBeEnumerated.CSharp10.cs b/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/EmptyCollectionsShouldNotBeEnumerated.CSharp10.cs index da8398655f0..2ba1f80c06e 100644 --- a/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/EmptyCollectionsShouldNotBeEnumerated.CSharp10.cs +++ b/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/EmptyCollectionsShouldNotBeEnumerated.CSharp10.cs @@ -8,12 +8,12 @@ public void Method() List list; (list, var a) = (new List(), 42); - list.Clear(); // FN + list.Clear(); // Noncompliant list.Add(42); list.Clear(); (var list2, var b) = (new List(), 42); - list2.Clear(); // FN + list2.Clear(); // Noncompliant list2.Add(42); list2.Clear(); diff --git a/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/EmptyNullableValueAccess.CSharp10.cs b/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/EmptyNullableValueAccess.CSharp10.cs index 5bc7bbdbc72..dc703e1e5b9 100644 --- a/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/EmptyNullableValueAccess.CSharp10.cs +++ b/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/EmptyNullableValueAccess.CSharp10.cs @@ -7,7 +7,7 @@ public void Destructuring() int? nullable; (nullable, _) = (null, 42); - var v = nullable.Value; // FN + var v = nullable.Value; // Noncompliant nullable = null; v = nullable.Value; // Noncompliant diff --git a/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/EmptyNullableValueAccess.cs b/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/EmptyNullableValueAccess.cs index 91553cee746..51e2880e30f 100644 --- a/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/EmptyNullableValueAccess.cs +++ b/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/EmptyNullableValueAccess.cs @@ -148,13 +148,13 @@ class AssignmentAndDeconstruction void TypeInference() { (int? discard, int? b) = (null, null); - _ = b.Value; // FN: b is empty + _ = b.Value; // Noncompliant } void FirstLevel() { var (b, _) = (null as bool?, null as bool?); - _ = b.Value; // FN: b is empty + _ = b.Value; // Noncompliant } void SecondLevel() @@ -162,7 +162,7 @@ void SecondLevel() (int? i1, (int? i2, int? i3)) = (42, (42, null)); _ = i1.Value; // Compliant _ = i2.Value; // Compliant - _ = i3.Value; // FN + _ = i3.Value; // Noncompliant } void ThirdLevel() @@ -171,7 +171,7 @@ void ThirdLevel() _ = i1.Value; // Compliant _ = i2.Value; // Compliant _ = i3.Value; // Compliant - _ = i4.Value; // FN + _ = i4.Value; // Noncompliant _ = i5.Value; // Compliant } @@ -179,7 +179,7 @@ void WithDiscard() { (_, (int? i1, (int?, int?) _, int? i2)) = (42, (42, (42, null), null)); _ = i1.Value; // Compliant - _ = i2.Value; // FN + _ = i2.Value; // Noncompliant } void TwoWaySwapping() @@ -187,7 +187,7 @@ void TwoWaySwapping() bool? b1 = null; bool? b2 = true; (b1, b2) = (b2, b1); - _ = b1.Value; // Noncompliant, FP: after swapping is non-empty + _ = b1.Value; // Compliant: after swapping is non-empty _ = b2.Value; // FN: after swapping is empty } @@ -197,9 +197,9 @@ void ThreeWaySwapping() bool? b2 = true; bool? b3 = null; (b1, b2, b3) = (b2, b3, b2); - _ = b1.Value; // Noncompliant, FP: after swapping is non-empty + _ = b1.Value; // Compliant: after swapping is non-empty _ = b2.Value; // FN: after swapping is empty - _ = b3.Value; // Noncompliant, FP: after swapping is non-empty + _ = b3.Value; // Compliant: after swapping is non-empty } void CustomDeconstruction() diff --git a/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/HashesShouldHaveUnpredictableSalt.CSharp10.cs b/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/HashesShouldHaveUnpredictableSalt.CSharp10.cs index 56984d14156..e4fcd05e66c 100644 --- a/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/HashesShouldHaveUnpredictableSalt.CSharp10.cs +++ b/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/HashesShouldHaveUnpredictableSalt.CSharp10.cs @@ -5,6 +5,6 @@ public class Sample public void Examples(byte[] passwordBytes) { (var shortSalt, int a) = (new byte[15], 42); - PasswordDeriveBytes aes = new PasswordDeriveBytes(passwordBytes, shortSalt); // FN + PasswordDeriveBytes aes = new PasswordDeriveBytes(passwordBytes, shortSalt); // Noncompliant } } diff --git a/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/InitializationVectorShouldBeRandom.CSharp10.cs b/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/InitializationVectorShouldBeRandom.CSharp10.cs index 28ac6be3f71..f4a0327a7bb 100644 --- a/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/InitializationVectorShouldBeRandom.CSharp10.cs +++ b/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/InitializationVectorShouldBeRandom.CSharp10.cs @@ -9,6 +9,6 @@ public void Examples() AesCng aes = new AesCng(); aes.CreateEncryptor(); (var rgb, int a) = (new byte[16], 42); - aes.CreateEncryptor(aes.Key, rgb); // FN + aes.CreateEncryptor(aes.Key, rgb); // Noncompliant } } diff --git a/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/NullPointerDereference.CSharp10.cs b/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/NullPointerDereference.CSharp10.cs index a6e12c81531..ef74e9a3e7b 100644 --- a/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/NullPointerDereference.CSharp10.cs +++ b/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/NullPointerDereference.CSharp10.cs @@ -8,16 +8,15 @@ public class Sample public void Examples() { StringBuilder sb = new(); - (sb, int a) = (null, 42); - sb.ToString(); // FN + sb.ToString(); // Noncompliant } public void Unassigned() { StringBuilder isNull, hasValue; (isNull, hasValue) = (null, new StringBuilder()); - isNull.ToString(); // FN + isNull.ToString(); // Noncompliant hasValue.ToString(); } } diff --git a/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/ObjectsShouldNotBeDisposedMoreThanOnce.cs b/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/ObjectsShouldNotBeDisposedMoreThanOnce.cs index eb4447bfe0a..adebcfb720f 100644 --- a/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/ObjectsShouldNotBeDisposedMoreThanOnce.cs +++ b/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/SymbolicExecution/Roslyn/ObjectsShouldNotBeDisposedMoreThanOnce.cs @@ -250,7 +250,7 @@ public static void LoopOfTuples(List disposables, List<(int I, IDis disposable.Dispose(); // Compliant foreach (var (_, disposable) in tuples) - disposable.Dispose(); // Noncompliant FP + disposable.Dispose(); // Compliant } }