Skip to content

Commit d677a07

Browse files
committed
C#: Add null coalescing data flow tests.
1 parent b2b065d commit d677a07

File tree

3 files changed

+117
-0
lines changed

3 files changed

+117
-0
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
public class NullCoalescing
2+
{
3+
public void M1()
4+
{
5+
var i = Source<int?>(1);
6+
int? x = null;
7+
x = x ?? i;
8+
Sink(x); // $ hasValueFlow=1
9+
}
10+
11+
public void M2()
12+
{
13+
var i = Source<int?>(2);
14+
int? x = null;
15+
x ??= i;
16+
Sink(x); // $ hasValueFlow=2
17+
}
18+
19+
public void M3(int? x)
20+
{
21+
var i = Source<int?>(3);
22+
x = x ?? i;
23+
Sink(x); // $ hasValueFlow=3
24+
}
25+
26+
public void M4(int? x)
27+
{
28+
var i = Source<int?>(4);
29+
x ??= i;
30+
Sink(x); // $ hasValueFlow=4
31+
}
32+
33+
public static void Sink(object o) { }
34+
static T Source<T>(object source) => throw null;
35+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
models
2+
edges
3+
| NullCoalescing.cs:5:13:5:13 | access to local variable i : Nullable<Int32> | NullCoalescing.cs:7:9:7:9 | access to local variable x : Nullable<Int32> | provenance | |
4+
| NullCoalescing.cs:5:13:5:13 | access to local variable i : Nullable<Int32> | NullCoalescing.cs:7:9:7:9 | access to local variable x : Nullable<Int32> | provenance | |
5+
| NullCoalescing.cs:5:17:5:31 | call to method Source<Nullable<Int32>> : Nullable<Int32> | NullCoalescing.cs:5:13:5:13 | access to local variable i : Nullable<Int32> | provenance | |
6+
| NullCoalescing.cs:5:17:5:31 | call to method Source<Nullable<Int32>> : Nullable<Int32> | NullCoalescing.cs:5:13:5:13 | access to local variable i : Nullable<Int32> | provenance | |
7+
| NullCoalescing.cs:7:9:7:9 | access to local variable x : Nullable<Int32> | NullCoalescing.cs:8:14:8:14 | (...) ... | provenance | |
8+
| NullCoalescing.cs:7:9:7:9 | access to local variable x : Nullable<Int32> | NullCoalescing.cs:8:14:8:14 | (...) ... | provenance | |
9+
| NullCoalescing.cs:13:13:13:13 | access to local variable i : Nullable<Int32> | NullCoalescing.cs:15:9:15:9 | access to local variable x : Nullable<Int32> | provenance | |
10+
| NullCoalescing.cs:13:13:13:13 | access to local variable i : Nullable<Int32> | NullCoalescing.cs:15:9:15:9 | access to local variable x : Nullable<Int32> | provenance | |
11+
| NullCoalescing.cs:13:17:13:31 | call to method Source<Nullable<Int32>> : Nullable<Int32> | NullCoalescing.cs:13:13:13:13 | access to local variable i : Nullable<Int32> | provenance | |
12+
| NullCoalescing.cs:13:17:13:31 | call to method Source<Nullable<Int32>> : Nullable<Int32> | NullCoalescing.cs:13:13:13:13 | access to local variable i : Nullable<Int32> | provenance | |
13+
| NullCoalescing.cs:15:9:15:9 | access to local variable x : Nullable<Int32> | NullCoalescing.cs:16:14:16:14 | (...) ... | provenance | |
14+
| NullCoalescing.cs:15:9:15:9 | access to local variable x : Nullable<Int32> | NullCoalescing.cs:16:14:16:14 | (...) ... | provenance | |
15+
| NullCoalescing.cs:21:13:21:13 | access to local variable i : Nullable<Int32> | NullCoalescing.cs:22:9:22:9 | access to parameter x : Nullable<Int32> | provenance | |
16+
| NullCoalescing.cs:21:13:21:13 | access to local variable i : Nullable<Int32> | NullCoalescing.cs:22:9:22:9 | access to parameter x : Nullable<Int32> | provenance | |
17+
| NullCoalescing.cs:21:17:21:31 | call to method Source<Nullable<Int32>> : Nullable<Int32> | NullCoalescing.cs:21:13:21:13 | access to local variable i : Nullable<Int32> | provenance | |
18+
| NullCoalescing.cs:21:17:21:31 | call to method Source<Nullable<Int32>> : Nullable<Int32> | NullCoalescing.cs:21:13:21:13 | access to local variable i : Nullable<Int32> | provenance | |
19+
| NullCoalescing.cs:22:9:22:9 | access to parameter x : Nullable<Int32> | NullCoalescing.cs:23:14:23:14 | (...) ... | provenance | |
20+
| NullCoalescing.cs:22:9:22:9 | access to parameter x : Nullable<Int32> | NullCoalescing.cs:23:14:23:14 | (...) ... | provenance | |
21+
| NullCoalescing.cs:28:13:28:13 | access to local variable i : Nullable<Int32> | NullCoalescing.cs:29:9:29:9 | access to parameter x : Nullable<Int32> | provenance | |
22+
| NullCoalescing.cs:28:13:28:13 | access to local variable i : Nullable<Int32> | NullCoalescing.cs:29:9:29:9 | access to parameter x : Nullable<Int32> | provenance | |
23+
| NullCoalescing.cs:28:17:28:31 | call to method Source<Nullable<Int32>> : Nullable<Int32> | NullCoalescing.cs:28:13:28:13 | access to local variable i : Nullable<Int32> | provenance | |
24+
| NullCoalescing.cs:28:17:28:31 | call to method Source<Nullable<Int32>> : Nullable<Int32> | NullCoalescing.cs:28:13:28:13 | access to local variable i : Nullable<Int32> | provenance | |
25+
| NullCoalescing.cs:29:9:29:9 | access to parameter x : Nullable<Int32> | NullCoalescing.cs:30:14:30:14 | (...) ... | provenance | |
26+
| NullCoalescing.cs:29:9:29:9 | access to parameter x : Nullable<Int32> | NullCoalescing.cs:30:14:30:14 | (...) ... | provenance | |
27+
nodes
28+
| NullCoalescing.cs:5:13:5:13 | access to local variable i : Nullable<Int32> | semmle.label | access to local variable i : Nullable<Int32> |
29+
| NullCoalescing.cs:5:13:5:13 | access to local variable i : Nullable<Int32> | semmle.label | access to local variable i : Nullable<Int32> |
30+
| NullCoalescing.cs:5:17:5:31 | call to method Source<Nullable<Int32>> : Nullable<Int32> | semmle.label | call to method Source<Nullable<Int32>> : Nullable<Int32> |
31+
| NullCoalescing.cs:5:17:5:31 | call to method Source<Nullable<Int32>> : Nullable<Int32> | semmle.label | call to method Source<Nullable<Int32>> : Nullable<Int32> |
32+
| NullCoalescing.cs:7:9:7:9 | access to local variable x : Nullable<Int32> | semmle.label | access to local variable x : Nullable<Int32> |
33+
| NullCoalescing.cs:7:9:7:9 | access to local variable x : Nullable<Int32> | semmle.label | access to local variable x : Nullable<Int32> |
34+
| NullCoalescing.cs:8:14:8:14 | (...) ... | semmle.label | (...) ... |
35+
| NullCoalescing.cs:8:14:8:14 | (...) ... | semmle.label | (...) ... |
36+
| NullCoalescing.cs:13:13:13:13 | access to local variable i : Nullable<Int32> | semmle.label | access to local variable i : Nullable<Int32> |
37+
| NullCoalescing.cs:13:13:13:13 | access to local variable i : Nullable<Int32> | semmle.label | access to local variable i : Nullable<Int32> |
38+
| NullCoalescing.cs:13:17:13:31 | call to method Source<Nullable<Int32>> : Nullable<Int32> | semmle.label | call to method Source<Nullable<Int32>> : Nullable<Int32> |
39+
| NullCoalescing.cs:13:17:13:31 | call to method Source<Nullable<Int32>> : Nullable<Int32> | semmle.label | call to method Source<Nullable<Int32>> : Nullable<Int32> |
40+
| NullCoalescing.cs:15:9:15:9 | access to local variable x : Nullable<Int32> | semmle.label | access to local variable x : Nullable<Int32> |
41+
| NullCoalescing.cs:15:9:15:9 | access to local variable x : Nullable<Int32> | semmle.label | access to local variable x : Nullable<Int32> |
42+
| NullCoalescing.cs:16:14:16:14 | (...) ... | semmle.label | (...) ... |
43+
| NullCoalescing.cs:16:14:16:14 | (...) ... | semmle.label | (...) ... |
44+
| NullCoalescing.cs:21:13:21:13 | access to local variable i : Nullable<Int32> | semmle.label | access to local variable i : Nullable<Int32> |
45+
| NullCoalescing.cs:21:13:21:13 | access to local variable i : Nullable<Int32> | semmle.label | access to local variable i : Nullable<Int32> |
46+
| NullCoalescing.cs:21:17:21:31 | call to method Source<Nullable<Int32>> : Nullable<Int32> | semmle.label | call to method Source<Nullable<Int32>> : Nullable<Int32> |
47+
| NullCoalescing.cs:21:17:21:31 | call to method Source<Nullable<Int32>> : Nullable<Int32> | semmle.label | call to method Source<Nullable<Int32>> : Nullable<Int32> |
48+
| NullCoalescing.cs:22:9:22:9 | access to parameter x : Nullable<Int32> | semmle.label | access to parameter x : Nullable<Int32> |
49+
| NullCoalescing.cs:22:9:22:9 | access to parameter x : Nullable<Int32> | semmle.label | access to parameter x : Nullable<Int32> |
50+
| NullCoalescing.cs:23:14:23:14 | (...) ... | semmle.label | (...) ... |
51+
| NullCoalescing.cs:23:14:23:14 | (...) ... | semmle.label | (...) ... |
52+
| NullCoalescing.cs:28:13:28:13 | access to local variable i : Nullable<Int32> | semmle.label | access to local variable i : Nullable<Int32> |
53+
| NullCoalescing.cs:28:13:28:13 | access to local variable i : Nullable<Int32> | semmle.label | access to local variable i : Nullable<Int32> |
54+
| NullCoalescing.cs:28:17:28:31 | call to method Source<Nullable<Int32>> : Nullable<Int32> | semmle.label | call to method Source<Nullable<Int32>> : Nullable<Int32> |
55+
| NullCoalescing.cs:28:17:28:31 | call to method Source<Nullable<Int32>> : Nullable<Int32> | semmle.label | call to method Source<Nullable<Int32>> : Nullable<Int32> |
56+
| NullCoalescing.cs:29:9:29:9 | access to parameter x : Nullable<Int32> | semmle.label | access to parameter x : Nullable<Int32> |
57+
| NullCoalescing.cs:29:9:29:9 | access to parameter x : Nullable<Int32> | semmle.label | access to parameter x : Nullable<Int32> |
58+
| NullCoalescing.cs:30:14:30:14 | (...) ... | semmle.label | (...) ... |
59+
| NullCoalescing.cs:30:14:30:14 | (...) ... | semmle.label | (...) ... |
60+
subpaths
61+
testFailures
62+
#select
63+
| NullCoalescing.cs:8:14:8:14 | (...) ... | NullCoalescing.cs:5:17:5:31 | call to method Source<Nullable<Int32>> : Nullable<Int32> | NullCoalescing.cs:8:14:8:14 | (...) ... | $@ | NullCoalescing.cs:5:17:5:31 | call to method Source<Nullable<Int32>> : Nullable<Int32> | call to method Source<Nullable<Int32>> : Nullable<Int32> |
64+
| NullCoalescing.cs:8:14:8:14 | (...) ... | NullCoalescing.cs:5:17:5:31 | call to method Source<Nullable<Int32>> : Nullable<Int32> | NullCoalescing.cs:8:14:8:14 | (...) ... | $@ | NullCoalescing.cs:5:17:5:31 | call to method Source<Nullable<Int32>> : Nullable<Int32> | call to method Source<Nullable<Int32>> : Nullable<Int32> |
65+
| NullCoalescing.cs:16:14:16:14 | (...) ... | NullCoalescing.cs:13:17:13:31 | call to method Source<Nullable<Int32>> : Nullable<Int32> | NullCoalescing.cs:16:14:16:14 | (...) ... | $@ | NullCoalescing.cs:13:17:13:31 | call to method Source<Nullable<Int32>> : Nullable<Int32> | call to method Source<Nullable<Int32>> : Nullable<Int32> |
66+
| NullCoalescing.cs:16:14:16:14 | (...) ... | NullCoalescing.cs:13:17:13:31 | call to method Source<Nullable<Int32>> : Nullable<Int32> | NullCoalescing.cs:16:14:16:14 | (...) ... | $@ | NullCoalescing.cs:13:17:13:31 | call to method Source<Nullable<Int32>> : Nullable<Int32> | call to method Source<Nullable<Int32>> : Nullable<Int32> |
67+
| NullCoalescing.cs:23:14:23:14 | (...) ... | NullCoalescing.cs:21:17:21:31 | call to method Source<Nullable<Int32>> : Nullable<Int32> | NullCoalescing.cs:23:14:23:14 | (...) ... | $@ | NullCoalescing.cs:21:17:21:31 | call to method Source<Nullable<Int32>> : Nullable<Int32> | call to method Source<Nullable<Int32>> : Nullable<Int32> |
68+
| NullCoalescing.cs:23:14:23:14 | (...) ... | NullCoalescing.cs:21:17:21:31 | call to method Source<Nullable<Int32>> : Nullable<Int32> | NullCoalescing.cs:23:14:23:14 | (...) ... | $@ | NullCoalescing.cs:21:17:21:31 | call to method Source<Nullable<Int32>> : Nullable<Int32> | call to method Source<Nullable<Int32>> : Nullable<Int32> |
69+
| NullCoalescing.cs:30:14:30:14 | (...) ... | NullCoalescing.cs:28:17:28:31 | call to method Source<Nullable<Int32>> : Nullable<Int32> | NullCoalescing.cs:30:14:30:14 | (...) ... | $@ | NullCoalescing.cs:28:17:28:31 | call to method Source<Nullable<Int32>> : Nullable<Int32> | call to method Source<Nullable<Int32>> : Nullable<Int32> |
70+
| NullCoalescing.cs:30:14:30:14 | (...) ... | NullCoalescing.cs:28:17:28:31 | call to method Source<Nullable<Int32>> : Nullable<Int32> | NullCoalescing.cs:30:14:30:14 | (...) ... | $@ | NullCoalescing.cs:28:17:28:31 | call to method Source<Nullable<Int32>> : Nullable<Int32> | call to method Source<Nullable<Int32>> : Nullable<Int32> |
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/**
2+
* @kind path-problem
3+
*/
4+
5+
import csharp
6+
import utils.test.InlineFlowTest
7+
import DefaultFlowTest
8+
import PathGraph
9+
10+
from PathNode source, PathNode sink
11+
where flowPath(source, sink)
12+
select sink, source, sink, "$@", source, source.toString()

0 commit comments

Comments
 (0)