Skip to content

Commit 2704819

Browse files
committed
C#: Add dataflow test for tuple-positional pattern
1 parent 9ff304c commit 2704819

File tree

4 files changed

+203
-129
lines changed

4 files changed

+203
-129
lines changed

csharp/ql/test/library-tests/dataflow/tuples/DataFlowStep.expected

Lines changed: 35 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,12 @@
5252
| Tuples.cs:43:47:43:68 | (..., ...) | Tuples.cs:43:47:43:68 | (...) ... |
5353
| Tuples.cs:44:14:44:14 | [post] access to local variable y | Tuples.cs:45:14:45:14 | access to local variable y |
5454
| Tuples.cs:44:14:44:14 | access to local variable y | Tuples.cs:45:14:45:14 | access to local variable y |
55+
| Tuples.cs:48:27:48:27 | s | Tuples.cs:65:18:65:18 | access to parameter s |
5556
| Tuples.cs:50:13:50:56 | SSA def(x) | Tuples.cs:51:17:51:17 | access to local variable x |
5657
| Tuples.cs:50:17:50:56 | (..., ...) | Tuples.cs:50:13:50:56 | SSA def(x) |
5758
| Tuples.cs:51:17:51:17 | access to local variable x | Tuples.cs:53:18:53:57 | SSA def(t) |
5859
| Tuples.cs:51:17:51:17 | access to local variable x | Tuples.cs:58:18:58:35 | (..., ...) |
59-
| Tuples.cs:51:17:51:17 | access to local variable x | Tuples.cs:65:13:65:13 | access to local variable x |
60+
| Tuples.cs:51:17:51:17 | access to local variable x | Tuples.cs:77:13:77:13 | access to local variable x |
6061
| Tuples.cs:53:18:53:57 | SSA def(t) | Tuples.cs:53:64:53:64 | access to local variable t |
6162
| Tuples.cs:53:18:53:57 | SSA qualifier def(t.Item1) | Tuples.cs:54:22:54:28 | access to field Item1 |
6263
| Tuples.cs:53:18:53:57 | SSA qualifier def(t.Item2) | Tuples.cs:55:22:55:28 | access to field Item2 |
@@ -73,19 +74,36 @@
7374
| Tuples.cs:58:23:58:23 | SSA def(a) | Tuples.cs:59:22:59:22 | access to local variable a |
7475
| Tuples.cs:58:27:58:27 | SSA def(b) | Tuples.cs:61:22:61:22 | access to local variable b |
7576
| Tuples.cs:58:30:58:30 | SSA def(c) | Tuples.cs:60:22:60:22 | access to local variable c |
76-
| Tuples.cs:65:13:65:13 | access to local variable x | Tuples.cs:65:18:65:35 | (..., ...) |
77-
| Tuples.cs:65:23:65:23 | SSA def(p) | Tuples.cs:67:18:67:18 | access to local variable p |
78-
| Tuples.cs:65:27:65:27 | SSA def(q) | Tuples.cs:69:18:69:18 | access to local variable q |
79-
| Tuples.cs:65:30:65:30 | SSA def(r) | Tuples.cs:68:18:68:18 | access to local variable r |
80-
| Tuples.cs:77:13:77:41 | SSA def(r) | Tuples.cs:78:14:78:14 | access to local variable r |
81-
| Tuples.cs:77:13:77:41 | SSA qualifier def(r.i) | Tuples.cs:78:14:78:16 | access to property i |
82-
| Tuples.cs:77:17:77:41 | object creation of type R1 | Tuples.cs:77:13:77:41 | SSA def(r) |
83-
| Tuples.cs:78:14:78:14 | [post] access to local variable r | Tuples.cs:80:22:80:22 | access to local variable r |
84-
| Tuples.cs:78:14:78:14 | access to local variable r | Tuples.cs:80:22:80:22 | access to local variable r |
85-
| Tuples.cs:80:9:80:22 | SSA def(a) | Tuples.cs:81:14:81:14 | access to local variable a |
86-
| Tuples.cs:80:9:80:22 | SSA def(b) | Tuples.cs:82:14:82:14 | access to local variable b |
87-
| Tuples.cs:80:22:80:22 | access to local variable r | Tuples.cs:80:9:80:18 | (..., ...) |
88-
| Tuples.cs:80:22:80:22 | access to local variable r | Tuples.cs:84:17:84:17 | access to local variable r |
89-
| Tuples.cs:84:17:84:17 | access to local variable r | Tuples.cs:86:18:86:27 | (..., ...) |
90-
| Tuples.cs:86:23:86:23 | SSA def(x) | Tuples.cs:87:22:87:22 | access to local variable x |
91-
| Tuples.cs:86:26:86:26 | SSA def(y) | Tuples.cs:88:22:88:22 | access to local variable y |
77+
| Tuples.cs:65:13:65:30 | SSA def(y) | Tuples.cs:66:17:66:17 | access to local variable y |
78+
| Tuples.cs:65:13:65:30 | SSA qualifier def(y.Item1) | Tuples.cs:69:22:69:28 | access to field Item1 |
79+
| Tuples.cs:65:13:65:30 | SSA qualifier def(y.Item2) | Tuples.cs:70:22:70:28 | access to field Item2 |
80+
| Tuples.cs:65:13:65:30 | SSA qualifier def(y.Item2.Item1) | Tuples.cs:72:22:72:34 | access to field Item1 |
81+
| Tuples.cs:65:13:65:30 | SSA qualifier def(y.Item2.Item2) | Tuples.cs:70:22:70:34 | access to field Item2 |
82+
| Tuples.cs:65:17:65:30 | (..., ...) | Tuples.cs:65:13:65:30 | SSA def(y) |
83+
| Tuples.cs:65:18:65:18 | access to parameter s | Tuples.cs:65:25:65:25 | access to parameter s |
84+
| Tuples.cs:66:17:66:17 | access to local variable y | Tuples.cs:68:35:68:44 | (..., ...) |
85+
| Tuples.cs:66:17:66:17 | access to local variable y | Tuples.cs:69:22:69:22 | access to local variable y |
86+
| Tuples.cs:68:40:68:40 | SSA def(b) | Tuples.cs:73:22:73:22 | access to local variable b |
87+
| Tuples.cs:68:43:68:43 | SSA def(c) | Tuples.cs:71:22:71:22 | access to local variable c |
88+
| Tuples.cs:69:22:69:22 | [post] access to local variable y | Tuples.cs:70:22:70:22 | access to local variable y |
89+
| Tuples.cs:69:22:69:22 | access to local variable y | Tuples.cs:70:22:70:22 | access to local variable y |
90+
| Tuples.cs:70:22:70:22 | [post] access to local variable y | Tuples.cs:72:22:72:22 | access to local variable y |
91+
| Tuples.cs:70:22:70:22 | access to local variable y | Tuples.cs:72:22:72:22 | access to local variable y |
92+
| Tuples.cs:70:22:70:28 | [post] access to field Item2 | Tuples.cs:72:22:72:28 | access to field Item2 |
93+
| Tuples.cs:70:22:70:28 | access to field Item2 | Tuples.cs:72:22:72:28 | access to field Item2 |
94+
| Tuples.cs:77:13:77:13 | access to local variable x | Tuples.cs:77:18:77:35 | (..., ...) |
95+
| Tuples.cs:77:23:77:23 | SSA def(p) | Tuples.cs:79:18:79:18 | access to local variable p |
96+
| Tuples.cs:77:27:77:27 | SSA def(q) | Tuples.cs:81:18:81:18 | access to local variable q |
97+
| Tuples.cs:77:30:77:30 | SSA def(r) | Tuples.cs:80:18:80:18 | access to local variable r |
98+
| Tuples.cs:89:13:89:41 | SSA def(r) | Tuples.cs:90:14:90:14 | access to local variable r |
99+
| Tuples.cs:89:13:89:41 | SSA qualifier def(r.i) | Tuples.cs:90:14:90:16 | access to property i |
100+
| Tuples.cs:89:17:89:41 | object creation of type R1 | Tuples.cs:89:13:89:41 | SSA def(r) |
101+
| Tuples.cs:90:14:90:14 | [post] access to local variable r | Tuples.cs:92:22:92:22 | access to local variable r |
102+
| Tuples.cs:90:14:90:14 | access to local variable r | Tuples.cs:92:22:92:22 | access to local variable r |
103+
| Tuples.cs:92:9:92:22 | SSA def(a) | Tuples.cs:93:14:93:14 | access to local variable a |
104+
| Tuples.cs:92:9:92:22 | SSA def(b) | Tuples.cs:94:14:94:14 | access to local variable b |
105+
| Tuples.cs:92:22:92:22 | access to local variable r | Tuples.cs:92:9:92:18 | (..., ...) |
106+
| Tuples.cs:92:22:92:22 | access to local variable r | Tuples.cs:96:17:96:17 | access to local variable r |
107+
| Tuples.cs:96:17:96:17 | access to local variable r | Tuples.cs:98:18:98:27 | (..., ...) |
108+
| Tuples.cs:98:23:98:23 | SSA def(x) | Tuples.cs:99:22:99:22 | access to local variable x |
109+
| Tuples.cs:98:26:98:26 | SSA def(y) | Tuples.cs:100:22:100:22 | access to local variable y |

csharp/ql/test/library-tests/dataflow/tuples/PrintAst.expected

Lines changed: 131 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,9 @@ Tuples.cs:
161161
# 45| -1: [LocalVariableAccess] access to local variable y
162162
# 48| 8: [Method] M4
163163
# 48| -1: [TypeMention] Void
164+
#-----| 2: (Parameters)
165+
# 48| 0: [Parameter] s
166+
# 48| -1: [TypeMention] string
164167
# 49| 4: [BlockStmt] {...}
165168
# 50| 0: [LocalVariableDeclStmt] ... ...;
166169
# 50| 0: [LocalVariableDeclAndInitExpr] (String,(Int32,String),Int32) x = ...
@@ -218,99 +221,140 @@ Tuples.cs:
218221
# 61| 0: [MethodCall] call to method Sink
219222
# 61| 0: [LocalVariableAccess] access to local variable b
220223
# 62| 9: [BreakStmt] break;
221-
# 65| 2: [IfStmt] if (...) ...
222-
# 65| 0: [IsExpr] ... is ...
223-
# 65| 0: [LocalVariableAccess] access to local variable x
224+
# 65| 2: [LocalVariableDeclStmt] ... ...;
225+
# 65| 0: [LocalVariableDeclAndInitExpr] (String,(Int32,String),Int32) y = ...
226+
# 65| -1: [TypeMention] (string, (int, string), int)
227+
# 65| 0: [LocalVariableAccess] access to local variable y
224228
# 65| 1: [TupleExpr] (..., ...)
225-
# 65| 0: [LocalVariableDeclExpr] String p
229+
# 65| 0: [ParameterAccess] access to parameter s
226230
# 65| 1: [TupleExpr] (..., ...)
227-
# 65| 0: [LocalVariableDeclExpr] Int32 q
228-
# 65| 1: [LocalVariableDeclExpr] String r
229-
# 65| 2: [DiscardExpr] _
230-
# 66| 1: [BlockStmt] {...}
231-
# 67| 0: [ExprStmt] ...;
232-
# 67| 0: [MethodCall] call to method Sink
233-
# 67| 0: [LocalVariableAccess] access to local variable p
234-
# 68| 1: [ExprStmt] ...;
235-
# 68| 0: [MethodCall] call to method Sink
236-
# 68| 0: [LocalVariableAccess] access to local variable r
237-
# 69| 2: [ExprStmt] ...;
238-
# 69| 0: [MethodCall] call to method Sink
239-
# 69| 0: [LocalVariableAccess] access to local variable q
240-
# 73| 9: [Record] R1
241-
# 73| 12: [NEOperator] !=
231+
# 65| 0: [IntLiteral] 2
232+
# 65| 1: [ParameterAccess] access to parameter s
233+
# 65| 2: [IntLiteral] 3
234+
# 66| 3: [SwitchStmt] switch (...) {...}
235+
# 66| 0: [LocalVariableAccess] access to local variable y
236+
# 68| 0: [CaseStmt] case ...:
237+
# 68| 0: [RecursivePatternExpr] { ... }
238+
# 68| 2: [PositionalPatternExpr] ( ... )
239+
# 68| 0: [ConstantPatternExpr,StringLiteral] "taint source"
240+
# 68| 1: [TupleExpr] (..., ...)
241+
# 68| 0: [LocalVariableDeclExpr] Int32 b
242+
# 68| 1: [LocalVariableDeclExpr] String c
243+
# 68| 2: [DiscardPatternExpr] _
244+
# 69| 1: [ExprStmt] ...;
245+
# 69| 0: [MethodCall] call to method Sink
246+
# 69| 0: [FieldAccess] access to field Item1
247+
# 69| -1: [LocalVariableAccess] access to local variable y
248+
# 70| 2: [ExprStmt] ...;
249+
# 70| 0: [MethodCall] call to method Sink
250+
# 70| 0: [FieldAccess] access to field Item2
251+
# 70| -1: [FieldAccess] access to field Item2
252+
# 70| -1: [LocalVariableAccess] access to local variable y
253+
# 71| 3: [ExprStmt] ...;
254+
# 71| 0: [MethodCall] call to method Sink
255+
# 71| 0: [LocalVariableAccess] access to local variable c
256+
# 72| 4: [ExprStmt] ...;
257+
# 72| 0: [MethodCall] call to method Sink
258+
# 72| 0: [FieldAccess] access to field Item1
259+
# 72| -1: [FieldAccess] access to field Item2
260+
# 72| -1: [LocalVariableAccess] access to local variable y
261+
# 73| 5: [ExprStmt] ...;
262+
# 73| 0: [MethodCall] call to method Sink
263+
# 73| 0: [LocalVariableAccess] access to local variable b
264+
# 74| 6: [BreakStmt] break;
265+
# 77| 4: [IfStmt] if (...) ...
266+
# 77| 0: [IsExpr] ... is ...
267+
# 77| 0: [LocalVariableAccess] access to local variable x
268+
# 77| 1: [TupleExpr] (..., ...)
269+
# 77| 0: [LocalVariableDeclExpr] String p
270+
# 77| 1: [TupleExpr] (..., ...)
271+
# 77| 0: [LocalVariableDeclExpr] Int32 q
272+
# 77| 1: [LocalVariableDeclExpr] String r
273+
# 77| 2: [DiscardExpr] _
274+
# 78| 1: [BlockStmt] {...}
275+
# 79| 0: [ExprStmt] ...;
276+
# 79| 0: [MethodCall] call to method Sink
277+
# 79| 0: [LocalVariableAccess] access to local variable p
278+
# 80| 1: [ExprStmt] ...;
279+
# 80| 0: [MethodCall] call to method Sink
280+
# 80| 0: [LocalVariableAccess] access to local variable r
281+
# 81| 2: [ExprStmt] ...;
282+
# 81| 0: [MethodCall] call to method Sink
283+
# 81| 0: [LocalVariableAccess] access to local variable q
284+
# 85| 9: [Record] R1
285+
# 85| 12: [NEOperator] !=
242286
#-----| 2: (Parameters)
243-
# 73| 0: [Parameter] r1
244-
# 73| 1: [Parameter] r2
245-
# 73| 13: [EQOperator] ==
287+
# 85| 0: [Parameter] r1
288+
# 85| 1: [Parameter] r2
289+
# 85| 13: [EQOperator] ==
246290
#-----| 2: (Parameters)
247-
# 73| 0: [Parameter] r1
248-
# 73| 1: [Parameter] r2
249-
# 73| 14: [Property] EqualityContract
250-
# 73| 3: [Getter] get_EqualityContract
251-
# 73| 15: [InstanceConstructor] R1
291+
# 85| 0: [Parameter] r1
292+
# 85| 1: [Parameter] r2
293+
# 85| 14: [Property] EqualityContract
294+
# 85| 3: [Getter] get_EqualityContract
295+
# 85| 15: [InstanceConstructor] R1
252296
#-----| 2: (Parameters)
253-
# 73| 0: [Parameter] i
254-
# 73| -1: [TypeMention] string
255-
# 73| 1: [Parameter] j
256-
# 73| -1: [TypeMention] int
257-
# 73| 16: [Property] i
258-
# 73| 3: [Getter] get_i
259-
# 73| 4: [Setter] set_i
297+
# 85| 0: [Parameter] i
298+
# 85| -1: [TypeMention] string
299+
# 85| 1: [Parameter] j
300+
# 85| -1: [TypeMention] int
301+
# 85| 16: [Property] i
302+
# 85| 3: [Getter] get_i
303+
# 85| 4: [Setter] set_i
260304
#-----| 2: (Parameters)
261-
# 73| 0: [Parameter] value
262-
# 73| 17: [Property] j
263-
# 73| 3: [Getter] get_j
264-
# 73| 4: [Setter] set_j
305+
# 85| 0: [Parameter] value
306+
# 85| 17: [Property] j
307+
# 85| 3: [Getter] get_j
308+
# 85| 4: [Setter] set_j
265309
#-----| 2: (Parameters)
266-
# 73| 0: [Parameter] value
267-
# 75| 10: [Method] M5
268-
# 75| -1: [TypeMention] Void
269-
# 76| 4: [BlockStmt] {...}
270-
# 77| 0: [LocalVariableDeclStmt] ... ...;
271-
# 77| 0: [LocalVariableDeclAndInitExpr] R1 r = ...
272-
# 77| -1: [TypeMention] R1
273-
# 77| 0: [LocalVariableAccess] access to local variable r
274-
# 77| 1: [ObjectCreation] object creation of type R1
275-
# 77| -1: [TypeMention] R1
276-
# 77| 0: [StringLiteral] "taint source"
277-
# 77| 1: [IntLiteral] 1
278-
# 78| 1: [ExprStmt] ...;
279-
# 78| 0: [MethodCall] call to method Sink
280-
# 78| 0: [PropertyCall] access to property i
281-
# 78| -1: [LocalVariableAccess] access to local variable r
282-
# 80| 2: [ExprStmt] ...;
283-
# 80| 0: [AssignExpr] ... = ...
284-
# 80| 0: [TupleExpr] (..., ...)
285-
# 80| 0: [LocalVariableDeclExpr] String a
286-
# 80| 1: [LocalVariableDeclExpr] Int32 b
287-
# 80| 1: [LocalVariableAccess] access to local variable r
288-
# 81| 3: [ExprStmt] ...;
289-
# 81| 0: [MethodCall] call to method Sink
290-
# 81| 0: [LocalVariableAccess] access to local variable a
291-
# 82| 4: [ExprStmt] ...;
292-
# 82| 0: [MethodCall] call to method Sink
293-
# 82| 0: [LocalVariableAccess] access to local variable b
294-
# 84| 5: [SwitchStmt] switch (...) {...}
295-
# 84| 0: [LocalVariableAccess] access to local variable r
296-
# 86| 0: [CaseStmt] case ...:
297-
# 86| 0: [TupleExpr] (..., ...)
298-
# 86| 0: [LocalVariableDeclExpr] String x
299-
# 86| 1: [LocalVariableDeclExpr] Int32 y
300-
# 87| 1: [ExprStmt] ...;
301-
# 87| 0: [MethodCall] call to method Sink
302-
# 87| 0: [LocalVariableAccess] access to local variable x
303-
# 88| 2: [ExprStmt] ...;
304-
# 88| 0: [MethodCall] call to method Sink
305-
# 88| 0: [LocalVariableAccess] access to local variable y
306-
# 89| 3: [BreakStmt] break;
307-
# 93| 11: [Method] Sink
308-
# 93| -1: [TypeMention] Void
310+
# 85| 0: [Parameter] value
311+
# 87| 10: [Method] M5
312+
# 87| -1: [TypeMention] Void
313+
# 88| 4: [BlockStmt] {...}
314+
# 89| 0: [LocalVariableDeclStmt] ... ...;
315+
# 89| 0: [LocalVariableDeclAndInitExpr] R1 r = ...
316+
# 89| -1: [TypeMention] R1
317+
# 89| 0: [LocalVariableAccess] access to local variable r
318+
# 89| 1: [ObjectCreation] object creation of type R1
319+
# 89| -1: [TypeMention] R1
320+
# 89| 0: [StringLiteral] "taint source"
321+
# 89| 1: [IntLiteral] 1
322+
# 90| 1: [ExprStmt] ...;
323+
# 90| 0: [MethodCall] call to method Sink
324+
# 90| 0: [PropertyCall] access to property i
325+
# 90| -1: [LocalVariableAccess] access to local variable r
326+
# 92| 2: [ExprStmt] ...;
327+
# 92| 0: [AssignExpr] ... = ...
328+
# 92| 0: [TupleExpr] (..., ...)
329+
# 92| 0: [LocalVariableDeclExpr] String a
330+
# 92| 1: [LocalVariableDeclExpr] Int32 b
331+
# 92| 1: [LocalVariableAccess] access to local variable r
332+
# 93| 3: [ExprStmt] ...;
333+
# 93| 0: [MethodCall] call to method Sink
334+
# 93| 0: [LocalVariableAccess] access to local variable a
335+
# 94| 4: [ExprStmt] ...;
336+
# 94| 0: [MethodCall] call to method Sink
337+
# 94| 0: [LocalVariableAccess] access to local variable b
338+
# 96| 5: [SwitchStmt] switch (...) {...}
339+
# 96| 0: [LocalVariableAccess] access to local variable r
340+
# 98| 0: [CaseStmt] case ...:
341+
# 98| 0: [TupleExpr] (..., ...)
342+
# 98| 0: [LocalVariableDeclExpr] String x
343+
# 98| 1: [LocalVariableDeclExpr] Int32 y
344+
# 99| 1: [ExprStmt] ...;
345+
# 99| 0: [MethodCall] call to method Sink
346+
# 99| 0: [LocalVariableAccess] access to local variable x
347+
# 100| 2: [ExprStmt] ...;
348+
# 100| 0: [MethodCall] call to method Sink
349+
# 100| 0: [LocalVariableAccess] access to local variable y
350+
# 101| 3: [BreakStmt] break;
351+
# 105| 11: [Method] Sink
352+
# 105| -1: [TypeMention] Void
309353
#-----| 1: (Type parameters)
310-
# 93| 0: [TypeParameter] T
354+
# 105| 0: [TypeParameter] T
311355
#-----| 2: (Parameters)
312-
# 93| 0: [Parameter] x
313-
# 93| -1: [TypeMention] T
314-
# 93| 4: [BlockStmt] {...}
315-
# 96| [NamespaceDeclaration] namespace ... { ... }
316-
# 98| 1: [Class] IsExternalInit
356+
# 105| 0: [Parameter] x
357+
# 105| -1: [TypeMention] T
358+
# 105| 4: [BlockStmt] {...}
359+
# 108| [NamespaceDeclaration] namespace ... { ... }
360+
# 110| 1: [Class] IsExternalInit

csharp/ql/test/library-tests/dataflow/tuples/Tuples.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ static void M3()
4545
Sink(y.Item2);
4646
}
4747

48-
static void M4()
48+
static void M4(string s)
4949
{
5050
var x = ("taint source", (2, "taint source"), 3);
5151
switch (x)
@@ -62,6 +62,18 @@ static void M4()
6262
break;
6363
}
6464

65+
var y = (s, (2, s), 3);
66+
switch (y)
67+
{
68+
case ("taint source", var (b, c), _):
69+
Sink(y.Item1); // Tainted, not found
70+
Sink(y.Item2.Item2); // Tainted, not found
71+
Sink(c); // Tainted, not found
72+
Sink(y.Item2.Item1);
73+
Sink(b);
74+
break;
75+
}
76+
6577
if (x is var (p, (q, r), _))
6678
{
6779
Sink(p); // Tainted

0 commit comments

Comments
 (0)