Skip to content

Commit f09632d

Browse files
committed
Rust: Add data flow tests for macros and format_args
1 parent f23e56b commit f09632d

File tree

4 files changed

+72
-38
lines changed

4 files changed

+72
-38
lines changed

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,10 @@ localStep
456456
| main.rs:396:15:396:62 | name.unwrap_or_else(...) | main.rs:396:11:396:11 | n |
457457
| main.rs:396:35:396:61 | [SSA] <captured entry> default_name | main.rs:396:38:396:49 | default_name |
458458
| main.rs:398:7:398:14 | [SSA] [input] SSA phi read(default_name) | main.rs:394:7:394:18 | [SSA] SSA phi read(default_name) |
459-
| main.rs:425:13:425:33 | result_questionmark(...) | main.rs:425:9:425:9 | _ |
459+
| main.rs:410:9:410:9 | [SSA] s | main.rs:411:10:411:10 | s |
460+
| main.rs:410:9:410:9 | s | main.rs:410:9:410:9 | [SSA] s |
461+
| main.rs:410:13:410:27 | MacroExpr | main.rs:410:9:410:9 | s |
462+
| main.rs:436:13:436:33 | result_questionmark(...) | main.rs:436:9:436:9 | _ |
460463
storeStep
461464
| file://:0:0:0:0 | [summary] to write: ReturnValue.Variant[crate::result::Result::Ok(0)] in repo:https://github.com/seanmonstar/reqwest:reqwest::_::<crate::blocking::response::Response>::text | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in repo:https://github.com/seanmonstar/reqwest:reqwest::_::<crate::blocking::response::Response>::text |
462465
| main.rs:94:14:94:22 | source(...) | tuple.0 | main.rs:94:13:94:26 | TupleExpr |
@@ -529,7 +532,7 @@ storeStep
529532
| main.rs:381:30:381:30 | 3 | array[] | main.rs:381:23:381:31 | [...] |
530533
| main.rs:384:18:384:27 | source(...) | array[] | main.rs:384:5:384:11 | [post] mut_arr |
531534
| main.rs:396:35:396:61 | default_name | captured default_name | main.rs:396:35:396:61 | \|...\| ... |
532-
| main.rs:407:27:407:27 | 0 | Some | main.rs:407:22:407:28 | Some(...) |
535+
| main.rs:418:27:418:27 | 0 | Some | main.rs:418:22:418:28 | Some(...) |
533536
readStep
534537
| file://:0:0:0:0 | [summary param] self in lang:core::_::<crate::option::Option>::unwrap | Some | file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::option::Option::Some(0)] in lang:core::_::<crate::option::Option>::unwrap |
535538
| file://:0:0:0:0 | [summary param] self in lang:core::_::<crate::option::Option>::unwrap_or | Some | file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::option::Option::Some(0)] in lang:core::_::<crate::option::Option>::unwrap_or |

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,17 @@ pub fn captured_variable_and_continue(names: Vec<(bool, Option<String>)>) {
400400
}
401401
}
402402

403+
macro_rules! get_source {
404+
($e:expr) => {
405+
source($e)
406+
};
407+
}
408+
409+
fn macro_invocation() {
410+
let s = get_source!(37);
411+
sink(s); // $ MISSING: hasValueFlow=37
412+
}
413+
403414
fn main() {
404415
direct();
405416
variable_usage();
@@ -435,4 +446,5 @@ fn main() {
435446
array_slice_pattern();
436447
array_assignment();
437448
captured_variable_and_continue(vec![]);
449+
macro_invocation();
438450
}
Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,35 @@
11
models
22
| 1 | Summary: lang:alloc; <crate::string::String>::as_str; Argument[self]; ReturnValue; taint |
33
edges
4-
| main.rs:20:9:20:9 | s | main.rs:21:19:21:25 | s[...] | provenance | |
5-
| main.rs:20:13:20:22 | source(...) | main.rs:20:9:20:9 | s | provenance | |
6-
| main.rs:21:9:21:14 | sliced [&ref] | main.rs:22:16:22:21 | sliced | provenance | |
7-
| main.rs:21:18:21:25 | &... [&ref] | main.rs:21:9:21:14 | sliced [&ref] | provenance | |
8-
| main.rs:21:19:21:25 | s[...] | main.rs:21:18:21:25 | &... [&ref] | provenance | |
9-
| main.rs:26:9:26:10 | s1 | main.rs:29:9:29:10 | s4 | provenance | |
10-
| main.rs:26:14:26:23 | source(...) | main.rs:26:9:26:10 | s1 | provenance | |
11-
| main.rs:29:9:29:10 | s4 | main.rs:32:10:32:11 | s4 | provenance | |
12-
| main.rs:57:9:57:9 | s | main.rs:58:16:58:16 | s | provenance | |
13-
| main.rs:57:13:57:22 | source(...) | main.rs:57:9:57:9 | s | provenance | |
14-
| main.rs:58:16:58:16 | s | main.rs:58:16:58:25 | s.as_str(...) | provenance | MaD:1 |
4+
| main.rs:26:9:26:9 | s | main.rs:27:19:27:25 | s[...] | provenance | |
5+
| main.rs:26:13:26:22 | source(...) | main.rs:26:9:26:9 | s | provenance | |
6+
| main.rs:27:9:27:14 | sliced [&ref] | main.rs:28:16:28:21 | sliced | provenance | |
7+
| main.rs:27:18:27:25 | &... [&ref] | main.rs:27:9:27:14 | sliced [&ref] | provenance | |
8+
| main.rs:27:19:27:25 | s[...] | main.rs:27:18:27:25 | &... [&ref] | provenance | |
9+
| main.rs:32:9:32:10 | s1 | main.rs:35:9:35:10 | s4 | provenance | |
10+
| main.rs:32:14:32:23 | source(...) | main.rs:32:9:32:10 | s1 | provenance | |
11+
| main.rs:35:9:35:10 | s4 | main.rs:38:10:38:11 | s4 | provenance | |
12+
| main.rs:63:9:63:9 | s | main.rs:64:16:64:16 | s | provenance | |
13+
| main.rs:63:13:63:22 | source(...) | main.rs:63:9:63:9 | s | provenance | |
14+
| main.rs:64:16:64:16 | s | main.rs:64:16:64:25 | s.as_str(...) | provenance | MaD:1 |
1515
nodes
16-
| main.rs:20:9:20:9 | s | semmle.label | s |
17-
| main.rs:20:13:20:22 | source(...) | semmle.label | source(...) |
18-
| main.rs:21:9:21:14 | sliced [&ref] | semmle.label | sliced [&ref] |
19-
| main.rs:21:18:21:25 | &... [&ref] | semmle.label | &... [&ref] |
20-
| main.rs:21:19:21:25 | s[...] | semmle.label | s[...] |
21-
| main.rs:22:16:22:21 | sliced | semmle.label | sliced |
22-
| main.rs:26:9:26:10 | s1 | semmle.label | s1 |
23-
| main.rs:26:14:26:23 | source(...) | semmle.label | source(...) |
24-
| main.rs:29:9:29:10 | s4 | semmle.label | s4 |
25-
| main.rs:32:10:32:11 | s4 | semmle.label | s4 |
26-
| main.rs:57:9:57:9 | s | semmle.label | s |
27-
| main.rs:57:13:57:22 | source(...) | semmle.label | source(...) |
28-
| main.rs:58:16:58:16 | s | semmle.label | s |
29-
| main.rs:58:16:58:25 | s.as_str(...) | semmle.label | s.as_str(...) |
16+
| main.rs:26:9:26:9 | s | semmle.label | s |
17+
| main.rs:26:13:26:22 | source(...) | semmle.label | source(...) |
18+
| main.rs:27:9:27:14 | sliced [&ref] | semmle.label | sliced [&ref] |
19+
| main.rs:27:18:27:25 | &... [&ref] | semmle.label | &... [&ref] |
20+
| main.rs:27:19:27:25 | s[...] | semmle.label | s[...] |
21+
| main.rs:28:16:28:21 | sliced | semmle.label | sliced |
22+
| main.rs:32:9:32:10 | s1 | semmle.label | s1 |
23+
| main.rs:32:14:32:23 | source(...) | semmle.label | source(...) |
24+
| main.rs:35:9:35:10 | s4 | semmle.label | s4 |
25+
| main.rs:38:10:38:11 | s4 | semmle.label | s4 |
26+
| main.rs:63:9:63:9 | s | semmle.label | s |
27+
| main.rs:63:13:63:22 | source(...) | semmle.label | source(...) |
28+
| main.rs:64:16:64:16 | s | semmle.label | s |
29+
| main.rs:64:16:64:25 | s.as_str(...) | semmle.label | s.as_str(...) |
3030
subpaths
3131
testFailures
3232
#select
33-
| main.rs:22:16:22:21 | sliced | main.rs:20:13:20:22 | source(...) | main.rs:22:16:22:21 | sliced | $@ | main.rs:20:13:20:22 | source(...) | source(...) |
34-
| main.rs:32:10:32:11 | s4 | main.rs:26:14:26:23 | source(...) | main.rs:32:10:32:11 | s4 | $@ | main.rs:26:14:26:23 | source(...) | source(...) |
35-
| main.rs:58:16:58:25 | s.as_str(...) | main.rs:57:13:57:22 | source(...) | main.rs:58:16:58:25 | s.as_str(...) | $@ | main.rs:57:13:57:22 | source(...) | source(...) |
33+
| main.rs:28:16:28:21 | sliced | main.rs:26:13:26:22 | source(...) | main.rs:28:16:28:21 | sliced | $@ | main.rs:26:13:26:22 | source(...) | source(...) |
34+
| main.rs:38:10:38:11 | s4 | main.rs:32:14:32:23 | source(...) | main.rs:38:10:38:11 | s4 | $@ | main.rs:32:14:32:23 | source(...) | source(...) |
35+
| main.rs:64:16:64:25 | s.as_str(...) | main.rs:63:13:63:22 | source(...) | main.rs:64:16:64:25 | s.as_str(...) | $@ | main.rs:63:13:63:22 | source(...) | source(...) |

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

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
1+
use std::fmt;
2+
13
// Taint tests for strings
24

35
fn source(i: i64) -> String {
46
format!("{}", i)
57
}
68

9+
fn source_usize(i: usize) -> usize {
10+
i
11+
}
12+
713
fn source_slice(_i: i64) -> &'static str {
814
"source"
915
}
@@ -18,7 +24,7 @@ fn sink(s: String) {
1824

1925
fn string_slice() {
2026
let s = source(35);
21-
let sliced = &s[1..3];
27+
let sliced = &s[1..2];
2228
sink_slice(sliced); // $ hasTaintFlow=35
2329
}
2430

@@ -58,16 +64,28 @@ fn as_str() {
5864
sink_slice(s.as_str()); // $ hasTaintFlow=67
5965
}
6066

61-
fn string_format() {
67+
fn format_args_built_in() {
68+
let s = source(88);
69+
70+
let formatted1 = fmt::format(format_args!("Hello {}!", s));
71+
sink(formatted1); // $ MISSING: hasTaintFlow=88
72+
73+
let formatted2 = fmt::format(format_args!("Hello {s}!"));
74+
sink(formatted2); // $ MISSING: hasTaintFlow=88
75+
76+
let width = source_usize(10);
77+
let formatted3 = fmt::format(format_args!("Hello {:width$}!", "World"));
78+
sink(formatted3); // $ MISSING: hasTaintFlow=10
79+
}
80+
81+
fn format_macro() {
6282
let s1 = source(34);
6383
let s2 = "2";
6484
let s3 = "3";
6585

66-
let s4 = format!("{s1} and {s3}");
67-
let s5 = format!("{s2} and {s3}");
68-
69-
sink_slice(&s4); // $ MISSING: hasTaintFlow=34
70-
sink_slice(&s5);
86+
sink(format!("{}", s1)); // $ MISSING: hasTaintFlow=34
87+
sink(format!("{s1} and {s3}")); // $ MISSING: hasTaintFlow=34
88+
sink(format!("{s2} and {s3}"));
7189
}
7290

7391
fn main() {
@@ -77,5 +95,6 @@ fn main() {
7795
string_from();
7896
as_str();
7997
string_to_string();
80-
string_format();
98+
format_args_built_in();
99+
format_macro();
81100
}

0 commit comments

Comments
 (0)