Skip to content

Commit a359a24

Browse files
authored
Merge pull request #20559 from paldepind/rust/string-add-ref
Rust: Add taint model for add on `String`
2 parents 372b587 + 19871a2 commit a359a24

File tree

8 files changed

+345
-137
lines changed

8 files changed

+345
-137
lines changed

rust/ql/lib/codeql/rust/frameworks/stdlib/lang-alloc.model.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,5 +46,7 @@ extensions:
4646
- ["<alloc::string::String as alloc::string::ToString>::to_string", "Argument[self]", "ReturnValue", "taint", "manual"]
4747
- ["<core::str>::parse", "Argument[self]", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"]
4848
- ["<core::str>::trim", "Argument[self]", "ReturnValue.Reference", "taint", "manual"]
49+
- ["<alloc::string::String as core::ops::arith::Add>::add", "Argument[self]", "ReturnValue", "taint", "manual"]
50+
- ["<alloc::string::String as core::ops::arith::Add>::add", "Argument[0].Reference", "ReturnValue", "taint", "manual"]
4951
# Vec
5052
- ["alloc::vec::from_elem", "Argument[0]", "ReturnValue.Element", "value", "manual"]

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

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
models
22
| 1 | Summary: <_ as core::convert::From>::from; Argument[0]; ReturnValue; taint |
33
| 2 | Summary: <alloc::string::String as core::convert::From>::from; Argument[0].Reference; ReturnValue; value |
4-
| 3 | Summary: <alloc::string::String as core::ops::arith::Add>::add; Argument[self]; ReturnValue; value |
5-
| 4 | Summary: <alloc::string::String>::as_str; Argument[self]; ReturnValue; value |
6-
| 5 | Summary: <core::str>::as_str; Argument[self]; ReturnValue; value |
7-
| 6 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint |
8-
| 7 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value |
4+
| 3 | Summary: <alloc::string::String as core::ops::arith::Add>::add; Argument[0].Reference; ReturnValue; taint |
5+
| 4 | Summary: <alloc::string::String as core::ops::arith::Add>::add; Argument[self]; ReturnValue; value |
6+
| 5 | Summary: <alloc::string::String>::as_str; Argument[self]; ReturnValue; value |
7+
| 6 | Summary: <core::str>::as_str; Argument[self]; ReturnValue; value |
8+
| 7 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint |
9+
| 8 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value |
910
edges
1011
| main.rs:26:9:26:9 | s | main.rs:27:19:27:25 | s[...] | provenance | |
1112
| main.rs:26:13:26:22 | source(...) | main.rs:26:9:26:9 | s | provenance | |
@@ -16,47 +17,51 @@ edges
1617
| main.rs:32:9:32:10 | s1 | main.rs:35:14:35:15 | s1 | provenance | |
1718
| main.rs:32:14:32:23 | source(...) | main.rs:32:9:32:10 | s1 | provenance | |
1819
| main.rs:35:9:35:10 | s4 | main.rs:38:10:38:11 | s4 | provenance | |
19-
| main.rs:35:14:35:15 | s1 | main.rs:35:14:35:20 | ... + ... | provenance | MaD:3 |
20+
| main.rs:35:14:35:15 | s1 | main.rs:35:14:35:20 | ... + ... | provenance | MaD:4 |
2021
| main.rs:35:14:35:20 | ... + ... | main.rs:35:9:35:10 | s4 | provenance | |
22+
| main.rs:43:9:43:10 | s1 | main.rs:46:34:46:35 | s1 | provenance | |
23+
| main.rs:43:14:43:23 | source(...) | main.rs:43:9:43:10 | s1 | provenance | |
24+
| main.rs:46:33:46:35 | &s1 [&ref] | main.rs:46:10:46:35 | ... + ... | provenance | MaD:3 |
25+
| main.rs:46:34:46:35 | s1 | main.rs:46:33:46:35 | &s1 [&ref] | provenance | |
2126
| main.rs:51:9:51:10 | s1 | main.rs:52:27:52:28 | s1 | provenance | |
2227
| main.rs:51:14:51:29 | source_slice(...) | main.rs:51:9:51:10 | s1 | provenance | |
2328
| main.rs:52:9:52:10 | s2 | main.rs:53:10:53:11 | s2 | provenance | |
2429
| main.rs:52:14:52:29 | ...::from(...) | main.rs:52:9:52:10 | s2 | provenance | |
2530
| main.rs:52:27:52:28 | s1 | main.rs:52:14:52:29 | ...::from(...) | provenance | MaD:1 |
2631
| main.rs:52:27:52:28 | s1 | main.rs:52:14:52:29 | ...::from(...) | provenance | MaD:2 |
2732
| main.rs:63:9:63:9 | s | main.rs:64:16:64:16 | s | provenance | |
28-
| main.rs:63:9:63:9 | s | main.rs:64:16:64:25 | s.as_str() | provenance | MaD:4 |
2933
| main.rs:63:9:63:9 | s | main.rs:64:16:64:25 | s.as_str() | provenance | MaD:5 |
34+
| main.rs:63:9:63:9 | s | main.rs:64:16:64:25 | s.as_str() | provenance | MaD:6 |
3035
| main.rs:63:13:63:22 | source(...) | main.rs:63:9:63:9 | s | provenance | |
31-
| main.rs:64:16:64:16 | s | main.rs:64:16:64:25 | s.as_str() | provenance | MaD:4 |
3236
| main.rs:64:16:64:16 | s | main.rs:64:16:64:25 | s.as_str() | provenance | MaD:5 |
37+
| main.rs:64:16:64:16 | s | main.rs:64:16:64:25 | s.as_str() | provenance | MaD:6 |
3338
| main.rs:68:9:68:9 | s | main.rs:70:34:70:61 | MacroExpr | provenance | |
3439
| main.rs:68:9:68:9 | s | main.rs:73:34:73:59 | MacroExpr | provenance | |
3540
| main.rs:68:13:68:22 | source(...) | main.rs:68:9:68:9 | s | provenance | |
3641
| main.rs:70:9:70:18 | formatted1 | main.rs:71:10:71:19 | formatted1 | provenance | |
3742
| main.rs:70:22:70:62 | ...::format(...) | main.rs:70:9:70:18 | formatted1 | provenance | |
38-
| main.rs:70:34:70:61 | MacroExpr | main.rs:70:22:70:62 | ...::format(...) | provenance | MaD:6 |
43+
| main.rs:70:34:70:61 | MacroExpr | main.rs:70:22:70:62 | ...::format(...) | provenance | MaD:7 |
3944
| main.rs:73:9:73:18 | formatted2 | main.rs:74:10:74:19 | formatted2 | provenance | |
4045
| main.rs:73:22:73:60 | ...::format(...) | main.rs:73:9:73:18 | formatted2 | provenance | |
41-
| main.rs:73:34:73:59 | MacroExpr | main.rs:73:22:73:60 | ...::format(...) | provenance | MaD:6 |
46+
| main.rs:73:34:73:59 | MacroExpr | main.rs:73:22:73:60 | ...::format(...) | provenance | MaD:7 |
4247
| main.rs:76:9:76:13 | width | main.rs:77:34:77:74 | MacroExpr | provenance | |
4348
| main.rs:76:17:76:32 | source_usize(...) | main.rs:76:9:76:13 | width | provenance | |
4449
| main.rs:77:9:77:18 | formatted3 | main.rs:78:10:78:19 | formatted3 | provenance | |
4550
| main.rs:77:22:77:75 | ...::format(...) | main.rs:77:9:77:18 | formatted3 | provenance | |
46-
| main.rs:77:34:77:74 | MacroExpr | main.rs:77:22:77:75 | ...::format(...) | provenance | MaD:6 |
51+
| main.rs:77:34:77:74 | MacroExpr | main.rs:77:22:77:75 | ...::format(...) | provenance | MaD:7 |
4752
| main.rs:82:9:82:10 | s1 | main.rs:86:18:86:25 | MacroExpr | provenance | |
4853
| main.rs:82:9:82:10 | s1 | main.rs:87:18:87:32 | MacroExpr | provenance | |
4954
| main.rs:82:14:82:23 | source(...) | main.rs:82:9:82:10 | s1 | provenance | |
5055
| main.rs:86:10:86:16 | res | main.rs:86:18:86:25 | { ... } | provenance | |
5156
| main.rs:86:18:86:25 | ...::format(...) | main.rs:86:10:86:16 | res | provenance | |
5257
| main.rs:86:18:86:25 | ...::must_use(...) | main.rs:86:10:86:26 | MacroExpr | provenance | |
53-
| main.rs:86:18:86:25 | MacroExpr | main.rs:86:18:86:25 | ...::format(...) | provenance | MaD:6 |
54-
| main.rs:86:18:86:25 | { ... } | main.rs:86:18:86:25 | ...::must_use(...) | provenance | MaD:7 |
58+
| main.rs:86:18:86:25 | MacroExpr | main.rs:86:18:86:25 | ...::format(...) | provenance | MaD:7 |
59+
| main.rs:86:18:86:25 | { ... } | main.rs:86:18:86:25 | ...::must_use(...) | provenance | MaD:8 |
5560
| main.rs:87:10:87:16 | res | main.rs:87:18:87:32 | { ... } | provenance | |
5661
| main.rs:87:18:87:32 | ...::format(...) | main.rs:87:10:87:16 | res | provenance | |
5762
| main.rs:87:18:87:32 | ...::must_use(...) | main.rs:87:10:87:33 | MacroExpr | provenance | |
58-
| main.rs:87:18:87:32 | MacroExpr | main.rs:87:18:87:32 | ...::format(...) | provenance | MaD:6 |
59-
| main.rs:87:18:87:32 | { ... } | main.rs:87:18:87:32 | ...::must_use(...) | provenance | MaD:7 |
63+
| main.rs:87:18:87:32 | MacroExpr | main.rs:87:18:87:32 | ...::format(...) | provenance | MaD:7 |
64+
| main.rs:87:18:87:32 | { ... } | main.rs:87:18:87:32 | ...::must_use(...) | provenance | MaD:8 |
6065
nodes
6166
| main.rs:26:9:26:9 | s | semmle.label | s |
6267
| main.rs:26:13:26:22 | source(...) | semmle.label | source(...) |
@@ -70,6 +75,11 @@ nodes
7075
| main.rs:35:14:35:15 | s1 | semmle.label | s1 |
7176
| main.rs:35:14:35:20 | ... + ... | semmle.label | ... + ... |
7277
| main.rs:38:10:38:11 | s4 | semmle.label | s4 |
78+
| main.rs:43:9:43:10 | s1 | semmle.label | s1 |
79+
| main.rs:43:14:43:23 | source(...) | semmle.label | source(...) |
80+
| main.rs:46:10:46:35 | ... + ... | semmle.label | ... + ... |
81+
| main.rs:46:33:46:35 | &s1 [&ref] | semmle.label | &s1 [&ref] |
82+
| main.rs:46:34:46:35 | s1 | semmle.label | s1 |
7383
| main.rs:51:9:51:10 | s1 | semmle.label | s1 |
7484
| main.rs:51:14:51:29 | source_slice(...) | semmle.label | source_slice(...) |
7585
| main.rs:52:9:52:10 | s2 | semmle.label | s2 |
@@ -115,6 +125,7 @@ testFailures
115125
#select
116126
| 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(...) |
117127
| 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(...) |
128+
| main.rs:46:10:46:35 | ... + ... | main.rs:43:14:43:23 | source(...) | main.rs:46:10:46:35 | ... + ... | $@ | main.rs:43:14:43:23 | source(...) | source(...) |
118129
| main.rs:53:10:53:11 | s2 | main.rs:51:14:51:29 | source_slice(...) | main.rs:53:10:53:11 | s2 | $@ | main.rs:51:14:51:29 | source_slice(...) | source_slice(...) |
119130
| 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(...) |
120131
| main.rs:71:10:71:19 | formatted1 | main.rs:68:13:68:22 | source(...) | main.rs:71:10:71:19 | formatted1 | $@ | main.rs:68:13:68:22 | source(...) | source(...) |

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ fn string_add_reference() {
4343
let s1 = source(37);
4444
let s2 = "1".to_string();
4545

46-
sink("Hello ".to_string() + &s1); // $ MISSING: hasTaintFlow=37
46+
sink("Hello ".to_string() + &s1); // $ hasTaintFlow=37
4747
sink("Hello ".to_string() + &s2);
4848
}
4949

@@ -56,7 +56,7 @@ fn string_from() {
5656
fn string_to_string() {
5757
let s1 = source_slice(22);
5858
let s2 = s1.to_string();
59-
sink(s2); // $ MISSING: hasTaintFlow=22 - we are not currently able to resolve the `to_string` call above, which comes from `impl<T: fmt::Display + ?Sized> ToString for T`
59+
sink(s2); // $ MISSING: hasTaintFlow=22
6060
}
6161

6262
fn as_str() {

0 commit comments

Comments
 (0)