Skip to content

Commit 3d5aec4

Browse files
committed
C#: Add tests for missing reverse flow
1 parent f56e337 commit 3d5aec4

File tree

3 files changed

+123
-0
lines changed

3 files changed

+123
-0
lines changed
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
public class A
2+
{
3+
public string Field;
4+
5+
public A Nested;
6+
7+
public void M1()
8+
{
9+
var a = new A();
10+
M2(a);
11+
Sink(a.Nested.Field); // $ MISSING: hasValueFlow=1
12+
}
13+
14+
public void M2(A a)
15+
{
16+
var b = a.Nested;
17+
M3(b);
18+
}
19+
20+
public void M3(A a)
21+
{
22+
a.Field = Source<string>(1);
23+
}
24+
25+
public void M4()
26+
{
27+
this.M5();
28+
Sink(this.Nested.Field); // $ MISSING: hasValueFlow=2
29+
}
30+
31+
public void M5()
32+
{
33+
var b = this.Nested;
34+
b.M6();
35+
}
36+
37+
public void M6()
38+
{
39+
this.Field = Source<string>(2);
40+
}
41+
42+
public void M7()
43+
{
44+
var a = new A();
45+
M8(a);
46+
Sink(a.Field); // $ MISSING: hasValueFlow=3
47+
}
48+
49+
public void M8(A a)
50+
{
51+
var b = new A();
52+
b.Nested = a;
53+
M9(b);
54+
}
55+
56+
public void M9(A a)
57+
{
58+
a.Nested.Field = Source<string>(3);
59+
}
60+
61+
public void M10()
62+
{
63+
var a = new A();
64+
Sink(a);
65+
Sink(a.Nested.Nested.Field);
66+
GetNestedNested(a).Field = Source<string>(4);
67+
Sink(a.Nested.Nested.Field); // $ MISSING: hasValueFlow=4
68+
}
69+
70+
public void M11(A a)
71+
{
72+
73+
}
74+
75+
public void M12()
76+
{
77+
var a = new A();
78+
M11(a);
79+
Sink(a.Field);
80+
a.Field = Source<string>(5);
81+
Sink(a.Field); // $ hasValueFlow=5
82+
}
83+
84+
public A GetNestedNested(A a) => a.Nested.Nested;
85+
86+
public static void Sink(object o) { }
87+
88+
static T Source<T>(object source) => throw null;
89+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
models
2+
edges
3+
| ReverseFlow.cs:80:9:80:9 | [post] access to local variable a : A [field Field] : String | ReverseFlow.cs:81:14:81:14 | access to local variable a : A [field Field] : String | provenance | |
4+
| ReverseFlow.cs:80:9:80:9 | [post] access to local variable a : A [field Field] : String | ReverseFlow.cs:81:14:81:14 | access to local variable a : A [field Field] : String | provenance | |
5+
| ReverseFlow.cs:80:19:80:35 | call to method Source<String> : String | ReverseFlow.cs:80:9:80:9 | [post] access to local variable a : A [field Field] : String | provenance | |
6+
| ReverseFlow.cs:80:19:80:35 | call to method Source<String> : String | ReverseFlow.cs:80:9:80:9 | [post] access to local variable a : A [field Field] : String | provenance | |
7+
| ReverseFlow.cs:81:14:81:14 | access to local variable a : A [field Field] : String | ReverseFlow.cs:81:14:81:20 | access to field Field | provenance | |
8+
| ReverseFlow.cs:81:14:81:14 | access to local variable a : A [field Field] : String | ReverseFlow.cs:81:14:81:20 | access to field Field | provenance | |
9+
nodes
10+
| ReverseFlow.cs:80:9:80:9 | [post] access to local variable a : A [field Field] : String | semmle.label | [post] access to local variable a : A [field Field] : String |
11+
| ReverseFlow.cs:80:9:80:9 | [post] access to local variable a : A [field Field] : String | semmle.label | [post] access to local variable a : A [field Field] : String |
12+
| ReverseFlow.cs:80:19:80:35 | call to method Source<String> : String | semmle.label | call to method Source<String> : String |
13+
| ReverseFlow.cs:80:19:80:35 | call to method Source<String> : String | semmle.label | call to method Source<String> : String |
14+
| ReverseFlow.cs:81:14:81:14 | access to local variable a : A [field Field] : String | semmle.label | access to local variable a : A [field Field] : String |
15+
| ReverseFlow.cs:81:14:81:14 | access to local variable a : A [field Field] : String | semmle.label | access to local variable a : A [field Field] : String |
16+
| ReverseFlow.cs:81:14:81:20 | access to field Field | semmle.label | access to field Field |
17+
| ReverseFlow.cs:81:14:81:20 | access to field Field | semmle.label | access to field Field |
18+
subpaths
19+
testFailures
20+
#select
21+
| ReverseFlow.cs:81:14:81:20 | access to field Field | ReverseFlow.cs:80:19:80:35 | call to method Source<String> : String | ReverseFlow.cs:81:14:81:20 | access to field Field | $@ | ReverseFlow.cs:80:19:80:35 | call to method Source<String> : String | call to method Source<String> : String |
22+
| ReverseFlow.cs:81:14:81:20 | access to field Field | ReverseFlow.cs:80:19:80:35 | call to method Source<String> : String | ReverseFlow.cs:81:14:81:20 | access to field Field | $@ | ReverseFlow.cs:80:19:80:35 | call to method Source<String> : String | call to method Source<String> : String |
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 TestUtilities.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)