Skip to content

Commit 40481fb

Browse files
committed
C#: Make SuppressNullableWarningExpr a nonNullValue, and add a test.
1 parent d48ce85 commit 40481fb

File tree

4 files changed

+33
-3
lines changed

4 files changed

+33
-3
lines changed

csharp/ql/src/semmle/code/csharp/controlflow/Guards.qll

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -673,6 +673,8 @@ module Internal {
673673
or
674674
e.(Call).getTarget().getSourceDeclaration() instanceof NonNullCallable and
675675
not e.(QualifiableExpr).isConditional()
676+
or
677+
e instanceof SuppressNullableWarningExpr
676678
}
677679

678680
/** Holds if expression `e2` is a non-`null` value whenever `e1` is. */

csharp/ql/test/library-tests/csharp8/NullableRefTypes.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,7 @@ void TestNullableRefTypes()
77
string? x = "source";
88
string y = x!;
99
y = x!!;
10+
x = null;
11+
y = x!;
1012
}
1113
}

csharp/ql/test/library-tests/csharp8/NullableRefTypes.expected

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,46 @@ suppressNullableWarnings
22
| NullableRefTypes.cs:8:20:8:21 | ...! | NullableRefTypes.cs:8:20:8:20 | access to local variable x |
33
| NullableRefTypes.cs:9:13:9:14 | ...! | NullableRefTypes.cs:9:13:9:13 | access to local variable x |
44
| NullableRefTypes.cs:9:13:9:15 | ...! | NullableRefTypes.cs:9:13:9:14 | ...! |
5+
| NullableRefTypes.cs:11:13:11:14 | ...! | NullableRefTypes.cs:11:13:11:13 | access to local variable x |
56
nullableDataFlow
67
| NullableRefTypes.cs:7:17:7:28 | SSA def(x) | NullableRefTypes.cs:8:20:8:20 | access to local variable x |
78
| NullableRefTypes.cs:7:21:7:28 | "source" | NullableRefTypes.cs:7:17:7:28 | SSA def(x) |
89
| NullableRefTypes.cs:8:20:8:20 | access to local variable x | NullableRefTypes.cs:8:20:8:21 | ...! |
910
| NullableRefTypes.cs:8:20:8:20 | access to local variable x | NullableRefTypes.cs:9:13:9:13 | access to local variable x |
1011
| NullableRefTypes.cs:9:13:9:13 | access to local variable x | NullableRefTypes.cs:9:13:9:14 | ...! |
1112
| NullableRefTypes.cs:9:13:9:14 | ...! | NullableRefTypes.cs:9:13:9:15 | ...! |
13+
| NullableRefTypes.cs:10:9:10:16 | SSA def(x) | NullableRefTypes.cs:11:13:11:13 | access to local variable x |
14+
| NullableRefTypes.cs:10:13:10:16 | null | NullableRefTypes.cs:10:9:10:16 | SSA def(x) |
15+
| NullableRefTypes.cs:11:13:11:13 | access to local variable x | NullableRefTypes.cs:11:13:11:14 | ...! |
1216
nullableControlFlow
13-
| NullableRefTypes.cs:5:10:5:29 | enter TestNullableRefTypes | NullableRefTypes.cs:6:5:10:5 | {...} | successor |
14-
| NullableRefTypes.cs:6:5:10:5 | {...} | NullableRefTypes.cs:7:9:7:29 | ... ...; | successor |
17+
| NullableRefTypes.cs:5:10:5:29 | enter TestNullableRefTypes | NullableRefTypes.cs:6:5:12:5 | {...} | successor |
18+
| NullableRefTypes.cs:6:5:12:5 | {...} | NullableRefTypes.cs:7:9:7:29 | ... ...; | successor |
1519
| NullableRefTypes.cs:7:9:7:29 | ... ...; | NullableRefTypes.cs:7:21:7:28 | "source" | successor |
1620
| NullableRefTypes.cs:7:17:7:28 | String x = ... | NullableRefTypes.cs:8:9:8:22 | ... ...; | successor |
1721
| NullableRefTypes.cs:7:21:7:28 | "source" | NullableRefTypes.cs:7:17:7:28 | String x = ... | successor |
1822
| NullableRefTypes.cs:8:9:8:22 | ... ...; | NullableRefTypes.cs:8:20:8:20 | access to local variable x | successor |
1923
| NullableRefTypes.cs:8:16:8:21 | String y = ... | NullableRefTypes.cs:9:9:9:16 | ...; | successor |
2024
| NullableRefTypes.cs:8:20:8:20 | access to local variable x | NullableRefTypes.cs:8:20:8:21 | ...! | successor |
2125
| NullableRefTypes.cs:8:20:8:21 | ...! | NullableRefTypes.cs:8:16:8:21 | String y = ... | successor |
22-
| NullableRefTypes.cs:9:9:9:15 | ... = ... | NullableRefTypes.cs:5:10:5:29 | exit TestNullableRefTypes | successor |
26+
| NullableRefTypes.cs:9:9:9:15 | ... = ... | NullableRefTypes.cs:10:9:10:17 | ...; | successor |
2327
| NullableRefTypes.cs:9:9:9:16 | ...; | NullableRefTypes.cs:9:13:9:13 | access to local variable x | successor |
2428
| NullableRefTypes.cs:9:13:9:13 | access to local variable x | NullableRefTypes.cs:9:13:9:14 | ...! | successor |
2529
| NullableRefTypes.cs:9:13:9:14 | ...! | NullableRefTypes.cs:9:13:9:15 | ...! | successor |
2630
| NullableRefTypes.cs:9:13:9:15 | ...! | NullableRefTypes.cs:9:9:9:15 | ... = ... | successor |
31+
| NullableRefTypes.cs:10:9:10:16 | ... = ... | NullableRefTypes.cs:11:9:11:15 | ...; | successor |
32+
| NullableRefTypes.cs:10:9:10:17 | ...; | NullableRefTypes.cs:10:13:10:16 | null | successor |
33+
| NullableRefTypes.cs:10:13:10:16 | null | NullableRefTypes.cs:10:9:10:16 | ... = ... | successor |
34+
| NullableRefTypes.cs:11:9:11:14 | ... = ... | NullableRefTypes.cs:5:10:5:29 | exit TestNullableRefTypes | successor |
35+
| NullableRefTypes.cs:11:9:11:15 | ...; | NullableRefTypes.cs:11:13:11:13 | access to local variable x | successor |
36+
| NullableRefTypes.cs:11:13:11:13 | access to local variable x | NullableRefTypes.cs:11:13:11:14 | ...! | successor |
37+
| NullableRefTypes.cs:11:13:11:14 | ...! | NullableRefTypes.cs:11:9:11:14 | ... = ... | successor |
38+
nonNullExpressions
39+
| NullableRefTypes.cs:7:21:7:28 | "source" |
40+
| NullableRefTypes.cs:8:20:8:20 | access to local variable x |
41+
| NullableRefTypes.cs:8:20:8:21 | ...! |
42+
| NullableRefTypes.cs:9:9:9:15 | ... = ... |
43+
| NullableRefTypes.cs:9:13:9:13 | access to local variable x |
44+
| NullableRefTypes.cs:9:13:9:14 | ...! |
45+
| NullableRefTypes.cs:9:13:9:15 | ...! |
46+
| NullableRefTypes.cs:11:9:11:14 | ... = ... |
47+
| NullableRefTypes.cs:11:13:11:14 | ...! |

csharp/ql/test/library-tests/csharp8/NullableRefTypes.ql

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import csharp
2+
import semmle.code.csharp.dataflow.Nullness
23

34
query predicate suppressNullableWarnings(SuppressNullableWarningExpr e, Expr op) {
45
op = e.getExpr()
@@ -15,3 +16,7 @@ query predicate nullableControlFlow(
1516
a.getEnclosingCallable().hasName("TestNullableRefTypes") and
1617
b = a.getASuccessorByType(t)
1718
}
19+
20+
query predicate nonNullExpressions(NonNullExpr e) {
21+
e.getEnclosingCallable().getName() = "TestNullableRefTypes"
22+
}

0 commit comments

Comments
 (0)