Skip to content

Commit 3ad4de4

Browse files
authored
Merge pull request github#19067 from geoffw0/convtest
Rust: Add a couple of test cases for data flow through conversions
2 parents 36ed96f + 0f622b3 commit 3ad4de4

File tree

3 files changed

+67
-23
lines changed

3 files changed

+67
-23
lines changed

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

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -846,8 +846,26 @@ localStep
846846
| main.rs:519:17:519:18 | &c | main.rs:519:9:519:13 | c_ref |
847847
| main.rs:523:14:523:18 | [post] c_ref | main.rs:524:11:524:15 | c_ref |
848848
| main.rs:523:14:523:18 | c_ref | main.rs:524:11:524:15 | c_ref |
849-
| main.rs:551:13:551:33 | result_questionmark(...) | main.rs:551:9:551:9 | _ |
850-
| main.rs:563:36:563:41 | ...::new(...) | main.rs:563:36:563:41 | MacroExpr |
849+
| main.rs:528:9:528:9 | [SSA] a | main.rs:530:10:530:10 | a |
850+
| main.rs:528:9:528:9 | a | main.rs:528:9:528:9 | [SSA] a |
851+
| main.rs:528:9:528:9 | a | main.rs:528:9:528:9 | a |
852+
| main.rs:528:18:528:27 | source(...) | main.rs:528:9:528:9 | a |
853+
| main.rs:530:10:530:10 | a | main.rs:531:10:531:10 | a |
854+
| main.rs:531:10:531:10 | [post] a | main.rs:532:20:532:20 | a |
855+
| main.rs:531:10:531:10 | [post] receiver for a | main.rs:531:10:531:10 | [post] a |
856+
| main.rs:531:10:531:10 | a | main.rs:531:10:531:10 | receiver for a |
857+
| main.rs:531:10:531:10 | a | main.rs:532:20:532:20 | a |
858+
| main.rs:534:9:534:9 | [SSA] b | main.rs:536:10:536:10 | b |
859+
| main.rs:534:9:534:9 | b | main.rs:534:9:534:9 | [SSA] b |
860+
| main.rs:534:9:534:9 | b | main.rs:534:9:534:9 | b |
861+
| main.rs:534:18:534:34 | ... as i32 | main.rs:534:9:534:9 | b |
862+
| main.rs:536:10:536:10 | b | main.rs:537:10:537:10 | b |
863+
| main.rs:537:10:537:10 | [post] b | main.rs:538:20:538:20 | b |
864+
| main.rs:537:10:537:10 | [post] receiver for b | main.rs:537:10:537:10 | [post] b |
865+
| main.rs:537:10:537:10 | b | main.rs:537:10:537:10 | receiver for b |
866+
| main.rs:537:10:537:10 | b | main.rs:538:20:538:20 | b |
867+
| main.rs:565:13:565:33 | result_questionmark(...) | main.rs:565:9:565:9 | _ |
868+
| main.rs:577:36:577:41 | ...::new(...) | main.rs:577:36:577:41 | MacroExpr |
851869
models
852870
| 1 | Sink: lang:std; crate::io::stdio::_print; log-injection; Argument[0] |
853871
| 2 | Summary: lang:alloc; <&&str as crate::string::SpecToString>::spec_to_string; Argument[self].Reference.Reference; ReturnValue; value |
@@ -2356,7 +2374,7 @@ storeStep
23562374
| main.rs:504:41:504:41 | 4 | element | main.rs:504:22:504:42 | [...] |
23572375
| main.rs:519:18:519:18 | c | &ref | main.rs:519:17:519:18 | &c |
23582376
| main.rs:522:15:522:15 | b | &ref | main.rs:522:14:522:15 | &b |
2359-
| main.rs:531:27:531:27 | 0 | Some | main.rs:531:22:531:28 | Some(...) |
2377+
| main.rs:545:27:545:27 | 0 | Some | main.rs:545:22:545:28 | Some(...) |
23602378
readStep
23612379
| file://:0:0:0:0 | [summary param] 0 in lang:alloc::_::<crate::boxed::Box>::allocator | tuple.1 | file://:0:0:0:0 | [summary] read: Argument[0].Field[1] in lang:alloc::_::<crate::boxed::Box>::allocator |
23622380
| file://:0:0:0:0 | [summary param] 0 in lang:alloc::_::<crate::boxed::Box>::as_mut_ptr | &ref | file://:0:0:0:0 | [summary] read: Argument[0].Reference in lang:alloc::_::<crate::boxed::Box>::as_mut_ptr |
@@ -3049,3 +3067,5 @@ readStep
30493067
| main.rs:510:19:510:24 | vs_mut | &ref | main.rs:510:19:510:24 | receiver for vs_mut |
30503068
| main.rs:510:19:510:35 | vs_mut.iter_mut(...) | element | main.rs:510:9:510:14 | &mut ... |
30513069
| main.rs:524:11:524:15 | c_ref | &ref | main.rs:524:10:524:15 | * ... |
3070+
| main.rs:531:10:531:10 | a | &ref | main.rs:531:10:531:10 | receiver for a |
3071+
| main.rs:537:10:537:10 | b | &ref | main.rs:537:10:537:10 | receiver for b |

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

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
models
2-
| 1 | Summary: lang:core; <crate::option::Option>::unwrap; Argument[self].Field[crate::option::Option::Some(0)]; ReturnValue; value |
3-
| 2 | Summary: lang:core; <crate::option::Option>::unwrap_or; Argument[0]; ReturnValue; value |
4-
| 3 | Summary: lang:core; <crate::option::Option>::unwrap_or; Argument[self].Field[crate::option::Option::Some(0)]; ReturnValue; value |
5-
| 4 | Summary: lang:core; <crate::option::Option>::unwrap_or_else; Argument[0].ReturnValue; ReturnValue; value |
6-
| 5 | Summary: lang:core; <crate::option::Option>::unwrap_or_else; Argument[self].Field[crate::option::Option::Some(0)]; ReturnValue; value |
7-
| 6 | Summary: lang:core; <crate::result::Result>::err; Argument[self].Field[crate::result::Result::Err(0)]; ReturnValue.Field[crate::option::Option::Some(0)]; value |
8-
| 7 | Summary: lang:core; <crate::result::Result>::expect; Argument[self].Field[crate::result::Result::Ok(0)]; ReturnValue; value |
9-
| 8 | Summary: lang:core; <crate::result::Result>::expect_err; Argument[self].Field[crate::result::Result::Err(0)]; ReturnValue; value |
10-
| 9 | Summary: lang:core; <crate::result::Result>::ok; Argument[self].Field[crate::result::Result::Ok(0)]; ReturnValue.Field[crate::option::Option::Some(0)]; value |
2+
| 1 | Summary: lang:core; <_ as crate::convert::From>::from; Argument[0]; ReturnValue; value |
3+
| 2 | Summary: lang:core; <crate::option::Option>::unwrap; Argument[self].Field[crate::option::Option::Some(0)]; ReturnValue; value |
4+
| 3 | Summary: lang:core; <crate::option::Option>::unwrap_or; Argument[0]; ReturnValue; value |
5+
| 4 | Summary: lang:core; <crate::option::Option>::unwrap_or; Argument[self].Field[crate::option::Option::Some(0)]; ReturnValue; value |
6+
| 5 | Summary: lang:core; <crate::option::Option>::unwrap_or_else; Argument[0].ReturnValue; ReturnValue; value |
7+
| 6 | Summary: lang:core; <crate::option::Option>::unwrap_or_else; Argument[self].Field[crate::option::Option::Some(0)]; ReturnValue; value |
8+
| 7 | Summary: lang:core; <crate::result::Result>::err; Argument[self].Field[crate::result::Result::Err(0)]; ReturnValue.Field[crate::option::Option::Some(0)]; value |
9+
| 8 | Summary: lang:core; <crate::result::Result>::expect; Argument[self].Field[crate::result::Result::Ok(0)]; ReturnValue; value |
10+
| 9 | Summary: lang:core; <crate::result::Result>::expect_err; Argument[self].Field[crate::result::Result::Err(0)]; ReturnValue; value |
11+
| 10 | Summary: lang:core; <crate::result::Result>::ok; Argument[self].Field[crate::result::Result::Ok(0)]; ReturnValue.Field[crate::option::Option::Some(0)]; value |
1112
edges
1213
| main.rs:22:9:22:9 | s | main.rs:23:10:23:10 | s | provenance | |
1314
| main.rs:22:13:22:21 | source(...) | main.rs:22:9:22:9 | s | provenance | |
@@ -94,43 +95,43 @@ edges
9495
| main.rs:229:11:229:12 | s1 [Some] | main.rs:230:9:230:15 | Some(...) [Some] | provenance | |
9596
| main.rs:230:9:230:15 | Some(...) [Some] | main.rs:230:14:230:14 | n | provenance | |
9697
| main.rs:230:14:230:14 | n | main.rs:230:25:230:25 | n | provenance | |
97-
| main.rs:240:9:240:10 | s1 [Some] | main.rs:241:10:241:20 | s1.unwrap(...) | provenance | MaD:1 |
98+
| main.rs:240:9:240:10 | s1 [Some] | main.rs:241:10:241:20 | s1.unwrap(...) | provenance | MaD:2 |
9899
| main.rs:240:14:240:29 | Some(...) [Some] | main.rs:240:9:240:10 | s1 [Some] | provenance | |
99100
| main.rs:240:19:240:28 | source(...) | main.rs:240:14:240:29 | Some(...) [Some] | provenance | |
100-
| main.rs:245:9:245:10 | s1 [Some] | main.rs:246:10:246:24 | s1.unwrap_or(...) | provenance | MaD:3 |
101+
| main.rs:245:9:245:10 | s1 [Some] | main.rs:246:10:246:24 | s1.unwrap_or(...) | provenance | MaD:4 |
101102
| main.rs:245:14:245:29 | Some(...) [Some] | main.rs:245:9:245:10 | s1 [Some] | provenance | |
102103
| main.rs:245:19:245:28 | source(...) | main.rs:245:14:245:29 | Some(...) [Some] | provenance | |
103-
| main.rs:249:23:249:32 | source(...) | main.rs:249:10:249:33 | s2.unwrap_or(...) | provenance | MaD:2 |
104-
| main.rs:253:9:253:10 | s1 [Some] | main.rs:254:10:254:32 | s1.unwrap_or_else(...) | provenance | MaD:5 |
104+
| main.rs:249:23:249:32 | source(...) | main.rs:249:10:249:33 | s2.unwrap_or(...) | provenance | MaD:3 |
105+
| main.rs:253:9:253:10 | s1 [Some] | main.rs:254:10:254:32 | s1.unwrap_or_else(...) | provenance | MaD:6 |
105106
| main.rs:253:14:253:29 | Some(...) [Some] | main.rs:253:9:253:10 | s1 [Some] | provenance | |
106107
| main.rs:253:19:253:28 | source(...) | main.rs:253:14:253:29 | Some(...) [Some] | provenance | |
107-
| main.rs:257:31:257:40 | source(...) | main.rs:257:10:257:41 | s2.unwrap_or_else(...) | provenance | MaD:4 |
108+
| main.rs:257:31:257:40 | source(...) | main.rs:257:10:257:41 | s2.unwrap_or_else(...) | provenance | MaD:5 |
108109
| main.rs:261:9:261:10 | s1 [Some] | main.rs:263:14:263:15 | s1 [Some] | provenance | |
109110
| main.rs:261:14:261:29 | Some(...) [Some] | main.rs:261:9:261:10 | s1 [Some] | provenance | |
110111
| main.rs:261:19:261:28 | source(...) | main.rs:261:14:261:29 | Some(...) [Some] | provenance | |
111112
| main.rs:263:9:263:10 | i1 | main.rs:264:10:264:11 | i1 | provenance | |
112113
| main.rs:263:14:263:15 | s1 [Some] | main.rs:263:14:263:16 | TryExpr | provenance | |
113114
| main.rs:263:14:263:16 | TryExpr | main.rs:263:9:263:10 | i1 | provenance | |
114-
| main.rs:270:9:270:10 | r1 [Ok] | main.rs:271:29:271:35 | r1.ok(...) [Some] | provenance | MaD:9 |
115+
| main.rs:270:9:270:10 | r1 [Ok] | main.rs:271:29:271:35 | r1.ok(...) [Some] | provenance | MaD:10 |
115116
| main.rs:270:33:270:46 | Ok(...) [Ok] | main.rs:270:9:270:10 | r1 [Ok] | provenance | |
116117
| main.rs:270:36:270:45 | source(...) | main.rs:270:33:270:46 | Ok(...) [Ok] | provenance | |
117-
| main.rs:271:9:271:11 | o1a [Some] | main.rs:273:10:273:21 | o1a.unwrap(...) | provenance | MaD:1 |
118+
| main.rs:271:9:271:11 | o1a [Some] | main.rs:273:10:273:21 | o1a.unwrap(...) | provenance | MaD:2 |
118119
| main.rs:271:29:271:35 | r1.ok(...) [Some] | main.rs:271:9:271:11 | o1a [Some] | provenance | |
119-
| main.rs:276:9:276:10 | r2 [Err] | main.rs:278:29:278:36 | r2.err(...) [Some] | provenance | MaD:6 |
120+
| main.rs:276:9:276:10 | r2 [Err] | main.rs:278:29:278:36 | r2.err(...) [Some] | provenance | MaD:7 |
120121
| main.rs:276:33:276:47 | Err(...) [Err] | main.rs:276:9:276:10 | r2 [Err] | provenance | |
121122
| main.rs:276:37:276:46 | source(...) | main.rs:276:33:276:47 | Err(...) [Err] | provenance | |
122-
| main.rs:278:9:278:11 | o2b [Some] | main.rs:280:10:280:21 | o2b.unwrap(...) | provenance | MaD:1 |
123+
| main.rs:278:9:278:11 | o2b [Some] | main.rs:280:10:280:21 | o2b.unwrap(...) | provenance | MaD:2 |
123124
| main.rs:278:29:278:36 | r2.err(...) [Some] | main.rs:278:9:278:11 | o2b [Some] | provenance | |
124125
| main.rs:284:9:284:10 | s1 [Ok] | main.rs:287:14:287:15 | s1 [Ok] | provenance | |
125126
| main.rs:284:32:284:45 | Ok(...) [Ok] | main.rs:284:9:284:10 | s1 [Ok] | provenance | |
126127
| main.rs:284:35:284:44 | source(...) | main.rs:284:32:284:45 | Ok(...) [Ok] | provenance | |
127128
| main.rs:287:9:287:10 | i1 | main.rs:289:10:289:11 | i1 | provenance | |
128129
| main.rs:287:14:287:15 | s1 [Ok] | main.rs:287:14:287:16 | TryExpr | provenance | |
129130
| main.rs:287:14:287:16 | TryExpr | main.rs:287:9:287:10 | i1 | provenance | |
130-
| main.rs:297:9:297:10 | s1 [Ok] | main.rs:298:10:298:22 | s1.expect(...) | provenance | MaD:7 |
131+
| main.rs:297:9:297:10 | s1 [Ok] | main.rs:298:10:298:22 | s1.expect(...) | provenance | MaD:8 |
131132
| main.rs:297:32:297:45 | Ok(...) [Ok] | main.rs:297:9:297:10 | s1 [Ok] | provenance | |
132133
| main.rs:297:35:297:44 | source(...) | main.rs:297:32:297:45 | Ok(...) [Ok] | provenance | |
133-
| main.rs:301:9:301:10 | s2 [Err] | main.rs:303:10:303:26 | s2.expect_err(...) | provenance | MaD:8 |
134+
| main.rs:301:9:301:10 | s2 [Err] | main.rs:303:10:303:26 | s2.expect_err(...) | provenance | MaD:9 |
134135
| main.rs:301:32:301:46 | Err(...) [Err] | main.rs:301:9:301:10 | s2 [Err] | provenance | |
135136
| main.rs:301:36:301:45 | source(...) | main.rs:301:32:301:46 | Err(...) [Err] | provenance | |
136137
| main.rs:312:9:312:10 | s1 [A] | main.rs:314:11:314:12 | s1 [A] | provenance | |
@@ -230,6 +231,9 @@ edges
230231
| main.rs:519:17:519:18 | &c [&ref] | main.rs:519:9:519:13 | c_ref [&ref] | provenance | |
231232
| main.rs:519:18:519:18 | c | main.rs:519:17:519:18 | &c [&ref] | provenance | |
232233
| main.rs:524:11:524:15 | c_ref [&ref] | main.rs:524:10:524:15 | * ... | provenance | |
234+
| main.rs:528:9:528:9 | a | main.rs:532:20:532:20 | a | provenance | |
235+
| main.rs:528:18:528:27 | source(...) | main.rs:528:9:528:9 | a | provenance | |
236+
| main.rs:532:20:532:20 | a | main.rs:532:10:532:21 | ...::from(...) | provenance | MaD:1 |
233237
nodes
234238
| main.rs:18:10:18:18 | source(...) | semmle.label | source(...) |
235239
| main.rs:22:9:22:9 | s | semmle.label | s |
@@ -497,6 +501,10 @@ nodes
497501
| main.rs:521:10:521:10 | a | semmle.label | a |
498502
| main.rs:524:10:524:15 | * ... | semmle.label | * ... |
499503
| main.rs:524:11:524:15 | c_ref [&ref] | semmle.label | c_ref [&ref] |
504+
| main.rs:528:9:528:9 | a | semmle.label | a |
505+
| main.rs:528:18:528:27 | source(...) | semmle.label | source(...) |
506+
| main.rs:532:10:532:21 | ...::from(...) | semmle.label | ...::from(...) |
507+
| main.rs:532:20:532:20 | a | semmle.label | a |
500508
subpaths
501509
testFailures
502510
#select
@@ -554,3 +562,4 @@ testFailures
554562
| main.rs:506:10:506:18 | vs_mut[0] | main.rs:504:23:504:32 | source(...) | main.rs:506:10:506:18 | vs_mut[0] | $@ | main.rs:504:23:504:32 | source(...) | source(...) |
555563
| main.rs:521:10:521:10 | a | main.rs:516:13:516:22 | source(...) | main.rs:521:10:521:10 | a | $@ | main.rs:516:13:516:22 | source(...) | source(...) |
556564
| main.rs:524:10:524:15 | * ... | main.rs:518:13:518:22 | source(...) | main.rs:524:10:524:15 | * ... | $@ | main.rs:518:13:518:22 | source(...) | source(...) |
565+
| main.rs:532:10:532:21 | ...::from(...) | main.rs:528:18:528:27 | source(...) | main.rs:532:10:532:21 | ...::from(...) | $@ | main.rs:528:18:528:27 | source(...) | source(...) |

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -524,6 +524,20 @@ fn references() {
524524
sink(*c_ref); // $ hasValueFlow=42
525525
}
526526

527+
fn conversions() {
528+
let a: i64 = source(50);
529+
530+
sink(a as i64); // $ hasTaintFlow=50
531+
sink(a.into()); // $ MISSING: hasValueFlow=50
532+
sink(i64::from(a)); // $ hasValueFlow=50
533+
534+
let b: i32 = source(51) as i32;
535+
536+
sink(b as i64); // $ hasTaintFlow=51
537+
sink(b.into()); // $ MISSING: hasTaintFlow=51
538+
sink(i64::from(b)); // $ hasTaintFlow=51
539+
}
540+
527541
fn main() {
528542
direct();
529543
variable_usage();
@@ -565,4 +579,5 @@ fn main() {
565579
parse();
566580
iterators();
567581
references();
582+
conversions();
568583
}

0 commit comments

Comments
 (0)