Skip to content

Commit 9966e09

Browse files
committed
C#: Add operator dataflow test case with checked and unchecked examples.
1 parent 50c3c15 commit 9966e09

File tree

3 files changed

+129
-0
lines changed

3 files changed

+129
-0
lines changed
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
public class Operators
2+
{
3+
4+
static void Sink(object o) { }
5+
static T Source<T>(object source) => throw null;
6+
7+
public class C
8+
{
9+
public static C operator +(C x, C y) => x;
10+
11+
public static C operator checked -(C x, C y) => y;
12+
public static C operator -(C x, C y) => x;
13+
}
14+
15+
public void M1()
16+
{
17+
var x = Source<C>(1);
18+
var y = Source<C>(2);
19+
var z = x + y;
20+
Sink(z); // $ hasValueFlow=1
21+
}
22+
23+
public void M2()
24+
{
25+
var x = Source<C>(3);
26+
var y = Source<C>(4);
27+
var z = unchecked(x - y);
28+
Sink(z); // $ hasValueFlow=3
29+
}
30+
31+
public void M3()
32+
{
33+
var x = Source<C>(5);
34+
var y = Source<C>(6);
35+
var z = checked(x - y);
36+
Sink(z); // $ hasValueFlow=6
37+
}
38+
}
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
failures
2+
edges
3+
| Operator.cs:9:38:9:38 | x : C | Operator.cs:9:49:9:49 | access to parameter x : C |
4+
| Operator.cs:9:38:9:38 | x : C | Operator.cs:9:49:9:49 | access to parameter x : C |
5+
| Operator.cs:11:51:11:51 | y : C | Operator.cs:11:57:11:57 | access to parameter y : C |
6+
| Operator.cs:11:51:11:51 | y : C | Operator.cs:11:57:11:57 | access to parameter y : C |
7+
| Operator.cs:12:38:12:38 | x : C | Operator.cs:12:49:12:49 | access to parameter x : C |
8+
| Operator.cs:12:38:12:38 | x : C | Operator.cs:12:49:12:49 | access to parameter x : C |
9+
| Operator.cs:17:17:17:28 | call to method Source<C> : C | Operator.cs:19:17:19:17 | access to local variable x : C |
10+
| Operator.cs:17:17:17:28 | call to method Source<C> : C | Operator.cs:19:17:19:17 | access to local variable x : C |
11+
| Operator.cs:19:17:19:17 | access to local variable x : C | Operator.cs:9:38:9:38 | x : C |
12+
| Operator.cs:19:17:19:17 | access to local variable x : C | Operator.cs:9:38:9:38 | x : C |
13+
| Operator.cs:19:17:19:17 | access to local variable x : C | Operator.cs:19:17:19:21 | call to operator + : C |
14+
| Operator.cs:19:17:19:17 | access to local variable x : C | Operator.cs:19:17:19:21 | call to operator + : C |
15+
| Operator.cs:19:17:19:21 | call to operator + : C | Operator.cs:20:14:20:14 | access to local variable z |
16+
| Operator.cs:19:17:19:21 | call to operator + : C | Operator.cs:20:14:20:14 | access to local variable z |
17+
| Operator.cs:25:17:25:28 | call to method Source<C> : C | Operator.cs:27:27:27:27 | access to local variable x : C |
18+
| Operator.cs:25:17:25:28 | call to method Source<C> : C | Operator.cs:27:27:27:27 | access to local variable x : C |
19+
| Operator.cs:27:27:27:27 | access to local variable x : C | Operator.cs:12:38:12:38 | x : C |
20+
| Operator.cs:27:27:27:27 | access to local variable x : C | Operator.cs:12:38:12:38 | x : C |
21+
| Operator.cs:27:27:27:27 | access to local variable x : C | Operator.cs:27:27:27:31 | call to operator - : C |
22+
| Operator.cs:27:27:27:27 | access to local variable x : C | Operator.cs:27:27:27:31 | call to operator - : C |
23+
| Operator.cs:27:27:27:31 | call to operator - : C | Operator.cs:28:14:28:14 | access to local variable z |
24+
| Operator.cs:27:27:27:31 | call to operator - : C | Operator.cs:28:14:28:14 | access to local variable z |
25+
| Operator.cs:34:17:34:28 | call to method Source<C> : C | Operator.cs:35:29:35:29 | access to local variable y : C |
26+
| Operator.cs:34:17:34:28 | call to method Source<C> : C | Operator.cs:35:29:35:29 | access to local variable y : C |
27+
| Operator.cs:35:25:35:29 | call to operator checked - : C | Operator.cs:36:14:36:14 | access to local variable z |
28+
| Operator.cs:35:25:35:29 | call to operator checked - : C | Operator.cs:36:14:36:14 | access to local variable z |
29+
| Operator.cs:35:29:35:29 | access to local variable y : C | Operator.cs:11:51:11:51 | y : C |
30+
| Operator.cs:35:29:35:29 | access to local variable y : C | Operator.cs:11:51:11:51 | y : C |
31+
| Operator.cs:35:29:35:29 | access to local variable y : C | Operator.cs:35:25:35:29 | call to operator checked - : C |
32+
| Operator.cs:35:29:35:29 | access to local variable y : C | Operator.cs:35:25:35:29 | call to operator checked - : C |
33+
nodes
34+
| Operator.cs:9:38:9:38 | x : C | semmle.label | x : C |
35+
| Operator.cs:9:38:9:38 | x : C | semmle.label | x : C |
36+
| Operator.cs:9:49:9:49 | access to parameter x : C | semmle.label | access to parameter x : C |
37+
| Operator.cs:9:49:9:49 | access to parameter x : C | semmle.label | access to parameter x : C |
38+
| Operator.cs:11:51:11:51 | y : C | semmle.label | y : C |
39+
| Operator.cs:11:51:11:51 | y : C | semmle.label | y : C |
40+
| Operator.cs:11:57:11:57 | access to parameter y : C | semmle.label | access to parameter y : C |
41+
| Operator.cs:11:57:11:57 | access to parameter y : C | semmle.label | access to parameter y : C |
42+
| Operator.cs:12:38:12:38 | x : C | semmle.label | x : C |
43+
| Operator.cs:12:38:12:38 | x : C | semmle.label | x : C |
44+
| Operator.cs:12:49:12:49 | access to parameter x : C | semmle.label | access to parameter x : C |
45+
| Operator.cs:12:49:12:49 | access to parameter x : C | semmle.label | access to parameter x : C |
46+
| Operator.cs:17:17:17:28 | call to method Source<C> : C | semmle.label | call to method Source<C> : C |
47+
| Operator.cs:17:17:17:28 | call to method Source<C> : C | semmle.label | call to method Source<C> : C |
48+
| Operator.cs:19:17:19:17 | access to local variable x : C | semmle.label | access to local variable x : C |
49+
| Operator.cs:19:17:19:17 | access to local variable x : C | semmle.label | access to local variable x : C |
50+
| Operator.cs:19:17:19:21 | call to operator + : C | semmle.label | call to operator + : C |
51+
| Operator.cs:19:17:19:21 | call to operator + : C | semmle.label | call to operator + : C |
52+
| Operator.cs:20:14:20:14 | access to local variable z | semmle.label | access to local variable z |
53+
| Operator.cs:20:14:20:14 | access to local variable z | semmle.label | access to local variable z |
54+
| Operator.cs:25:17:25:28 | call to method Source<C> : C | semmle.label | call to method Source<C> : C |
55+
| Operator.cs:25:17:25:28 | call to method Source<C> : C | semmle.label | call to method Source<C> : C |
56+
| Operator.cs:27:27:27:27 | access to local variable x : C | semmle.label | access to local variable x : C |
57+
| Operator.cs:27:27:27:27 | access to local variable x : C | semmle.label | access to local variable x : C |
58+
| Operator.cs:27:27:27:31 | call to operator - : C | semmle.label | call to operator - : C |
59+
| Operator.cs:27:27:27:31 | call to operator - : C | semmle.label | call to operator - : C |
60+
| Operator.cs:28:14:28:14 | access to local variable z | semmle.label | access to local variable z |
61+
| Operator.cs:28:14:28:14 | access to local variable z | semmle.label | access to local variable z |
62+
| Operator.cs:34:17:34:28 | call to method Source<C> : C | semmle.label | call to method Source<C> : C |
63+
| Operator.cs:34:17:34:28 | call to method Source<C> : C | semmle.label | call to method Source<C> : C |
64+
| Operator.cs:35:25:35:29 | call to operator checked - : C | semmle.label | call to operator checked - : C |
65+
| Operator.cs:35:25:35:29 | call to operator checked - : C | semmle.label | call to operator checked - : C |
66+
| Operator.cs:35:29:35:29 | access to local variable y : C | semmle.label | access to local variable y : C |
67+
| Operator.cs:35:29:35:29 | access to local variable y : C | semmle.label | access to local variable y : C |
68+
| Operator.cs:36:14:36:14 | access to local variable z | semmle.label | access to local variable z |
69+
| Operator.cs:36:14:36:14 | access to local variable z | semmle.label | access to local variable z |
70+
subpaths
71+
| Operator.cs:19:17:19:17 | access to local variable x : C | Operator.cs:9:38:9:38 | x : C | Operator.cs:9:49:9:49 | access to parameter x : C | Operator.cs:19:17:19:21 | call to operator + : C |
72+
| Operator.cs:19:17:19:17 | access to local variable x : C | Operator.cs:9:38:9:38 | x : C | Operator.cs:9:49:9:49 | access to parameter x : C | Operator.cs:19:17:19:21 | call to operator + : C |
73+
| Operator.cs:27:27:27:27 | access to local variable x : C | Operator.cs:12:38:12:38 | x : C | Operator.cs:12:49:12:49 | access to parameter x : C | Operator.cs:27:27:27:31 | call to operator - : C |
74+
| Operator.cs:27:27:27:27 | access to local variable x : C | Operator.cs:12:38:12:38 | x : C | Operator.cs:12:49:12:49 | access to parameter x : C | Operator.cs:27:27:27:31 | call to operator - : C |
75+
| Operator.cs:35:29:35:29 | access to local variable y : C | Operator.cs:11:51:11:51 | y : C | Operator.cs:11:57:11:57 | access to parameter y : C | Operator.cs:35:25:35:29 | call to operator checked - : C |
76+
| Operator.cs:35:29:35:29 | access to local variable y : C | Operator.cs:11:51:11:51 | y : C | Operator.cs:11:57:11:57 | access to parameter y : C | Operator.cs:35:25:35:29 | call to operator checked - : C |
77+
#select
78+
| Operator.cs:20:14:20:14 | access to local variable z | Operator.cs:17:17:17:28 | call to method Source<C> : C | Operator.cs:20:14:20:14 | access to local variable z | $@ | Operator.cs:17:17:17:28 | call to method Source<C> : C | call to method Source<C> : C |
79+
| Operator.cs:28:14:28:14 | access to local variable z | Operator.cs:25:17:25:28 | call to method Source<C> : C | Operator.cs:28:14:28:14 | access to local variable z | $@ | Operator.cs:25:17:25:28 | call to method Source<C> : C | call to method Source<C> : C |
80+
| Operator.cs:36:14:36:14 | access to local variable z | Operator.cs:34:17:34:28 | call to method Source<C> : C | Operator.cs:36:14:36:14 | access to local variable z | $@ | Operator.cs:34:17:34:28 | call to method Source<C> : C | call to method Source<C> : C |
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
/**
2+
* @kind path-problem
3+
*/
4+
5+
import csharp
6+
import DataFlow::PathGraph
7+
import TestUtilities.InlineFlowTest
8+
9+
from DataFlow::PathNode source, DataFlow::PathNode sink, DefaultValueFlowConf conf
10+
where conf.hasFlowPath(source, sink)
11+
select sink, source, sink, "$@", source, source.toString()

0 commit comments

Comments
 (0)