Skip to content

Commit ddd05b5

Browse files
committed
Rust: Never skip match scrutinee/patterns in data flow
1 parent 9f2b436 commit ddd05b5

File tree

4 files changed

+53
-16
lines changed

4 files changed

+53
-16
lines changed

rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -859,6 +859,11 @@ module RustDataFlow implements InputSig<Location> {
859859
node.getCfgNode() = any(LetStmtCfgNode s).getPat()
860860
or
861861
node.getCfgNode() = any(AssignmentExprCfgNode a).getLhs()
862+
or
863+
exists(MatchExprCfgNode match |
864+
node.asExpr() = match.getScrutinee() or
865+
node.asExpr() = match.getArmPat(_)
866+
)
862867
}
863868

864869
class DataFlowExpr = ExprCfgNode;

rust/ql/test/library-tests/dataflow/barrier/inline-flow.expected

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
models
22
edges
3-
| main.rs:9:13:9:19 | ...: ... | main.rs:9:30:14:1 | { ... } | provenance | |
3+
| main.rs:9:13:9:19 | ...: ... | main.rs:10:11:10:11 | s | provenance | |
4+
| main.rs:10:11:10:11 | s | main.rs:9:30:14:1 | { ... } | provenance | |
45
| main.rs:21:9:21:9 | s | main.rs:22:10:22:10 | s | provenance | |
56
| main.rs:21:13:21:21 | source(...) | main.rs:21:9:21:9 | s | provenance | |
67
| main.rs:26:9:26:9 | s | main.rs:27:22:27:22 | s | provenance | |
@@ -14,6 +15,7 @@ edges
1415
nodes
1516
| main.rs:9:13:9:19 | ...: ... | semmle.label | ...: ... |
1617
| main.rs:9:30:14:1 | { ... } | semmle.label | { ... } |
18+
| main.rs:10:11:10:11 | s | semmle.label | s |
1719
| main.rs:17:10:17:18 | source(...) | semmle.label | source(...) |
1820
| main.rs:21:9:21:9 | s | semmle.label | s |
1921
| main.rs:21:13:21:21 | source(...) | semmle.label | source(...) |

rust/ql/test/library-tests/dataflow/local/inline-flow.expected

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,16 @@ edges
3838
| main.rs:148:12:148:21 | source(...) | main.rs:147:13:150:5 | Point {...} [Point.x] | provenance | |
3939
| main.rs:151:9:151:28 | Point {...} [Point.x] | main.rs:151:20:151:20 | a | provenance | |
4040
| main.rs:151:20:151:20 | a | main.rs:152:10:152:10 | a | provenance | |
41-
| main.rs:198:9:198:10 | s1 [Some] | main.rs:201:9:201:23 | ...::Some(...) [Some] | provenance | |
41+
| main.rs:198:9:198:10 | s1 [Some] | main.rs:200:11:200:12 | s1 [Some] | provenance | |
4242
| main.rs:198:14:198:37 | ...::Some(...) [Some] | main.rs:198:9:198:10 | s1 [Some] | provenance | |
4343
| main.rs:198:27:198:36 | source(...) | main.rs:198:14:198:37 | ...::Some(...) [Some] | provenance | |
44+
| main.rs:200:11:200:12 | s1 [Some] | main.rs:201:9:201:23 | ...::Some(...) [Some] | provenance | |
4445
| main.rs:201:9:201:23 | ...::Some(...) [Some] | main.rs:201:22:201:22 | n | provenance | |
4546
| main.rs:201:22:201:22 | n | main.rs:201:33:201:33 | n | provenance | |
46-
| main.rs:211:9:211:10 | s1 [Some] | main.rs:214:9:214:15 | Some(...) [Some] | provenance | |
47+
| main.rs:211:9:211:10 | s1 [Some] | main.rs:213:11:213:12 | s1 [Some] | provenance | |
4748
| main.rs:211:14:211:29 | Some(...) [Some] | main.rs:211:9:211:10 | s1 [Some] | provenance | |
4849
| main.rs:211:19:211:28 | source(...) | main.rs:211:14:211:29 | Some(...) [Some] | provenance | |
50+
| main.rs:213:11:213:12 | s1 [Some] | main.rs:214:9:214:15 | Some(...) [Some] | provenance | |
4951
| main.rs:214:9:214:15 | Some(...) [Some] | main.rs:214:14:214:14 | n | provenance | |
5052
| main.rs:214:14:214:14 | n | main.rs:214:25:214:25 | n | provenance | |
5153
| main.rs:224:9:224:10 | s1 [Some] | main.rs:225:10:225:11 | s1 [Some] | provenance | |
@@ -64,36 +66,44 @@ edges
6466
| main.rs:241:9:241:10 | i1 | main.rs:243:10:243:11 | i1 | provenance | |
6567
| main.rs:241:14:241:15 | s1 [Ok] | main.rs:241:14:241:16 | TryExpr | provenance | |
6668
| main.rs:241:14:241:16 | TryExpr | main.rs:241:9:241:10 | i1 | provenance | |
67-
| main.rs:256:9:256:10 | s1 [A] | main.rs:259:9:259:25 | ...::A(...) [A] | provenance | |
68-
| main.rs:256:9:256:10 | s1 [A] | main.rs:263:9:263:25 | ...::A(...) [A] | provenance | |
69+
| main.rs:256:9:256:10 | s1 [A] | main.rs:258:11:258:12 | s1 [A] | provenance | |
6970
| main.rs:256:14:256:39 | ...::A(...) [A] | main.rs:256:9:256:10 | s1 [A] | provenance | |
7071
| main.rs:256:29:256:38 | source(...) | main.rs:256:14:256:39 | ...::A(...) [A] | provenance | |
72+
| main.rs:258:11:258:12 | s1 [A] | main.rs:259:9:259:25 | ...::A(...) [A] | provenance | |
73+
| main.rs:258:11:258:12 | s1 [A] | main.rs:262:11:262:12 | s1 [A] | provenance | |
7174
| main.rs:259:9:259:25 | ...::A(...) [A] | main.rs:259:24:259:24 | n | provenance | |
7275
| main.rs:259:24:259:24 | n | main.rs:259:35:259:35 | n | provenance | |
76+
| main.rs:262:11:262:12 | s1 [A] | main.rs:263:9:263:25 | ...::A(...) [A] | provenance | |
7377
| main.rs:263:9:263:25 | ...::A(...) [A] | main.rs:263:24:263:24 | n | provenance | |
7478
| main.rs:263:24:263:24 | n | main.rs:263:55:263:55 | n | provenance | |
75-
| main.rs:274:9:274:10 | s1 [A] | main.rs:277:9:277:12 | A(...) [A] | provenance | |
76-
| main.rs:274:9:274:10 | s1 [A] | main.rs:281:9:281:12 | A(...) [A] | provenance | |
79+
| main.rs:274:9:274:10 | s1 [A] | main.rs:276:11:276:12 | s1 [A] | provenance | |
7780
| main.rs:274:14:274:26 | A(...) [A] | main.rs:274:9:274:10 | s1 [A] | provenance | |
7881
| main.rs:274:16:274:25 | source(...) | main.rs:274:14:274:26 | A(...) [A] | provenance | |
82+
| main.rs:276:11:276:12 | s1 [A] | main.rs:277:9:277:12 | A(...) [A] | provenance | |
83+
| main.rs:276:11:276:12 | s1 [A] | main.rs:280:11:280:12 | s1 [A] | provenance | |
7984
| main.rs:277:9:277:12 | A(...) [A] | main.rs:277:11:277:11 | n | provenance | |
8085
| main.rs:277:11:277:11 | n | main.rs:277:22:277:22 | n | provenance | |
86+
| main.rs:280:11:280:12 | s1 [A] | main.rs:281:9:281:12 | A(...) [A] | provenance | |
8187
| main.rs:281:9:281:12 | A(...) [A] | main.rs:281:11:281:11 | n | provenance | |
8288
| main.rs:281:11:281:11 | n | main.rs:281:29:281:29 | n | provenance | |
83-
| main.rs:295:9:295:10 | s1 [C] | main.rs:300:9:300:38 | ...::C {...} [C] | provenance | |
84-
| main.rs:295:9:295:10 | s1 [C] | main.rs:304:9:304:38 | ...::C {...} [C] | provenance | |
89+
| main.rs:295:9:295:10 | s1 [C] | main.rs:299:11:299:12 | s1 [C] | provenance | |
8590
| main.rs:295:14:297:5 | ...::C {...} [C] | main.rs:295:9:295:10 | s1 [C] | provenance | |
8691
| main.rs:296:18:296:27 | source(...) | main.rs:295:14:297:5 | ...::C {...} [C] | provenance | |
92+
| main.rs:299:11:299:12 | s1 [C] | main.rs:300:9:300:38 | ...::C {...} [C] | provenance | |
93+
| main.rs:299:11:299:12 | s1 [C] | main.rs:303:11:303:12 | s1 [C] | provenance | |
8794
| main.rs:300:9:300:38 | ...::C {...} [C] | main.rs:300:36:300:36 | n | provenance | |
8895
| main.rs:300:36:300:36 | n | main.rs:300:48:300:48 | n | provenance | |
96+
| main.rs:303:11:303:12 | s1 [C] | main.rs:304:9:304:38 | ...::C {...} [C] | provenance | |
8997
| main.rs:304:9:304:38 | ...::C {...} [C] | main.rs:304:36:304:36 | n | provenance | |
9098
| main.rs:304:36:304:36 | n | main.rs:304:81:304:81 | n | provenance | |
91-
| main.rs:315:9:315:10 | s1 [C] | main.rs:320:9:320:24 | C {...} [C] | provenance | |
92-
| main.rs:315:9:315:10 | s1 [C] | main.rs:324:9:324:24 | C {...} [C] | provenance | |
99+
| main.rs:315:9:315:10 | s1 [C] | main.rs:319:11:319:12 | s1 [C] | provenance | |
93100
| main.rs:315:14:317:5 | C {...} [C] | main.rs:315:9:315:10 | s1 [C] | provenance | |
94101
| main.rs:316:18:316:27 | source(...) | main.rs:315:14:317:5 | C {...} [C] | provenance | |
102+
| main.rs:319:11:319:12 | s1 [C] | main.rs:320:9:320:24 | C {...} [C] | provenance | |
103+
| main.rs:319:11:319:12 | s1 [C] | main.rs:323:11:323:12 | s1 [C] | provenance | |
95104
| main.rs:320:9:320:24 | C {...} [C] | main.rs:320:22:320:22 | n | provenance | |
96105
| main.rs:320:22:320:22 | n | main.rs:320:34:320:34 | n | provenance | |
106+
| main.rs:323:11:323:12 | s1 [C] | main.rs:324:9:324:24 | C {...} [C] | provenance | |
97107
| main.rs:324:9:324:24 | C {...} [C] | main.rs:324:22:324:22 | n | provenance | |
98108
| main.rs:324:22:324:22 | n | main.rs:324:53:324:53 | n | provenance | |
99109
| main.rs:336:9:336:12 | arr1 [array[]] | main.rs:337:14:337:17 | arr1 [array[]] | provenance | |
@@ -113,9 +123,10 @@ edges
113123
| main.rs:350:23:350:32 | source(...) | main.rs:350:16:350:33 | [...] [array[]] | provenance | |
114124
| main.rs:351:9:351:10 | n1 | main.rs:352:14:352:15 | n1 | provenance | |
115125
| main.rs:351:15:351:18 | arr1 [array[]] | main.rs:351:9:351:10 | n1 | provenance | |
116-
| main.rs:362:9:362:12 | arr1 [array[]] | main.rs:364:9:364:17 | SlicePat [array[]] | provenance | |
126+
| main.rs:362:9:362:12 | arr1 [array[]] | main.rs:363:11:363:14 | arr1 [array[]] | provenance | |
117127
| main.rs:362:16:362:33 | [...] [array[]] | main.rs:362:9:362:12 | arr1 [array[]] | provenance | |
118128
| main.rs:362:23:362:32 | source(...) | main.rs:362:16:362:33 | [...] [array[]] | provenance | |
129+
| main.rs:363:11:363:14 | arr1 [array[]] | main.rs:364:9:364:17 | SlicePat [array[]] | provenance | |
119130
| main.rs:364:9:364:17 | SlicePat [array[]] | main.rs:364:10:364:10 | a | provenance | |
120131
| main.rs:364:9:364:17 | SlicePat [array[]] | main.rs:364:13:364:13 | b | provenance | |
121132
| main.rs:364:9:364:17 | SlicePat [array[]] | main.rs:364:16:364:16 | c | provenance | |
@@ -181,12 +192,14 @@ nodes
181192
| main.rs:198:9:198:10 | s1 [Some] | semmle.label | s1 [Some] |
182193
| main.rs:198:14:198:37 | ...::Some(...) [Some] | semmle.label | ...::Some(...) [Some] |
183194
| main.rs:198:27:198:36 | source(...) | semmle.label | source(...) |
195+
| main.rs:200:11:200:12 | s1 [Some] | semmle.label | s1 [Some] |
184196
| main.rs:201:9:201:23 | ...::Some(...) [Some] | semmle.label | ...::Some(...) [Some] |
185197
| main.rs:201:22:201:22 | n | semmle.label | n |
186198
| main.rs:201:33:201:33 | n | semmle.label | n |
187199
| main.rs:211:9:211:10 | s1 [Some] | semmle.label | s1 [Some] |
188200
| main.rs:211:14:211:29 | Some(...) [Some] | semmle.label | Some(...) [Some] |
189201
| main.rs:211:19:211:28 | source(...) | semmle.label | source(...) |
202+
| main.rs:213:11:213:12 | s1 [Some] | semmle.label | s1 [Some] |
190203
| main.rs:214:9:214:15 | Some(...) [Some] | semmle.label | Some(...) [Some] |
191204
| main.rs:214:14:214:14 | n | semmle.label | n |
192205
| main.rs:214:25:214:25 | n | semmle.label | n |
@@ -212,36 +225,44 @@ nodes
212225
| main.rs:256:9:256:10 | s1 [A] | semmle.label | s1 [A] |
213226
| main.rs:256:14:256:39 | ...::A(...) [A] | semmle.label | ...::A(...) [A] |
214227
| main.rs:256:29:256:38 | source(...) | semmle.label | source(...) |
228+
| main.rs:258:11:258:12 | s1 [A] | semmle.label | s1 [A] |
215229
| main.rs:259:9:259:25 | ...::A(...) [A] | semmle.label | ...::A(...) [A] |
216230
| main.rs:259:24:259:24 | n | semmle.label | n |
217231
| main.rs:259:35:259:35 | n | semmle.label | n |
232+
| main.rs:262:11:262:12 | s1 [A] | semmle.label | s1 [A] |
218233
| main.rs:263:9:263:25 | ...::A(...) [A] | semmle.label | ...::A(...) [A] |
219234
| main.rs:263:24:263:24 | n | semmle.label | n |
220235
| main.rs:263:55:263:55 | n | semmle.label | n |
221236
| main.rs:274:9:274:10 | s1 [A] | semmle.label | s1 [A] |
222237
| main.rs:274:14:274:26 | A(...) [A] | semmle.label | A(...) [A] |
223238
| main.rs:274:16:274:25 | source(...) | semmle.label | source(...) |
239+
| main.rs:276:11:276:12 | s1 [A] | semmle.label | s1 [A] |
224240
| main.rs:277:9:277:12 | A(...) [A] | semmle.label | A(...) [A] |
225241
| main.rs:277:11:277:11 | n | semmle.label | n |
226242
| main.rs:277:22:277:22 | n | semmle.label | n |
243+
| main.rs:280:11:280:12 | s1 [A] | semmle.label | s1 [A] |
227244
| main.rs:281:9:281:12 | A(...) [A] | semmle.label | A(...) [A] |
228245
| main.rs:281:11:281:11 | n | semmle.label | n |
229246
| main.rs:281:29:281:29 | n | semmle.label | n |
230247
| main.rs:295:9:295:10 | s1 [C] | semmle.label | s1 [C] |
231248
| main.rs:295:14:297:5 | ...::C {...} [C] | semmle.label | ...::C {...} [C] |
232249
| main.rs:296:18:296:27 | source(...) | semmle.label | source(...) |
250+
| main.rs:299:11:299:12 | s1 [C] | semmle.label | s1 [C] |
233251
| main.rs:300:9:300:38 | ...::C {...} [C] | semmle.label | ...::C {...} [C] |
234252
| main.rs:300:36:300:36 | n | semmle.label | n |
235253
| main.rs:300:48:300:48 | n | semmle.label | n |
254+
| main.rs:303:11:303:12 | s1 [C] | semmle.label | s1 [C] |
236255
| main.rs:304:9:304:38 | ...::C {...} [C] | semmle.label | ...::C {...} [C] |
237256
| main.rs:304:36:304:36 | n | semmle.label | n |
238257
| main.rs:304:81:304:81 | n | semmle.label | n |
239258
| main.rs:315:9:315:10 | s1 [C] | semmle.label | s1 [C] |
240259
| main.rs:315:14:317:5 | C {...} [C] | semmle.label | C {...} [C] |
241260
| main.rs:316:18:316:27 | source(...) | semmle.label | source(...) |
261+
| main.rs:319:11:319:12 | s1 [C] | semmle.label | s1 [C] |
242262
| main.rs:320:9:320:24 | C {...} [C] | semmle.label | C {...} [C] |
243263
| main.rs:320:22:320:22 | n | semmle.label | n |
244264
| main.rs:320:34:320:34 | n | semmle.label | n |
265+
| main.rs:323:11:323:12 | s1 [C] | semmle.label | s1 [C] |
245266
| main.rs:324:9:324:24 | C {...} [C] | semmle.label | C {...} [C] |
246267
| main.rs:324:22:324:22 | n | semmle.label | n |
247268
| main.rs:324:53:324:53 | n | semmle.label | n |
@@ -268,6 +289,7 @@ nodes
268289
| main.rs:362:9:362:12 | arr1 [array[]] | semmle.label | arr1 [array[]] |
269290
| main.rs:362:16:362:33 | [...] [array[]] | semmle.label | [...] [array[]] |
270291
| main.rs:362:23:362:32 | source(...) | semmle.label | source(...) |
292+
| main.rs:363:11:363:14 | arr1 [array[]] | semmle.label | arr1 [array[]] |
271293
| main.rs:364:9:364:17 | SlicePat [array[]] | semmle.label | SlicePat [array[]] |
272294
| main.rs:364:10:364:10 | a | semmle.label | a |
273295
| main.rs:364:13:364:13 | b | semmle.label | b |

rust/ql/test/library-tests/dataflow/models/models.expected

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,14 @@ edges
3535
| main.rs:53:9:53:9 | s | main.rs:54:26:54:26 | s | provenance | |
3636
| main.rs:53:13:53:21 | source(...) | main.rs:53:9:53:9 | s | provenance | |
3737
| main.rs:53:13:53:21 | source(...) | main.rs:53:9:53:9 | s | provenance | |
38-
| main.rs:54:9:54:10 | e1 [B] | main.rs:57:9:57:23 | ...::B(...) [B] | provenance | |
39-
| main.rs:54:9:54:10 | e1 [B] | main.rs:57:9:57:23 | ...::B(...) [B] | provenance | |
38+
| main.rs:54:9:54:10 | e1 [B] | main.rs:55:11:55:12 | e1 [B] | provenance | |
39+
| main.rs:54:9:54:10 | e1 [B] | main.rs:55:11:55:12 | e1 [B] | provenance | |
4040
| main.rs:54:14:54:27 | set_var_pos(...) [B] | main.rs:54:9:54:10 | e1 [B] | provenance | |
4141
| main.rs:54:14:54:27 | set_var_pos(...) [B] | main.rs:54:9:54:10 | e1 [B] | provenance | |
4242
| main.rs:54:26:54:26 | s | main.rs:54:14:54:27 | set_var_pos(...) [B] | provenance | MaD:10 |
4343
| main.rs:54:26:54:26 | s | main.rs:54:14:54:27 | set_var_pos(...) [B] | provenance | MaD:10 |
44+
| main.rs:55:11:55:12 | e1 [B] | main.rs:57:9:57:23 | ...::B(...) [B] | provenance | |
45+
| main.rs:55:11:55:12 | e1 [B] | main.rs:57:9:57:23 | ...::B(...) [B] | provenance | |
4446
| main.rs:57:9:57:23 | ...::B(...) [B] | main.rs:57:22:57:22 | i | provenance | |
4547
| main.rs:57:9:57:23 | ...::B(...) [B] | main.rs:57:22:57:22 | i | provenance | |
4648
| main.rs:57:22:57:22 | i | main.rs:57:33:57:33 | i | provenance | |
@@ -61,12 +63,14 @@ edges
6163
| main.rs:85:9:85:9 | s | main.rs:86:28:86:28 | s | provenance | |
6264
| main.rs:85:13:85:21 | source(...) | main.rs:85:9:85:9 | s | provenance | |
6365
| main.rs:85:13:85:21 | source(...) | main.rs:85:9:85:9 | s | provenance | |
64-
| main.rs:86:9:86:10 | e1 [D] | main.rs:89:9:89:37 | ...::D {...} [D] | provenance | |
65-
| main.rs:86:9:86:10 | e1 [D] | main.rs:89:9:89:37 | ...::D {...} [D] | provenance | |
66+
| main.rs:86:9:86:10 | e1 [D] | main.rs:87:11:87:12 | e1 [D] | provenance | |
67+
| main.rs:86:9:86:10 | e1 [D] | main.rs:87:11:87:12 | e1 [D] | provenance | |
6668
| main.rs:86:14:86:29 | set_var_field(...) [D] | main.rs:86:9:86:10 | e1 [D] | provenance | |
6769
| main.rs:86:14:86:29 | set_var_field(...) [D] | main.rs:86:9:86:10 | e1 [D] | provenance | |
6870
| main.rs:86:28:86:28 | s | main.rs:86:14:86:29 | set_var_field(...) [D] | provenance | MaD:9 |
6971
| main.rs:86:28:86:28 | s | main.rs:86:14:86:29 | set_var_field(...) [D] | provenance | MaD:9 |
72+
| main.rs:87:11:87:12 | e1 [D] | main.rs:89:9:89:37 | ...::D {...} [D] | provenance | |
73+
| main.rs:87:11:87:12 | e1 [D] | main.rs:89:9:89:37 | ...::D {...} [D] | provenance | |
7074
| main.rs:89:9:89:37 | ...::D {...} [D] | main.rs:89:35:89:35 | i | provenance | |
7175
| main.rs:89:9:89:37 | ...::D {...} [D] | main.rs:89:35:89:35 | i | provenance | |
7276
| main.rs:89:35:89:35 | i | main.rs:89:47:89:47 | i | provenance | |
@@ -164,6 +168,8 @@ nodes
164168
| main.rs:54:14:54:27 | set_var_pos(...) [B] | semmle.label | set_var_pos(...) [B] |
165169
| main.rs:54:26:54:26 | s | semmle.label | s |
166170
| main.rs:54:26:54:26 | s | semmle.label | s |
171+
| main.rs:55:11:55:12 | e1 [B] | semmle.label | e1 [B] |
172+
| main.rs:55:11:55:12 | e1 [B] | semmle.label | e1 [B] |
167173
| main.rs:57:9:57:23 | ...::B(...) [B] | semmle.label | ...::B(...) [B] |
168174
| main.rs:57:9:57:23 | ...::B(...) [B] | semmle.label | ...::B(...) [B] |
169175
| main.rs:57:22:57:22 | i | semmle.label | i |
@@ -194,6 +200,8 @@ nodes
194200
| main.rs:86:14:86:29 | set_var_field(...) [D] | semmle.label | set_var_field(...) [D] |
195201
| main.rs:86:28:86:28 | s | semmle.label | s |
196202
| main.rs:86:28:86:28 | s | semmle.label | s |
203+
| main.rs:87:11:87:12 | e1 [D] | semmle.label | e1 [D] |
204+
| main.rs:87:11:87:12 | e1 [D] | semmle.label | e1 [D] |
197205
| main.rs:89:9:89:37 | ...::D {...} [D] | semmle.label | ...::D {...} [D] |
198206
| main.rs:89:9:89:37 | ...::D {...} [D] | semmle.label | ...::D {...} [D] |
199207
| main.rs:89:35:89:35 | i | semmle.label | i |

0 commit comments

Comments
 (0)