Skip to content

Commit c597818

Browse files
committed
Rust: Add a flow test for to_string() and parse().
1 parent 6966c96 commit c597818

File tree

3 files changed

+49
-3
lines changed

3 files changed

+49
-3
lines changed

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

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -495,8 +495,31 @@ localStep
495495
| main.rs:428:9:428:9 | s | main.rs:428:9:428:9 | [SSA] s | |
496496
| main.rs:428:13:428:27 | MacroExpr | main.rs:428:9:428:9 | s | |
497497
| main.rs:428:25:428:26 | source(...) | main.rs:428:13:428:27 | MacroExpr | |
498-
| main.rs:454:13:454:33 | result_questionmark(...) | main.rs:454:9:454:9 | _ | |
499-
| main.rs:466:36:466:41 | ...::new(...) | main.rs:466:36:466:41 | MacroExpr | |
498+
| main.rs:432:16:432:16 | [SSA] s | main.rs:433:20:433:20 | s | |
499+
| main.rs:432:16:432:16 | s | main.rs:432:16:432:16 | [SSA] s | |
500+
| main.rs:432:16:432:24 | ...: String | main.rs:432:16:432:16 | s | |
501+
| main.rs:433:14:433:20 | FormatArgsExpr | main.rs:433:14:433:20 | MacroExpr | |
502+
| main.rs:433:14:433:20 | MacroExpr | main.rs:433:5:433:21 | ...::_print | MaD:1 |
503+
| main.rs:437:9:437:9 | [SSA] a | main.rs:438:13:438:13 | a | |
504+
| main.rs:437:9:437:9 | a | main.rs:437:9:437:9 | [SSA] a | |
505+
| main.rs:437:13:437:22 | source(...) | main.rs:437:9:437:9 | a | |
506+
| main.rs:438:9:438:9 | [SSA] b | main.rs:439:13:439:13 | b | |
507+
| main.rs:438:9:438:9 | b | main.rs:438:9:438:9 | [SSA] b | |
508+
| main.rs:438:13:438:13 | [post] a | main.rs:442:10:442:10 | a | |
509+
| main.rs:438:13:438:13 | a | main.rs:442:10:442:10 | a | |
510+
| main.rs:438:13:438:25 | a.to_string(...) | main.rs:438:9:438:9 | b | |
511+
| main.rs:439:9:439:9 | [SSA] c | main.rs:444:10:444:10 | c | |
512+
| main.rs:439:9:439:9 | c | main.rs:439:9:439:9 | [SSA] c | |
513+
| main.rs:439:13:439:13 | [post] b | main.rs:440:19:440:19 | b | |
514+
| main.rs:439:13:439:13 | b | main.rs:440:19:440:19 | b | |
515+
| main.rs:439:13:439:37 | ... .unwrap(...) | main.rs:439:9:439:9 | c | |
516+
| main.rs:440:9:440:9 | [SSA] d | main.rs:445:10:445:10 | d | |
517+
| main.rs:440:9:440:9 | d | main.rs:440:9:440:9 | [SSA] d | |
518+
| main.rs:440:19:440:19 | [post] b | main.rs:443:17:443:17 | b | |
519+
| main.rs:440:19:440:19 | b | main.rs:443:17:443:17 | b | |
520+
| 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 | |
500523
models
501524
| 1 | Sink: lang:std; crate::io::stdio::_print; log-injection; Argument[0] |
502525
| 2 | Summary: lang:core; <crate::option::Option>::expect; Argument[self].Variant[crate::option::Option::Some(0)]; ReturnValue; value |
@@ -601,7 +624,7 @@ storeStep
601624
| main.rs:399:30:399:30 | 3 | element | main.rs:399:23:399:31 | [...] |
602625
| main.rs:402:18:402:27 | source(...) | element | main.rs:402:5:402:11 | [post] mut_arr |
603626
| main.rs:414:41:414:67 | default_name | captured default_name | main.rs:414:41:414:67 | \|...\| ... |
604-
| main.rs:436:27:436:27 | 0 | Some | main.rs:436:22:436:28 | Some(...) |
627+
| main.rs:452:27:452:27 | 0 | Some | main.rs:452:22:452:28 | Some(...) |
605628
readStep
606629
| 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 |
607630
| 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 |

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,8 @@ edges
179179
| main.rs:405:10:405:16 | mut_arr [element] | main.rs:405:10:405:19 | mut_arr[0] | provenance | |
180180
| main.rs:428:9:428:9 | s | main.rs:429:10:429:10 | s | provenance | |
181181
| main.rs:428:25:428:26 | source(...) | main.rs:428:9:428:9 | s | provenance | |
182+
| main.rs:437:9:437:9 | a | main.rs:442:10:442:10 | a | provenance | |
183+
| main.rs:437:13:437:22 | source(...) | main.rs:437:9:437:9 | a | provenance | |
182184
nodes
183185
| main.rs:15:10:15:18 | source(...) | semmle.label | source(...) |
184186
| main.rs:19:9:19:9 | s | semmle.label | s |
@@ -386,6 +388,9 @@ nodes
386388
| main.rs:428:9:428:9 | s | semmle.label | s |
387389
| main.rs:428:25:428:26 | source(...) | semmle.label | source(...) |
388390
| main.rs:429:10:429:10 | s | semmle.label | s |
391+
| main.rs:437:9:437:9 | a | semmle.label | a |
392+
| main.rs:437:13:437:22 | source(...) | semmle.label | source(...) |
393+
| main.rs:442:10:442:10 | a | semmle.label | a |
389394
subpaths
390395
testFailures
391396
#select
@@ -430,3 +435,4 @@ testFailures
430435
| main.rs:404:10:404:10 | d | main.rs:402:18:402:27 | source(...) | main.rs:404:10:404:10 | d | $@ | main.rs:402:18:402:27 | source(...) | source(...) |
431436
| 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(...) |
432437
| 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(...) |
438+
| 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(...) |

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,22 @@ fn macro_invocation() {
429429
sink(s); // $ hasValueFlow=37
430430
}
431431

432+
fn sink_string(s: String) {
433+
println!("{}", s);
434+
}
435+
436+
fn parse() {
437+
let a = source(90);
438+
let b = a.to_string();
439+
let c = b.parse::<i64>().unwrap();
440+
let d : i64 = b.parse().unwrap();
441+
442+
sink(a); // $ hasValueFlow=90
443+
sink_string(b); // $ MISSING: hasTaintFlow=90
444+
sink(c); // $ MISSING: hasTaintFlow=90
445+
sink(d); // $ MISSING: hasTaintFlow=90
446+
}
447+
432448
fn main() {
433449
direct();
434450
variable_usage();
@@ -465,4 +481,5 @@ fn main() {
465481
array_assignment();
466482
captured_variable_and_continue(vec![]);
467483
macro_invocation();
484+
parse();
468485
}

0 commit comments

Comments
 (0)