Skip to content

Commit 1ff7a52

Browse files
committed
Rust: Add a flow test for some iterator methods.
1 parent c597818 commit 1ff7a52

File tree

3 files changed

+92
-3
lines changed

3 files changed

+92
-3
lines changed

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

Lines changed: 48 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -518,8 +518,39 @@ localStep
518518
| main.rs:440:19:440:19 | [post] b | main.rs:443:17:443:17 | b | |
519519
| main.rs:440:19:440:19 | b | main.rs:443:17:443:17 | b | |
520520
| main.rs:440:19:440:36 | ... .unwrap(...) | main.rs:440:9:440:9 | d | |
521-
| main.rs:470:13:470:33 | result_questionmark(...) | main.rs:470:9:470:9 | _ | |
522-
| main.rs:482:36:482:41 | ...::new(...) | main.rs:482:36:482:41 | MacroExpr | |
521+
| main.rs:449:9:449:10 | [SSA] vs | main.rs:451:10:451:11 | vs | |
522+
| main.rs:449:9:449:10 | vs | main.rs:449:9:449:10 | [SSA] vs | |
523+
| main.rs:449:14:449:34 | [...] | main.rs:449:9:449:10 | vs | |
524+
| main.rs:451:10:451:11 | [post] vs | main.rs:452:11:452:12 | vs | |
525+
| main.rs:451:10:451:11 | vs | main.rs:452:11:452:12 | vs | |
526+
| main.rs:452:11:452:12 | [post] vs | main.rs:453:11:453:12 | vs | |
527+
| main.rs:452:11:452:12 | vs | main.rs:453:11:453:12 | vs | |
528+
| main.rs:453:11:453:12 | [post] vs | main.rs:455:14:455:15 | vs | |
529+
| main.rs:453:11:453:12 | vs | main.rs:455:14:455:15 | vs | |
530+
| main.rs:455:9:455:9 | [SSA] v | main.rs:456:14:456:14 | v | |
531+
| main.rs:455:9:455:9 | v | main.rs:455:9:455:9 | [SSA] v | |
532+
| main.rs:455:14:455:15 | vs | main.rs:458:15:458:16 | vs | |
533+
| main.rs:458:10:458:10 | [SSA] v | main.rs:459:14:459:14 | v | |
534+
| main.rs:458:10:458:10 | v | main.rs:458:10:458:10 | [SSA] v | |
535+
| main.rs:458:15:458:16 | [post] vs | main.rs:462:27:462:28 | vs | |
536+
| main.rs:458:15:458:16 | vs | main.rs:462:27:462:28 | vs | |
537+
| main.rs:462:9:462:11 | [SSA] vs2 | main.rs:463:15:463:17 | vs2 | |
538+
| main.rs:462:9:462:11 | vs2 | main.rs:462:9:462:11 | [SSA] vs2 | |
539+
| main.rs:462:27:462:28 | [post] vs | main.rs:467:5:467:6 | vs | |
540+
| main.rs:462:27:462:28 | vs | main.rs:467:5:467:6 | vs | |
541+
| main.rs:462:27:462:45 | ... .collect(...) | main.rs:462:9:462:11 | vs2 | |
542+
| main.rs:463:10:463:10 | [SSA] v | main.rs:464:14:464:14 | v | |
543+
| main.rs:463:10:463:10 | v | main.rs:463:10:463:10 | [SSA] v | |
544+
| main.rs:467:5:467:6 | [post] vs | main.rs:469:14:469:15 | vs | |
545+
| main.rs:467:5:467:6 | vs | main.rs:469:14:469:15 | vs | |
546+
| main.rs:467:20:467:20 | ... | main.rs:467:20:467:20 | x | |
547+
| main.rs:467:20:467:20 | [SSA] x | main.rs:467:29:467:29 | x | |
548+
| main.rs:467:20:467:20 | x | main.rs:467:20:467:20 | [SSA] x | |
549+
| main.rs:469:5:471:5 | for ... in ... { ... } | main.rs:448:16:472:1 | { ... } | |
550+
| main.rs:469:9:469:9 | [SSA] v | main.rs:470:14:470:14 | v | |
551+
| main.rs:469:9:469:9 | v | main.rs:469:9:469:9 | [SSA] v | |
552+
| main.rs:496:13:496:33 | result_questionmark(...) | main.rs:496:9:496:9 | _ | |
553+
| main.rs:508:36:508:41 | ...::new(...) | main.rs:508:36:508:41 | MacroExpr | |
523554
models
524555
| 1 | Sink: lang:std; crate::io::stdio::_print; log-injection; Argument[0] |
525556
| 2 | Summary: lang:core; <crate::option::Option>::expect; Argument[self].Variant[crate::option::Option::Some(0)]; ReturnValue; value |
@@ -624,7 +655,11 @@ storeStep
624655
| main.rs:399:30:399:30 | 3 | element | main.rs:399:23:399:31 | [...] |
625656
| main.rs:402:18:402:27 | source(...) | element | main.rs:402:5:402:11 | [post] mut_arr |
626657
| main.rs:414:41:414:67 | default_name | captured default_name | main.rs:414:41:414:67 | \|...\| ... |
627-
| main.rs:452:27:452:27 | 0 | Some | main.rs:452:22:452:28 | Some(...) |
658+
| main.rs:449:15:449:24 | source(...) | element | main.rs:449:14:449:34 | [...] |
659+
| main.rs:449:27:449:27 | 2 | element | main.rs:449:14:449:34 | [...] |
660+
| main.rs:449:30:449:30 | 3 | element | main.rs:449:14:449:34 | [...] |
661+
| main.rs:449:33:449:33 | 4 | element | main.rs:449:14:449:34 | [...] |
662+
| main.rs:478:27:478:27 | 0 | Some | main.rs:478:22:478:28 | Some(...) |
628663
readStep
629664
| file://:0:0:0:0 | [summary param] 0 in lang:core::_::<crate::option::Option>::unwrap_or_else | function return | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:core::_::<crate::option::Option>::unwrap_or_else |
630665
| file://:0:0:0:0 | [summary param] 0 in lang:core::_::<crate::result::Result>::unwrap_or_else | function return | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:core::_::<crate::result::Result>::unwrap_or_else |
@@ -722,3 +757,13 @@ readStep
722757
| main.rs:412:25:412:29 | names | element | main.rs:412:9:412:20 | TuplePat |
723758
| main.rs:414:41:414:67 | [post] \|...\| ... | captured default_name | main.rs:414:41:414:67 | [post] default_name |
724759
| main.rs:414:44:414:55 | this | captured default_name | main.rs:414:44:414:55 | default_name |
760+
| main.rs:451:10:451:11 | vs | element | main.rs:451:10:451:14 | vs[0] |
761+
| main.rs:452:11:452:35 | ... .unwrap(...) | &ref | main.rs:452:10:452:35 | * ... |
762+
| main.rs:453:11:453:35 | ... .unwrap(...) | &ref | main.rs:453:10:453:35 | * ... |
763+
| main.rs:455:14:455:15 | vs | element | main.rs:455:9:455:9 | v |
764+
| main.rs:458:9:458:10 | &... | &ref | main.rs:458:10:458:10 | v |
765+
| main.rs:458:15:458:23 | vs.iter(...) | element | main.rs:458:9:458:10 | &... |
766+
| main.rs:463:9:463:10 | &... | &ref | main.rs:463:10:463:10 | v |
767+
| main.rs:463:15:463:17 | vs2 | element | main.rs:463:9:463:10 | &... |
768+
| main.rs:467:29:467:29 | x | &ref | main.rs:467:28:467:29 | * ... |
769+
| main.rs:469:14:469:27 | vs.into_iter(...) | element | main.rs:469:9:469:9 | v |

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,13 @@ edges
181181
| main.rs:428:25:428:26 | source(...) | main.rs:428:9:428:9 | s | provenance | |
182182
| main.rs:437:9:437:9 | a | main.rs:442:10:442:10 | a | provenance | |
183183
| main.rs:437:13:437:22 | source(...) | main.rs:437:9:437:9 | a | provenance | |
184+
| main.rs:449:9:449:10 | vs [element] | main.rs:451:10:451:11 | vs [element] | provenance | |
185+
| main.rs:449:9:449:10 | vs [element] | main.rs:455:14:455:15 | vs [element] | provenance | |
186+
| main.rs:449:14:449:34 | [...] [element] | main.rs:449:9:449:10 | vs [element] | provenance | |
187+
| main.rs:449:15:449:24 | source(...) | main.rs:449:14:449:34 | [...] [element] | provenance | |
188+
| main.rs:451:10:451:11 | vs [element] | main.rs:451:10:451:14 | vs[0] | provenance | |
189+
| main.rs:455:9:455:9 | v | main.rs:456:14:456:14 | v | provenance | |
190+
| main.rs:455:14:455:15 | vs [element] | main.rs:455:9:455:9 | v | provenance | |
184191
nodes
185192
| main.rs:15:10:15:18 | source(...) | semmle.label | source(...) |
186193
| main.rs:19:9:19:9 | s | semmle.label | s |
@@ -391,6 +398,14 @@ nodes
391398
| main.rs:437:9:437:9 | a | semmle.label | a |
392399
| main.rs:437:13:437:22 | source(...) | semmle.label | source(...) |
393400
| main.rs:442:10:442:10 | a | semmle.label | a |
401+
| main.rs:449:9:449:10 | vs [element] | semmle.label | vs [element] |
402+
| main.rs:449:14:449:34 | [...] [element] | semmle.label | [...] [element] |
403+
| main.rs:449:15:449:24 | source(...) | semmle.label | source(...) |
404+
| main.rs:451:10:451:11 | vs [element] | semmle.label | vs [element] |
405+
| main.rs:451:10:451:14 | vs[0] | semmle.label | vs[0] |
406+
| main.rs:455:9:455:9 | v | semmle.label | v |
407+
| main.rs:455:14:455:15 | vs [element] | semmle.label | vs [element] |
408+
| main.rs:456:14:456:14 | v | semmle.label | v |
394409
subpaths
395410
testFailures
396411
#select
@@ -436,3 +451,5 @@ testFailures
436451
| main.rs:405:10:405:19 | mut_arr[0] | main.rs:402:18:402:27 | source(...) | main.rs:405:10:405:19 | mut_arr[0] | $@ | main.rs:402:18:402:27 | source(...) | source(...) |
437452
| main.rs:429:10:429:10 | s | main.rs:428:25:428:26 | source(...) | main.rs:429:10:429:10 | s | $@ | main.rs:428:25:428:26 | source(...) | source(...) |
438453
| main.rs:442:10:442:10 | a | main.rs:437:13:437:22 | source(...) | main.rs:442:10:442:10 | a | $@ | main.rs:437:13:437:22 | source(...) | source(...) |
454+
| main.rs:451:10:451:14 | vs[0] | main.rs:449:15:449:24 | source(...) | main.rs:451:10:451:14 | vs[0] | $@ | main.rs:449:15:449:24 | source(...) | source(...) |
455+
| main.rs:456:14:456:14 | v | main.rs:449:15:449:24 | source(...) | main.rs:456:14:456:14 | v | $@ | main.rs:449:15:449:24 | source(...) | source(...) |

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

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -445,6 +445,32 @@ fn parse() {
445445
sink(d); // $ MISSING: hasTaintFlow=90
446446
}
447447

448+
fn iterators() {
449+
let vs = [source(91), 2, 3, 4];
450+
451+
sink(vs[0]); // $ hasValueFlow=91
452+
sink(*vs.iter().next().unwrap()); // $ MISSING: hasValueFlow=91
453+
sink(*vs.iter().nth(0).unwrap()); // $ MISSING: hasValueFlow=91
454+
455+
for v in vs {
456+
sink(v); // $ hasValueFlow=91
457+
}
458+
for &v in vs.iter() {
459+
sink(v); // $ MISSING: hasValueFlow=91
460+
}
461+
462+
let vs2 : Vec<&i64> = vs.iter().collect();
463+
for &v in vs2 {
464+
sink(v); // $ MISSING: hasValueFlow=91
465+
}
466+
467+
vs.iter().map(|x| sink(*x)); // $ MISSING: hasValueFlow=91
468+
469+
for v in vs.into_iter() {
470+
sink(v); // $ MISSING: hasValueFlow=91
471+
}
472+
}
473+
448474
fn main() {
449475
direct();
450476
variable_usage();
@@ -482,4 +508,5 @@ fn main() {
482508
captured_variable_and_continue(vec![]);
483509
macro_invocation();
484510
parse();
511+
iterators();
485512
}

0 commit comments

Comments
 (0)