From 7ff1c12e8fe3df446776f3df2c41c70ba6874391 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Mon, 19 Jan 2026 13:17:47 +0100 Subject: [PATCH] C#: Add some more tests. --- .../library-tests/dataflow/nullness/MaybeNullExpr.cs | 3 +++ .../dataflow/nullness/maybeNullExpr.expected | 1 + .../ql/test/query-tests/Nullness/ConditionalAccess.cs | 11 +++++++++++ .../ql/test/query-tests/Nullness/NullCheck.expected | 1 + .../ql/test/query-tests/Nullness/NullMaybe.expected | 1 + 5 files changed, 17 insertions(+) create mode 100644 csharp/ql/test/query-tests/Nullness/ConditionalAccess.cs diff --git a/csharp/ql/test/library-tests/dataflow/nullness/MaybeNullExpr.cs b/csharp/ql/test/library-tests/dataflow/nullness/MaybeNullExpr.cs index 34c59df8bbd..6be2c54d41f 100644 --- a/csharp/ql/test/library-tests/dataflow/nullness/MaybeNullExpr.cs +++ b/csharp/ql/test/library-tests/dataflow/nullness/MaybeNullExpr.cs @@ -17,5 +17,8 @@ public class C // Conditional access might be null as the qualifier might be null. var s1 = (o as C)?.Prop; + + // Conditional access might be null as the qualifier might be null. + var i = o?.GetHashCode(); } } diff --git a/csharp/ql/test/library-tests/dataflow/nullness/maybeNullExpr.expected b/csharp/ql/test/library-tests/dataflow/nullness/maybeNullExpr.expected index e5aa8423c59..7182c0cdf95 100644 --- a/csharp/ql/test/library-tests/dataflow/nullness/maybeNullExpr.expected +++ b/csharp/ql/test/library-tests/dataflow/nullness/maybeNullExpr.expected @@ -5,3 +5,4 @@ | MaybeNullExpr.cs:16:17:16:22 | ... as ... | | MaybeNullExpr.cs:19:18:19:31 | access to property Prop | | MaybeNullExpr.cs:19:19:19:24 | ... as ... | +| MaybeNullExpr.cs:22:17:22:32 | call to method GetHashCode | diff --git a/csharp/ql/test/query-tests/Nullness/ConditionalAccess.cs b/csharp/ql/test/query-tests/Nullness/ConditionalAccess.cs new file mode 100644 index 00000000000..fd3fae179ed --- /dev/null +++ b/csharp/ql/test/query-tests/Nullness/ConditionalAccess.cs @@ -0,0 +1,11 @@ +using System; +using System.ComponentModel; + +class ConditionalAccessTest +{ + void M1(object o) + { + var t = o?.GetType(); + Console.WriteLine(t.FullName); // $ Alert[cs/dereferenced-value-may-be-null] + } +} diff --git a/csharp/ql/test/query-tests/Nullness/NullCheck.expected b/csharp/ql/test/query-tests/Nullness/NullCheck.expected index ada1054f02c..2b6962b51c0 100644 --- a/csharp/ql/test/query-tests/Nullness/NullCheck.expected +++ b/csharp/ql/test/query-tests/Nullness/NullCheck.expected @@ -51,6 +51,7 @@ | C.cs:229:22:229:30 | ... != ... | C.cs:229:22:229:22 | access to local variable s | | C.cs:235:24:235:32 | ... == ... | C.cs:235:24:235:24 | access to local variable s | | C.cs:235:24:235:32 | ... == ... | C.cs:235:29:235:32 | null | +| ConditionalAccess.cs:8:17:8:17 | access to parameter o | ConditionalAccess.cs:8:17:8:17 | access to parameter o | | D.cs:28:13:28:25 | ... != ... | D.cs:28:13:28:17 | access to parameter param | | D.cs:38:13:38:21 | ... == ... | D.cs:38:13:38:13 | access to parameter x | | D.cs:39:16:39:24 | ... == ... | D.cs:39:16:39:16 | access to parameter x | diff --git a/csharp/ql/test/query-tests/Nullness/NullMaybe.expected b/csharp/ql/test/query-tests/Nullness/NullMaybe.expected index 6a0d8372e3e..3f5219d8c0c 100644 --- a/csharp/ql/test/query-tests/Nullness/NullMaybe.expected +++ b/csharp/ql/test/query-tests/Nullness/NullMaybe.expected @@ -6,6 +6,7 @@ | C.cs:203:13:203:13 | access to local variable s | Variable $@ may be null at this access because of $@ assignment. | C.cs:185:13:185:13 | s | s | C.cs:204:13:204:20 | ... = ... | this | | C.cs:223:9:223:9 | access to local variable s | Variable $@ may be null at this access because of $@ assignment. | C.cs:210:13:210:13 | s | s | C.cs:222:13:222:20 | ... = ... | this | | C.cs:242:13:242:13 | access to local variable s | Variable $@ may be null at this access because of $@ assignment. | C.cs:228:16:228:16 | s | s | C.cs:240:24:240:31 | ... = ... | this | +| ConditionalAccess.cs:9:27:9:27 | access to local variable t | Variable $@ may be null at this access because of $@ assignment. | ConditionalAccess.cs:8:13:8:13 | t | t | ConditionalAccess.cs:8:13:8:28 | Type t = ... | this | | D.cs:23:9:23:13 | access to parameter param | Variable $@ may be null at this access because of $@ null argument. | D.cs:21:32:21:36 | param | param | D.cs:17:17:17:20 | null | this | | D.cs:32:9:32:13 | access to parameter param | Variable $@ may be null at this access as suggested by $@ null check. | D.cs:26:32:26:36 | param | param | D.cs:28:13:28:25 | ... != ... | this | | D.cs:73:13:73:14 | access to local variable o7 | Variable $@ may be null at this access because of $@ assignment. | D.cs:68:13:68:14 | o7 | o7 | D.cs:68:13:68:34 | String o7 = ... | this |