Skip to content

Commit e93876d

Browse files
committed
C#: Add data flow testcases for mutation operators.
1 parent 5fb45be commit e93876d

2 files changed

Lines changed: 120 additions & 0 deletions

File tree

csharp/ql/test/library-tests/dataflow/operators/Operator.cs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,3 +120,49 @@ public void M1()
120120
Sink(x.Field); // $ hasValueFlow=1
121121
}
122122
}
123+
124+
public class MutatorOperators
125+
{
126+
static void Sink(object o) { }
127+
static T Source<T>(object source) => throw null;
128+
129+
public class C1
130+
{
131+
public object Field { get; private set; }
132+
133+
public C1()
134+
{
135+
Field = new object();
136+
}
137+
138+
public C1(object o)
139+
{
140+
Field = o;
141+
}
142+
143+
public void operator ++()
144+
{
145+
Field = Source<object>(1);
146+
}
147+
148+
public static C1 operator --(C1 x)
149+
{
150+
var f = Source<object>(2);
151+
return new C1(f);
152+
}
153+
154+
public void M1()
155+
{
156+
var x = new C1();
157+
x++;
158+
Sink(x.Field); // $ hasValueFlow=1
159+
}
160+
161+
public void M2()
162+
{
163+
var x = new C1();
164+
x--;
165+
Sink(x.Field); // $ hasValueFlow=2
166+
}
167+
}
168+
}

csharp/ql/test/library-tests/dataflow/operators/operatorFlow.expected

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,38 @@ edges
130130
| Operator.cs:119:14:119:14 | access to local variable y : C [property Field] : Object | Operator.cs:119:9:119:9 | [post] access to local variable x : C [property Field] : Object | provenance | |
131131
| Operator.cs:120:14:120:14 | access to local variable x : C [property Field] : Object | Operator.cs:120:14:120:20 | access to property Field | provenance | |
132132
| Operator.cs:120:14:120:14 | access to local variable x : C [property Field] : Object | Operator.cs:120:14:120:20 | access to property Field | provenance | |
133+
| Operator.cs:138:26:138:26 | o : Object | Operator.cs:140:21:140:21 | access to parameter o : Object | provenance | |
134+
| Operator.cs:138:26:138:26 | o : Object | Operator.cs:140:21:140:21 | access to parameter o : Object | provenance | |
135+
| Operator.cs:140:13:140:17 | [post] this access : C1 [property Field] : Object | Operator.cs:138:16:138:17 | this [Return] : C1 [property Field] : Object | provenance | |
136+
| Operator.cs:140:13:140:17 | [post] this access : C1 [property Field] : Object | Operator.cs:138:16:138:17 | this [Return] : C1 [property Field] : Object | provenance | |
137+
| Operator.cs:140:21:140:21 | access to parameter o : Object | Operator.cs:140:13:140:17 | [post] this access : C1 [property Field] : Object | provenance | |
138+
| Operator.cs:140:21:140:21 | access to parameter o : Object | Operator.cs:140:13:140:17 | [post] this access : C1 [property Field] : Object | provenance | |
139+
| Operator.cs:143:30:143:31 | this [Return] : C1 [property Field] : Object | Operator.cs:157:13:157:13 | [post] access to local variable x : C1 [property Field] : Object | provenance | |
140+
| Operator.cs:143:30:143:31 | this [Return] : C1 [property Field] : Object | Operator.cs:157:13:157:13 | [post] access to local variable x : C1 [property Field] : Object | provenance | |
141+
| Operator.cs:145:13:145:17 | [post] this access : C1 [property Field] : Object | Operator.cs:143:30:143:31 | this [Return] : C1 [property Field] : Object | provenance | |
142+
| Operator.cs:145:13:145:17 | [post] this access : C1 [property Field] : Object | Operator.cs:143:30:143:31 | this [Return] : C1 [property Field] : Object | provenance | |
143+
| Operator.cs:145:21:145:37 | call to method Source<Object> : Object | Operator.cs:145:13:145:17 | [post] this access : C1 [property Field] : Object | provenance | |
144+
| Operator.cs:145:21:145:37 | call to method Source<Object> : Object | Operator.cs:145:13:145:17 | [post] this access : C1 [property Field] : Object | provenance | |
145+
| Operator.cs:150:17:150:17 | access to local variable f : Object | Operator.cs:151:27:151:27 | access to local variable f : Object | provenance | |
146+
| Operator.cs:150:17:150:17 | access to local variable f : Object | Operator.cs:151:27:151:27 | access to local variable f : Object | provenance | |
147+
| Operator.cs:150:21:150:37 | call to method Source<Object> : Object | Operator.cs:150:17:150:17 | access to local variable f : Object | provenance | |
148+
| Operator.cs:150:21:150:37 | call to method Source<Object> : Object | Operator.cs:150:17:150:17 | access to local variable f : Object | provenance | |
149+
| Operator.cs:151:20:151:28 | object creation of type C1 : C1 [property Field] : Object | Operator.cs:164:13:164:15 | call to operator -- : C1 [property Field] : Object | provenance | |
150+
| Operator.cs:151:20:151:28 | object creation of type C1 : C1 [property Field] : Object | Operator.cs:164:13:164:15 | call to operator -- : C1 [property Field] : Object | provenance | |
151+
| Operator.cs:151:27:151:27 | access to local variable f : Object | Operator.cs:138:26:138:26 | o : Object | provenance | |
152+
| Operator.cs:151:27:151:27 | access to local variable f : Object | Operator.cs:138:26:138:26 | o : Object | provenance | |
153+
| Operator.cs:151:27:151:27 | access to local variable f : Object | Operator.cs:151:20:151:28 | object creation of type C1 : C1 [property Field] : Object | provenance | |
154+
| Operator.cs:151:27:151:27 | access to local variable f : Object | Operator.cs:151:20:151:28 | object creation of type C1 : C1 [property Field] : Object | provenance | |
155+
| Operator.cs:157:13:157:13 | [post] access to local variable x : C1 [property Field] : Object | Operator.cs:158:18:158:18 | access to local variable x : C1 [property Field] : Object | provenance | |
156+
| Operator.cs:157:13:157:13 | [post] access to local variable x : C1 [property Field] : Object | Operator.cs:158:18:158:18 | access to local variable x : C1 [property Field] : Object | provenance | |
157+
| Operator.cs:158:18:158:18 | access to local variable x : C1 [property Field] : Object | Operator.cs:158:18:158:24 | access to property Field | provenance | |
158+
| Operator.cs:158:18:158:18 | access to local variable x : C1 [property Field] : Object | Operator.cs:158:18:158:24 | access to property Field | provenance | |
159+
| Operator.cs:164:13:164:13 | access to local variable x : C1 [property Field] : Object | Operator.cs:165:18:165:18 | access to local variable x : C1 [property Field] : Object | provenance | |
160+
| Operator.cs:164:13:164:13 | access to local variable x : C1 [property Field] : Object | Operator.cs:165:18:165:18 | access to local variable x : C1 [property Field] : Object | provenance | |
161+
| Operator.cs:164:13:164:15 | call to operator -- : C1 [property Field] : Object | Operator.cs:164:13:164:13 | access to local variable x : C1 [property Field] : Object | provenance | |
162+
| Operator.cs:164:13:164:15 | call to operator -- : C1 [property Field] : Object | Operator.cs:164:13:164:13 | access to local variable x : C1 [property Field] : Object | provenance | |
163+
| Operator.cs:165:18:165:18 | access to local variable x : C1 [property Field] : Object | Operator.cs:165:18:165:24 | access to property Field | provenance | |
164+
| Operator.cs:165:18:165:18 | access to local variable x : C1 [property Field] : Object | Operator.cs:165:18:165:24 | access to property Field | provenance | |
133165
nodes
134166
| Operator.cs:9:39:9:39 | x : C | semmle.label | x : C |
135167
| Operator.cs:9:39:9:39 | x : C | semmle.label | x : C |
@@ -275,6 +307,42 @@ nodes
275307
| Operator.cs:120:14:120:14 | access to local variable x : C [property Field] : Object | semmle.label | access to local variable x : C [property Field] : Object |
276308
| Operator.cs:120:14:120:20 | access to property Field | semmle.label | access to property Field |
277309
| Operator.cs:120:14:120:20 | access to property Field | semmle.label | access to property Field |
310+
| Operator.cs:138:16:138:17 | this [Return] : C1 [property Field] : Object | semmle.label | this [Return] : C1 [property Field] : Object |
311+
| Operator.cs:138:16:138:17 | this [Return] : C1 [property Field] : Object | semmle.label | this [Return] : C1 [property Field] : Object |
312+
| Operator.cs:138:26:138:26 | o : Object | semmle.label | o : Object |
313+
| Operator.cs:138:26:138:26 | o : Object | semmle.label | o : Object |
314+
| Operator.cs:140:13:140:17 | [post] this access : C1 [property Field] : Object | semmle.label | [post] this access : C1 [property Field] : Object |
315+
| Operator.cs:140:13:140:17 | [post] this access : C1 [property Field] : Object | semmle.label | [post] this access : C1 [property Field] : Object |
316+
| Operator.cs:140:21:140:21 | access to parameter o : Object | semmle.label | access to parameter o : Object |
317+
| Operator.cs:140:21:140:21 | access to parameter o : Object | semmle.label | access to parameter o : Object |
318+
| Operator.cs:143:30:143:31 | this [Return] : C1 [property Field] : Object | semmle.label | this [Return] : C1 [property Field] : Object |
319+
| Operator.cs:143:30:143:31 | this [Return] : C1 [property Field] : Object | semmle.label | this [Return] : C1 [property Field] : Object |
320+
| Operator.cs:145:13:145:17 | [post] this access : C1 [property Field] : Object | semmle.label | [post] this access : C1 [property Field] : Object |
321+
| Operator.cs:145:13:145:17 | [post] this access : C1 [property Field] : Object | semmle.label | [post] this access : C1 [property Field] : Object |
322+
| Operator.cs:145:21:145:37 | call to method Source<Object> : Object | semmle.label | call to method Source<Object> : Object |
323+
| Operator.cs:145:21:145:37 | call to method Source<Object> : Object | semmle.label | call to method Source<Object> : Object |
324+
| Operator.cs:150:17:150:17 | access to local variable f : Object | semmle.label | access to local variable f : Object |
325+
| Operator.cs:150:17:150:17 | access to local variable f : Object | semmle.label | access to local variable f : Object |
326+
| Operator.cs:150:21:150:37 | call to method Source<Object> : Object | semmle.label | call to method Source<Object> : Object |
327+
| Operator.cs:150:21:150:37 | call to method Source<Object> : Object | semmle.label | call to method Source<Object> : Object |
328+
| Operator.cs:151:20:151:28 | object creation of type C1 : C1 [property Field] : Object | semmle.label | object creation of type C1 : C1 [property Field] : Object |
329+
| Operator.cs:151:20:151:28 | object creation of type C1 : C1 [property Field] : Object | semmle.label | object creation of type C1 : C1 [property Field] : Object |
330+
| Operator.cs:151:27:151:27 | access to local variable f : Object | semmle.label | access to local variable f : Object |
331+
| Operator.cs:151:27:151:27 | access to local variable f : Object | semmle.label | access to local variable f : Object |
332+
| Operator.cs:157:13:157:13 | [post] access to local variable x : C1 [property Field] : Object | semmle.label | [post] access to local variable x : C1 [property Field] : Object |
333+
| Operator.cs:157:13:157:13 | [post] access to local variable x : C1 [property Field] : Object | semmle.label | [post] access to local variable x : C1 [property Field] : Object |
334+
| Operator.cs:158:18:158:18 | access to local variable x : C1 [property Field] : Object | semmle.label | access to local variable x : C1 [property Field] : Object |
335+
| Operator.cs:158:18:158:18 | access to local variable x : C1 [property Field] : Object | semmle.label | access to local variable x : C1 [property Field] : Object |
336+
| Operator.cs:158:18:158:24 | access to property Field | semmle.label | access to property Field |
337+
| Operator.cs:158:18:158:24 | access to property Field | semmle.label | access to property Field |
338+
| Operator.cs:164:13:164:13 | access to local variable x : C1 [property Field] : Object | semmle.label | access to local variable x : C1 [property Field] : Object |
339+
| Operator.cs:164:13:164:13 | access to local variable x : C1 [property Field] : Object | semmle.label | access to local variable x : C1 [property Field] : Object |
340+
| Operator.cs:164:13:164:15 | call to operator -- : C1 [property Field] : Object | semmle.label | call to operator -- : C1 [property Field] : Object |
341+
| Operator.cs:164:13:164:15 | call to operator -- : C1 [property Field] : Object | semmle.label | call to operator -- : C1 [property Field] : Object |
342+
| Operator.cs:165:18:165:18 | access to local variable x : C1 [property Field] : Object | semmle.label | access to local variable x : C1 [property Field] : Object |
343+
| Operator.cs:165:18:165:18 | access to local variable x : C1 [property Field] : Object | semmle.label | access to local variable x : C1 [property Field] : Object |
344+
| Operator.cs:165:18:165:24 | access to property Field | semmle.label | access to property Field |
345+
| Operator.cs:165:18:165:24 | access to property Field | semmle.label | access to property Field |
278346
subpaths
279347
| Operator.cs:29:17:29:17 | access to local variable x : C | Operator.cs:16:38:16:38 | x : C | Operator.cs:16:49:16:49 | access to parameter x : C | Operator.cs:29:17:29:21 | call to operator + : C |
280348
| Operator.cs:29:17:29:17 | access to local variable x : C | Operator.cs:16:38:16:38 | x : C | Operator.cs:16:49:16:49 | access to parameter x : C | Operator.cs:29:17:29:21 | call to operator + : C |
@@ -292,6 +360,8 @@ subpaths
292360
| Operator.cs:118:23:118:29 | access to local variable tainted : Object | Operator.cs:103:25:103:25 | o : Object | Operator.cs:103:16:103:16 | this [Return] : C [property Field] : Object | Operator.cs:118:17:118:30 | object creation of type C : C [property Field] : Object |
293361
| Operator.cs:119:14:119:14 | access to local variable y : C [property Field] : Object | Operator.cs:108:35:108:35 | x : C [property Field] : Object | Operator.cs:108:30:108:31 | this [Return] : C [property Field] : Object | Operator.cs:119:9:119:9 | [post] access to local variable x : C [property Field] : Object |
294362
| Operator.cs:119:14:119:14 | access to local variable y : C [property Field] : Object | Operator.cs:108:35:108:35 | x : C [property Field] : Object | Operator.cs:108:30:108:31 | this [Return] : C [property Field] : Object | Operator.cs:119:9:119:9 | [post] access to local variable x : C [property Field] : Object |
363+
| Operator.cs:151:27:151:27 | access to local variable f : Object | Operator.cs:138:26:138:26 | o : Object | Operator.cs:138:16:138:17 | this [Return] : C1 [property Field] : Object | Operator.cs:151:20:151:28 | object creation of type C1 : C1 [property Field] : Object |
364+
| Operator.cs:151:27:151:27 | access to local variable f : Object | Operator.cs:138:26:138:26 | o : Object | Operator.cs:138:16:138:17 | this [Return] : C1 [property Field] : Object | Operator.cs:151:20:151:28 | object creation of type C1 : C1 [property Field] : Object |
295365
testFailures
296366
#select
297367
| Operator.cs:30:14:30:14 | access to local variable z | Operator.cs:27:17:27:28 | call to method Source<C> : C | Operator.cs:30:14:30:14 | access to local variable z | $@ | Operator.cs:27:17:27:28 | call to method Source<C> : C | call to method Source<C> : C |
@@ -308,3 +378,7 @@ testFailures
308378
| Operator.cs:78:14:78:14 | (...) ... | Operator.cs:84:17:84:29 | call to method Source<C> : C | Operator.cs:78:14:78:14 | (...) ... | $@ | Operator.cs:84:17:84:29 | call to method Source<C> : C | call to method Source<C> : C |
309379
| Operator.cs:120:14:120:20 | access to property Field | Operator.cs:116:23:116:39 | call to method Source<Object> : Object | Operator.cs:120:14:120:20 | access to property Field | $@ | Operator.cs:116:23:116:39 | call to method Source<Object> : Object | call to method Source<Object> : Object |
310380
| Operator.cs:120:14:120:20 | access to property Field | Operator.cs:116:23:116:39 | call to method Source<Object> : Object | Operator.cs:120:14:120:20 | access to property Field | $@ | Operator.cs:116:23:116:39 | call to method Source<Object> : Object | call to method Source<Object> : Object |
381+
| Operator.cs:158:18:158:24 | access to property Field | Operator.cs:145:21:145:37 | call to method Source<Object> : Object | Operator.cs:158:18:158:24 | access to property Field | $@ | Operator.cs:145:21:145:37 | call to method Source<Object> : Object | call to method Source<Object> : Object |
382+
| Operator.cs:158:18:158:24 | access to property Field | Operator.cs:145:21:145:37 | call to method Source<Object> : Object | Operator.cs:158:18:158:24 | access to property Field | $@ | Operator.cs:145:21:145:37 | call to method Source<Object> : Object | call to method Source<Object> : Object |
383+
| Operator.cs:165:18:165:24 | access to property Field | Operator.cs:150:21:150:37 | call to method Source<Object> : Object | Operator.cs:165:18:165:24 | access to property Field | $@ | Operator.cs:150:21:150:37 | call to method Source<Object> : Object | call to method Source<Object> : Object |
384+
| Operator.cs:165:18:165:24 | access to property Field | Operator.cs:150:21:150:37 | call to method Source<Object> : Object | Operator.cs:165:18:165:24 | access to property Field | $@ | Operator.cs:150:21:150:37 | call to method Source<Object> : Object | call to method Source<Object> : Object |

0 commit comments

Comments
 (0)