Skip to content

Commit ad74805

Browse files
committed
Rust: Add data flow tests involving closures
1 parent 418ab4b commit ad74805

File tree

2 files changed

+79
-1
lines changed

2 files changed

+79
-1
lines changed

rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -280,14 +280,58 @@ localStep
280280
| main.rs:231:9:231:22 | break ''block 2 | main.rs:227:13:232:5 | 'block: { ... } |
281281
| main.rs:231:22:231:22 | 2 | main.rs:231:9:231:22 | break ''block 2 |
282282
| main.rs:233:5:233:5 | a | main.rs:226:38:234:1 | { ... } |
283+
| main.rs:240:9:240:9 | [SSA] f | main.rs:241:10:241:10 | f |
284+
| main.rs:240:9:240:9 | f | main.rs:240:9:240:9 | [SSA] f |
285+
| main.rs:240:13:240:52 | \|...\| ... | main.rs:240:9:240:9 | f |
286+
| main.rs:240:14:240:17 | ... | main.rs:240:14:240:17 | cond |
287+
| main.rs:240:14:240:17 | [SSA] cond | main.rs:240:23:240:26 | cond |
288+
| main.rs:240:14:240:17 | cond | main.rs:240:14:240:17 | [SSA] cond |
289+
| main.rs:240:28:240:41 | { ... } | main.rs:240:20:240:52 | if cond {...} else {...} |
290+
| main.rs:240:30:240:39 | source(...) | main.rs:240:28:240:41 | { ... } |
291+
| main.rs:240:48:240:52 | { ... } | main.rs:240:20:240:52 | if cond {...} else {...} |
292+
| main.rs:240:50:240:50 | 0 | main.rs:240:48:240:52 | { ... } |
293+
| main.rs:245:9:245:9 | [SSA] f | main.rs:252:5:252:5 | f |
294+
| main.rs:245:9:245:9 | f | main.rs:245:9:245:9 | [SSA] f |
295+
| main.rs:245:13:250:9 | \|...\| ... | main.rs:245:9:245:9 | f |
296+
| main.rs:245:14:245:17 | ... | main.rs:245:14:245:17 | cond |
297+
| main.rs:245:14:245:17 | [SSA] cond | main.rs:246:12:246:15 | cond |
298+
| main.rs:245:14:245:17 | cond | main.rs:245:14:245:17 | [SSA] cond |
299+
| main.rs:245:20:245:23 | ... | main.rs:245:20:245:23 | data |
300+
| main.rs:245:20:245:23 | [SSA] data | main.rs:247:18:247:21 | data |
301+
| main.rs:245:20:245:23 | data | main.rs:245:20:245:23 | [SSA] data |
302+
| main.rs:246:17:248:9 | { ... } | main.rs:246:9:250:9 | if cond {...} else {...} |
303+
| main.rs:248:16:250:9 | { ... } | main.rs:246:9:250:9 | if cond {...} else {...} |
304+
| main.rs:249:13:249:19 | sink(...) | main.rs:248:16:250:9 | { ... } |
305+
| main.rs:251:9:251:9 | [SSA] a | main.rs:252:13:252:13 | a |
306+
| main.rs:251:9:251:9 | a | main.rs:251:9:251:9 | [SSA] a |
307+
| main.rs:251:13:251:22 | source(...) | main.rs:251:9:251:9 | a |
308+
| main.rs:256:9:256:9 | [SSA] f | main.rs:263:13:263:13 | f |
309+
| main.rs:256:9:256:9 | f | main.rs:256:9:256:9 | [SSA] f |
310+
| main.rs:256:13:261:9 | \|...\| ... | main.rs:256:9:256:9 | f |
311+
| main.rs:256:14:256:17 | ... | main.rs:256:14:256:17 | cond |
312+
| main.rs:256:14:256:17 | [SSA] cond | main.rs:257:12:257:15 | cond |
313+
| main.rs:256:14:256:17 | cond | main.rs:256:14:256:17 | [SSA] cond |
314+
| main.rs:256:20:256:23 | ... | main.rs:256:20:256:23 | data |
315+
| main.rs:256:20:256:23 | [SSA] data | main.rs:258:13:258:16 | data |
316+
| main.rs:256:20:256:23 | data | main.rs:256:20:256:23 | [SSA] data |
317+
| main.rs:257:17:259:9 | { ... } | main.rs:257:9:261:9 | if cond {...} else {...} |
318+
| main.rs:258:13:258:16 | data | main.rs:257:17:259:9 | { ... } |
319+
| main.rs:259:16:261:9 | { ... } | main.rs:257:9:261:9 | if cond {...} else {...} |
320+
| main.rs:260:13:260:13 | 0 | main.rs:259:16:261:9 | { ... } |
321+
| main.rs:262:9:262:9 | [SSA] a | main.rs:263:21:263:21 | a |
322+
| main.rs:262:9:262:9 | a | main.rs:262:9:262:9 | [SSA] a |
323+
| main.rs:262:13:262:22 | source(...) | main.rs:262:9:262:9 | a |
324+
| main.rs:263:9:263:9 | [SSA] b | main.rs:264:10:264:10 | b |
325+
| main.rs:263:9:263:9 | b | main.rs:263:9:263:9 | [SSA] b |
326+
| main.rs:263:13:263:22 | f(...) | main.rs:263:9:263:9 | b |
283327
storeStep
284328
| main.rs:117:19:117:28 | source(...) | Some | main.rs:117:14:117:29 | Some(...) |
285329
| main.rs:118:19:118:19 | 2 | Some | main.rs:118:14:118:20 | Some(...) |
286330
| main.rs:135:29:135:38 | source(...) | A | main.rs:135:14:135:39 | ...::A(...) |
287331
| main.rs:136:29:136:29 | 2 | B | main.rs:136:14:136:30 | ...::B(...) |
288332
| main.rs:175:18:175:27 | source(...) | C | main.rs:174:14:176:5 | ...::C {...} |
289333
| main.rs:177:41:177:41 | 2 | D | main.rs:177:14:177:43 | ...::D {...} |
290-
| main.rs:240:27:240:27 | 0 | Some | main.rs:240:22:240:28 | Some(...) |
334+
| main.rs:271:27:271:27 | 0 | Some | main.rs:271:22:271:28 | Some(...) |
291335
readStep
292336
| main.rs:33:9:33:15 | TupleStructPat | Some | main.rs:33:14:33:14 | _ |
293337
| main.rs:120:9:120:15 | TupleStructPat | Some | main.rs:120:14:120:14 | n |

rust/ql/test/library-tests/dataflow/local/main.rs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,37 @@ fn block_expression3(b: bool) -> i64 {
233233
a
234234
}
235235

236+
// -----------------------------------------------------------------------------
237+
// Data flow through closures
238+
239+
fn closure_flow_out() {
240+
let f = |cond| if cond { source(92) } else { 0 };
241+
sink(f(true)); // $ MISSING: hasValueFlow=92
242+
}
243+
244+
fn closure_flow_in() {
245+
let f = |cond, data|
246+
if cond {
247+
sink(data); // $ MISSING: hasValueFlow=87
248+
} else {
249+
sink(0)
250+
};
251+
let a = source(87);
252+
f(true, a);
253+
}
254+
255+
fn closure_flow_through() {
256+
let f = |cond, data|
257+
if cond {
258+
data
259+
} else {
260+
0
261+
};
262+
let a = source(43);
263+
let b = f(true, a);
264+
sink(b); // $ MISSING: hasValueFlow=43
265+
}
266+
236267
fn main() {
237268
direct();
238269
variable_usage();
@@ -253,4 +284,7 @@ fn main() {
253284
block_expression1();
254285
block_expression2(true);
255286
block_expression3(true);
287+
closure_flow_out();
288+
closure_flow_in();
289+
closure_flow_through();
256290
}

0 commit comments

Comments
 (0)