Skip to content

Commit 31816af

Browse files
committed
C#: Add missing data-flow for switch expressions
1 parent 9c503c1 commit 31816af

File tree

6 files changed

+24
-2
lines changed

6 files changed

+24
-2
lines changed

csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,10 @@ module LocalFlow {
171171
e1 = e2.(ArrayCreation).getInitializer() and
172172
scope = e2 and
173173
isSuccessor = false
174+
or
175+
e1 = e2.(SwitchExpr).getACase().getBody() and
176+
scope = e2 and
177+
isSuccessor = false
174178
)
175179
}
176180

csharp/ql/test/library-tests/dataflow/global/DataFlow.expected

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,3 +60,5 @@
6060
| Splitting.cs:34:19:34:19 | access to local variable x |
6161
| Splitting.cs:41:19:41:19 | access to local variable s |
6262
| Splitting.cs:43:19:43:19 | access to local variable s |
63+
| Splitting.cs:50:19:50:19 | access to local variable s |
64+
| Splitting.cs:52:19:52:19 | access to local variable s |

csharp/ql/test/library-tests/dataflow/global/DataFlowPath.expected

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,8 @@ edges
242242
| Splitting.cs:31:19:31:25 | [b (line 24): true] access to parameter tainted : String | Splitting.cs:31:17:31:26 | [b (line 24): true] dynamic access to element : String |
243243
| Splitting.cs:39:21:39:34 | [b (line 37): true] "taint source" : String | Splitting.cs:41:19:41:19 | access to local variable s |
244244
| Splitting.cs:39:21:39:34 | [b (line 37): true] "taint source" : String | Splitting.cs:43:19:43:19 | access to local variable s |
245+
| Splitting.cs:48:36:48:49 | "taint source" : String | Splitting.cs:50:19:50:19 | access to local variable s |
246+
| Splitting.cs:48:36:48:49 | "taint source" : String | Splitting.cs:52:19:52:19 | access to local variable s |
245247
nodes
246248
| Capture.cs:7:20:7:26 | tainted : String | semmle.label | tainted : String |
247249
| Capture.cs:12:19:12:24 | access to local variable sink27 | semmle.label | access to local variable sink27 |
@@ -448,6 +450,9 @@ nodes
448450
| Splitting.cs:39:21:39:34 | [b (line 37): true] "taint source" : String | semmle.label | [b (line 37): true] "taint source" : String |
449451
| Splitting.cs:41:19:41:19 | access to local variable s | semmle.label | access to local variable s |
450452
| Splitting.cs:43:19:43:19 | access to local variable s | semmle.label | access to local variable s |
453+
| Splitting.cs:48:36:48:49 | "taint source" : String | semmle.label | "taint source" : String |
454+
| Splitting.cs:50:19:50:19 | access to local variable s | semmle.label | access to local variable s |
455+
| Splitting.cs:52:19:52:19 | access to local variable s | semmle.label | access to local variable s |
451456
#select
452457
| Splitting.cs:32:15:32:15 | [b (line 24): false] access to local variable x | Splitting.cs:24:28:24:34 | tainted : String | Splitting.cs:32:15:32:15 | [b (line 24): false] access to local variable x | [b (line 24): false] access to local variable x |
453458
| Splitting.cs:32:15:32:15 | [b (line 24): true] access to local variable x | Splitting.cs:24:28:24:34 | tainted : String | Splitting.cs:32:15:32:15 | [b (line 24): true] access to local variable x | [b (line 24): true] access to local variable x |
@@ -456,6 +461,8 @@ nodes
456461
| GlobalDataFlow.cs:19:15:19:29 | access to field SinkField0 | GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:19:15:19:29 | access to field SinkField0 | access to field SinkField0 |
457462
| Splitting.cs:41:19:41:19 | access to local variable s | Splitting.cs:39:21:39:34 | [b (line 37): true] "taint source" : String | Splitting.cs:41:19:41:19 | access to local variable s | access to local variable s |
458463
| Splitting.cs:43:19:43:19 | access to local variable s | Splitting.cs:39:21:39:34 | [b (line 37): true] "taint source" : String | Splitting.cs:43:19:43:19 | access to local variable s | access to local variable s |
464+
| Splitting.cs:50:19:50:19 | access to local variable s | Splitting.cs:48:36:48:49 | "taint source" : String | Splitting.cs:50:19:50:19 | access to local variable s | access to local variable s |
465+
| Splitting.cs:52:19:52:19 | access to local variable s | Splitting.cs:48:36:48:49 | "taint source" : String | Splitting.cs:52:19:52:19 | access to local variable s | access to local variable s |
459466
| GlobalDataFlow.cs:72:15:72:19 | access to local variable sink0 | GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:72:15:72:19 | access to local variable sink0 | access to local variable sink0 |
460467
| GlobalDataFlow.cs:74:15:74:19 | access to local variable sink1 | GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:74:15:74:19 | access to local variable sink1 | access to local variable sink1 |
461468
| GlobalDataFlow.cs:191:15:191:20 | access to local variable sink10 | GlobalDataFlow.cs:338:16:338:29 | "taint source" : String | GlobalDataFlow.cs:191:15:191:20 | access to local variable sink10 | access to local variable sink10 |

csharp/ql/test/library-tests/dataflow/global/Splitting.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,8 @@ void M4(bool b)
4747
{
4848
var s = b switch { true => "taint source", false => "not tainted" };
4949
if (b)
50-
Check(s); // flow [MISSING]
50+
Check(s); // flow
5151
else
52-
Check(s); // no flow
52+
Check(s); // no flow [FALSE POSITIVE]
5353
}
5454
}

csharp/ql/test/library-tests/dataflow/global/TaintTracking.expected

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,3 +64,5 @@
6464
| Splitting.cs:34:19:34:19 | access to local variable x |
6565
| Splitting.cs:41:19:41:19 | access to local variable s |
6666
| Splitting.cs:43:19:43:19 | access to local variable s |
67+
| Splitting.cs:50:19:50:19 | access to local variable s |
68+
| Splitting.cs:52:19:52:19 | access to local variable s |

csharp/ql/test/library-tests/dataflow/global/TaintTrackingPath.expected

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,8 @@ edges
249249
| Splitting.cs:31:19:31:25 | [b (line 24): true] access to parameter tainted : String | Splitting.cs:31:17:31:26 | [b (line 24): true] dynamic access to element : String |
250250
| Splitting.cs:39:21:39:34 | [b (line 37): true] "taint source" : String | Splitting.cs:41:19:41:19 | access to local variable s |
251251
| Splitting.cs:39:21:39:34 | [b (line 37): true] "taint source" : String | Splitting.cs:43:19:43:19 | access to local variable s |
252+
| Splitting.cs:48:36:48:49 | "taint source" : String | Splitting.cs:50:19:50:19 | access to local variable s |
253+
| Splitting.cs:48:36:48:49 | "taint source" : String | Splitting.cs:52:19:52:19 | access to local variable s |
252254
nodes
253255
| Capture.cs:7:20:7:26 | tainted : String | semmle.label | tainted : String |
254256
| Capture.cs:12:19:12:24 | access to local variable sink27 | semmle.label | access to local variable sink27 |
@@ -462,6 +464,9 @@ nodes
462464
| Splitting.cs:39:21:39:34 | [b (line 37): true] "taint source" : String | semmle.label | [b (line 37): true] "taint source" : String |
463465
| Splitting.cs:41:19:41:19 | access to local variable s | semmle.label | access to local variable s |
464466
| Splitting.cs:43:19:43:19 | access to local variable s | semmle.label | access to local variable s |
467+
| Splitting.cs:48:36:48:49 | "taint source" : String | semmle.label | "taint source" : String |
468+
| Splitting.cs:50:19:50:19 | access to local variable s | semmle.label | access to local variable s |
469+
| Splitting.cs:52:19:52:19 | access to local variable s | semmle.label | access to local variable s |
465470
#select
466471
| Capture.cs:12:19:12:24 | access to local variable sink27 | Capture.cs:7:20:7:26 | tainted : String | Capture.cs:12:19:12:24 | access to local variable sink27 | access to local variable sink27 |
467472
| Capture.cs:21:23:21:28 | access to local variable sink28 | Capture.cs:7:20:7:26 | tainted : String | Capture.cs:21:23:21:28 | access to local variable sink28 | access to local variable sink28 |
@@ -529,3 +534,5 @@ nodes
529534
| Splitting.cs:34:19:34:19 | access to local variable x | Splitting.cs:24:28:24:34 | tainted : String | Splitting.cs:34:19:34:19 | access to local variable x | access to local variable x |
530535
| Splitting.cs:41:19:41:19 | access to local variable s | Splitting.cs:39:21:39:34 | [b (line 37): true] "taint source" : String | Splitting.cs:41:19:41:19 | access to local variable s | access to local variable s |
531536
| Splitting.cs:43:19:43:19 | access to local variable s | Splitting.cs:39:21:39:34 | [b (line 37): true] "taint source" : String | Splitting.cs:43:19:43:19 | access to local variable s | access to local variable s |
537+
| Splitting.cs:50:19:50:19 | access to local variable s | Splitting.cs:48:36:48:49 | "taint source" : String | Splitting.cs:50:19:50:19 | access to local variable s | access to local variable s |
538+
| Splitting.cs:52:19:52:19 | access to local variable s | Splitting.cs:48:36:48:49 | "taint source" : String | Splitting.cs:52:19:52:19 | access to local variable s | access to local variable s |

0 commit comments

Comments
 (0)