Skip to content

Commit 78ea53b

Browse files
committed
Rust: Expand and clean up from / into models.
1 parent f1c23e4 commit 78ea53b

File tree

3 files changed

+52
-32
lines changed

3 files changed

+52
-32
lines changed

rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,14 @@ extensions:
1010
# Clone
1111
- ["<_ as core::clone::Clone>::clone", "Argument[self].Reference", "ReturnValue", "value", "manual"]
1212
# Conversions
13+
- ["<_ as core::convert::From>::from", "Argument[0]", "ReturnValue", "taint", "manual"]
14+
- ["<_ as core::convert::From>::from", "Argument[0].Reference", "ReturnValue", "taint", "manual"]
15+
- ["<_ as core::convert::From>::from", "Argument[0].Element", "ReturnValue.Element", "taint", "manual"]
16+
- ["<_ as core::convert::From>::from", "Argument[0].Reference.Element", "ReturnValue.Element", "taint", "manual"]
17+
- ["<_ as core::convert::Into>::into", "Argument[self]", "ReturnValue", "taint", "manual"]
18+
- ["<_ as core::convert::Into>::into", "Argument[self].Reference", "ReturnValue", "taint", "manual"]
1319
- ["<_ as core::convert::Into>::into", "Argument[self].Element", "ReturnValue.Element", "taint", "manual"]
1420
- ["<_ as core::convert::Into>::into", "Argument[self].Reference.Element", "ReturnValue.Element", "taint", "manual"]
15-
# From
16-
- ["<_ as core::convert::From>::from", "Argument[0]", "ReturnValue", "taint", "manual"]
1721
# Iterator
1822
- ["<core::result::Result>::iter", "Argument[self].Element", "ReturnValue.Element", "value", "manual"]
1923
- ["<_ as value_trait::array::Array>::iter", "Argument[self].Element", "ReturnValue.Element", "value", "manual"]

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

Lines changed: 45 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
models
22
| 1 | Summary: <_ as alloc::string::ToString>::to_string; Argument[self]; ReturnValue; taint |
3-
| 2 | Summary: <_ as core::convert::From>::from; Argument[0]; ReturnValue; taint |
4-
| 3 | Summary: <_ as core::ops::arith::Add>::add; Argument[0].Reference; ReturnValue; taint |
5-
| 4 | Summary: <_ as core::ops::arith::Add>::add; Argument[self]; ReturnValue; taint |
6-
| 5 | Summary: <alloc::string::String as core::convert::AsMut>::as_mut; Argument[self]; ReturnValue; value |
7-
| 6 | Summary: <alloc::string::String as core::convert::AsRef>::as_ref; Argument[self]; ReturnValue; value |
8-
| 7 | Summary: <alloc::string::String as core::convert::From>::from; Argument[0].Reference; ReturnValue; value |
9-
| 8 | Summary: <alloc::string::String as core::ops::arith::Add>::add; Argument[self]; ReturnValue; value |
10-
| 9 | Summary: <alloc::string::String>::as_str; Argument[self]; ReturnValue; value |
11-
| 10 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint |
12-
| 11 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value |
3+
| 2 | Summary: <_ as core::convert::From>::from; Argument[0].Element; ReturnValue.Element; taint |
4+
| 3 | Summary: <_ as core::convert::From>::from; Argument[0].Reference; ReturnValue; taint |
5+
| 4 | Summary: <_ as core::convert::From>::from; Argument[0]; ReturnValue; taint |
6+
| 5 | Summary: <_ as core::ops::arith::Add>::add; Argument[0].Reference; ReturnValue; taint |
7+
| 6 | Summary: <_ as core::ops::arith::Add>::add; Argument[self]; ReturnValue; taint |
8+
| 7 | Summary: <alloc::string::String as core::convert::AsMut>::as_mut; Argument[self]; ReturnValue; value |
9+
| 8 | Summary: <alloc::string::String as core::convert::AsRef>::as_ref; Argument[self]; ReturnValue; value |
10+
| 9 | Summary: <alloc::string::String as core::convert::From>::from; Argument[0].Reference; ReturnValue; value |
11+
| 10 | Summary: <alloc::string::String as core::ops::arith::Add>::add; Argument[self]; ReturnValue; value |
12+
| 11 | Summary: <alloc::string::String>::as_str; Argument[self]; ReturnValue; value |
13+
| 12 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint |
14+
| 13 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value |
1315
edges
1416
| main.rs:30:9:30:9 | s | main.rs:31:19:31:25 | s[...] | provenance | |
1517
| main.rs:30:13:30:22 | source(...) | main.rs:30:9:30:9 | s | provenance | |
@@ -20,71 +22,78 @@ edges
2022
| main.rs:36:9:36:10 | s1 | main.rs:39:14:39:15 | s1 | provenance | |
2123
| main.rs:36:14:36:23 | source(...) | main.rs:36:9:36:10 | s1 | provenance | |
2224
| main.rs:39:9:39:10 | s4 | main.rs:42:10:42:11 | s4 | provenance | |
23-
| main.rs:39:14:39:15 | s1 | main.rs:39:14:39:20 | ... + ... | provenance | MaD:4 |
24-
| main.rs:39:14:39:15 | s1 | main.rs:39:14:39:20 | ... + ... | provenance | MaD:8 |
25+
| main.rs:39:14:39:15 | s1 | main.rs:39:14:39:20 | ... + ... | provenance | MaD:6 |
26+
| main.rs:39:14:39:15 | s1 | main.rs:39:14:39:20 | ... + ... | provenance | MaD:10 |
2527
| main.rs:39:14:39:20 | ... + ... | main.rs:39:9:39:10 | s4 | provenance | |
2628
| main.rs:47:9:47:10 | s1 | main.rs:50:34:50:35 | s1 | provenance | |
2729
| main.rs:47:14:47:23 | source(...) | main.rs:47:9:47:10 | s1 | provenance | |
28-
| main.rs:50:33:50:35 | &s1 [&ref] | main.rs:50:10:50:35 | ... + ... | provenance | MaD:3 |
30+
| main.rs:50:33:50:35 | &s1 [&ref] | main.rs:50:10:50:35 | ... + ... | provenance | MaD:5 |
2931
| main.rs:50:34:50:35 | s1 | main.rs:50:33:50:35 | &s1 [&ref] | provenance | |
3032
| main.rs:55:9:55:10 | s1 | main.rs:57:27:57:28 | s1 | provenance | |
3133
| main.rs:55:14:55:29 | source_slice(...) | main.rs:55:9:55:10 | s1 | provenance | |
3234
| main.rs:57:9:57:10 | s2 | main.rs:58:10:58:11 | s2 | provenance | |
3335
| main.rs:57:14:57:29 | ...::from(...) | main.rs:57:9:57:10 | s2 | provenance | |
34-
| main.rs:57:27:57:28 | s1 | main.rs:57:14:57:29 | ...::from(...) | provenance | MaD:2 |
35-
| main.rs:57:27:57:28 | s1 | main.rs:57:14:57:29 | ...::from(...) | provenance | MaD:7 |
36+
| main.rs:57:27:57:28 | s1 | main.rs:57:14:57:29 | ...::from(...) | provenance | MaD:3 |
37+
| main.rs:57:27:57:28 | s1 | main.rs:57:14:57:29 | ...::from(...) | provenance | MaD:4 |
38+
| main.rs:57:27:57:28 | s1 | main.rs:57:14:57:29 | ...::from(...) | provenance | MaD:9 |
3639
| main.rs:66:9:66:10 | ss [element] | main.rs:67:16:67:17 | ss [element] | provenance | |
3740
| main.rs:66:9:66:10 | ss [element] | main.rs:69:27:69:28 | ss [element] | provenance | |
41+
| main.rs:66:9:66:10 | ss [element] | main.rs:78:36:78:37 | ss [element] | provenance | |
3842
| main.rs:66:25:66:60 | [...] [element] | main.rs:66:9:66:10 | ss [element] | provenance | |
3943
| main.rs:66:26:66:41 | source_slice(...) | main.rs:66:25:66:60 | [...] [element] | provenance | |
4044
| main.rs:66:44:66:59 | source_slice(...) | main.rs:66:25:66:60 | [...] [element] | provenance | |
4145
| main.rs:67:16:67:17 | ss [element] | main.rs:67:16:67:20 | ss[0] | provenance | |
4246
| main.rs:69:9:69:10 | s5 | main.rs:70:10:70:11 | s5 | provenance | |
4347
| main.rs:69:14:69:32 | ...::from(...) | main.rs:69:9:69:10 | s5 | provenance | |
4448
| main.rs:69:27:69:28 | ss [element] | main.rs:69:27:69:31 | ss[0] | provenance | |
45-
| main.rs:69:27:69:31 | ss[0] | main.rs:69:14:69:32 | ...::from(...) | provenance | MaD:2 |
46-
| main.rs:69:27:69:31 | ss[0] | main.rs:69:14:69:32 | ...::from(...) | provenance | MaD:7 |
49+
| main.rs:69:27:69:31 | ss[0] | main.rs:69:14:69:32 | ...::from(...) | provenance | MaD:3 |
50+
| main.rs:69:27:69:31 | ss[0] | main.rs:69:14:69:32 | ...::from(...) | provenance | MaD:4 |
51+
| main.rs:69:27:69:31 | ss[0] | main.rs:69:14:69:32 | ...::from(...) | provenance | MaD:9 |
52+
| main.rs:78:9:78:11 | ss2 [element] | main.rs:79:16:79:18 | ss2 [element] | provenance | |
53+
| main.rs:78:26:78:38 | ...::from(...) [element] | main.rs:78:9:78:11 | ss2 [element] | provenance | |
54+
| main.rs:78:36:78:37 | ss [element] | main.rs:78:26:78:38 | ...::from(...) [element] | provenance | MaD:2 |
55+
| main.rs:79:16:79:18 | ss2 [element] | main.rs:79:16:79:21 | ss2[0] | provenance | |
4756
| main.rs:89:9:89:10 | s1 | main.rs:90:14:90:27 | s1.to_string() | provenance | MaD:1 |
4857
| main.rs:89:14:89:29 | source_slice(...) | main.rs:89:9:89:10 | s1 | provenance | |
4958
| main.rs:90:9:90:10 | s2 | main.rs:91:10:91:11 | s2 | provenance | |
5059
| main.rs:90:14:90:27 | s1.to_string() | main.rs:90:9:90:10 | s2 | provenance | |
5160
| main.rs:95:9:95:9 | s | main.rs:96:16:96:16 | s | provenance | |
52-
| main.rs:95:9:95:9 | s | main.rs:96:16:96:25 | s.as_str() | provenance | MaD:9 |
61+
| main.rs:95:9:95:9 | s | main.rs:96:16:96:25 | s.as_str() | provenance | MaD:11 |
5362
| main.rs:95:13:95:22 | source(...) | main.rs:95:9:95:9 | s | provenance | |
54-
| main.rs:96:16:96:16 | s | main.rs:96:16:96:25 | s.as_str() | provenance | MaD:9 |
63+
| main.rs:96:16:96:16 | s | main.rs:96:16:96:25 | s.as_str() | provenance | MaD:11 |
5564
| main.rs:100:9:100:9 | s | main.rs:102:34:102:61 | MacroExpr | provenance | |
5665
| main.rs:100:9:100:9 | s | main.rs:105:34:105:59 | MacroExpr | provenance | |
5766
| main.rs:100:13:100:22 | source(...) | main.rs:100:9:100:9 | s | provenance | |
5867
| main.rs:102:9:102:18 | formatted1 | main.rs:103:10:103:19 | formatted1 | provenance | |
5968
| main.rs:102:22:102:62 | ...::format(...) | main.rs:102:9:102:18 | formatted1 | provenance | |
60-
| main.rs:102:34:102:61 | MacroExpr | main.rs:102:22:102:62 | ...::format(...) | provenance | MaD:10 |
69+
| main.rs:102:34:102:61 | MacroExpr | main.rs:102:22:102:62 | ...::format(...) | provenance | MaD:12 |
6170
| main.rs:105:9:105:18 | formatted2 | main.rs:106:10:106:19 | formatted2 | provenance | |
6271
| main.rs:105:22:105:60 | ...::format(...) | main.rs:105:9:105:18 | formatted2 | provenance | |
63-
| main.rs:105:34:105:59 | MacroExpr | main.rs:105:22:105:60 | ...::format(...) | provenance | MaD:10 |
72+
| main.rs:105:34:105:59 | MacroExpr | main.rs:105:22:105:60 | ...::format(...) | provenance | MaD:12 |
6473
| main.rs:108:9:108:13 | width | main.rs:109:34:109:74 | MacroExpr | provenance | |
6574
| main.rs:108:17:108:32 | source_usize(...) | main.rs:108:9:108:13 | width | provenance | |
6675
| main.rs:109:9:109:18 | formatted3 | main.rs:110:10:110:19 | formatted3 | provenance | |
6776
| main.rs:109:22:109:75 | ...::format(...) | main.rs:109:9:109:18 | formatted3 | provenance | |
68-
| main.rs:109:34:109:74 | MacroExpr | main.rs:109:22:109:75 | ...::format(...) | provenance | MaD:10 |
77+
| main.rs:109:34:109:74 | MacroExpr | main.rs:109:22:109:75 | ...::format(...) | provenance | MaD:12 |
6978
| main.rs:114:9:114:10 | s1 | main.rs:118:18:118:25 | MacroExpr | provenance | |
7079
| main.rs:114:9:114:10 | s1 | main.rs:119:18:119:32 | MacroExpr | provenance | |
7180
| main.rs:114:14:114:23 | source(...) | main.rs:114:9:114:10 | s1 | provenance | |
7281
| main.rs:118:18:118:25 | ...::format(...) | main.rs:118:18:118:25 | { ... } | provenance | |
7382
| main.rs:118:18:118:25 | ...::must_use(...) | main.rs:118:10:118:26 | MacroExpr | provenance | |
74-
| main.rs:118:18:118:25 | MacroExpr | main.rs:118:18:118:25 | ...::format(...) | provenance | MaD:10 |
75-
| main.rs:118:18:118:25 | { ... } | main.rs:118:18:118:25 | ...::must_use(...) | provenance | MaD:11 |
83+
| main.rs:118:18:118:25 | MacroExpr | main.rs:118:18:118:25 | ...::format(...) | provenance | MaD:12 |
84+
| main.rs:118:18:118:25 | { ... } | main.rs:118:18:118:25 | ...::must_use(...) | provenance | MaD:13 |
7685
| main.rs:119:18:119:32 | ...::format(...) | main.rs:119:18:119:32 | { ... } | provenance | |
7786
| main.rs:119:18:119:32 | ...::must_use(...) | main.rs:119:10:119:33 | MacroExpr | provenance | |
78-
| main.rs:119:18:119:32 | MacroExpr | main.rs:119:18:119:32 | ...::format(...) | provenance | MaD:10 |
79-
| main.rs:119:18:119:32 | { ... } | main.rs:119:18:119:32 | ...::must_use(...) | provenance | MaD:11 |
87+
| main.rs:119:18:119:32 | MacroExpr | main.rs:119:18:119:32 | ...::format(...) | provenance | MaD:12 |
88+
| main.rs:119:18:119:32 | { ... } | main.rs:119:18:119:32 | ...::must_use(...) | provenance | MaD:13 |
8089
| main.rs:124:9:124:14 | mut s1 | main.rs:126:15:126:16 | s1 | provenance | |
81-
| main.rs:124:9:124:14 | mut s1 | main.rs:127:14:127:24 | s1.as_ref() | provenance | MaD:6 |
90+
| main.rs:124:9:124:14 | mut s1 | main.rs:127:14:127:24 | s1.as_ref() | provenance | MaD:8 |
8291
| main.rs:124:9:124:14 | mut s1 | main.rs:128:14:128:15 | s1 | provenance | |
83-
| main.rs:124:9:124:14 | mut s1 | main.rs:128:14:128:24 | s1.as_mut() | provenance | MaD:5 |
92+
| main.rs:124:9:124:14 | mut s1 | main.rs:128:14:128:24 | s1.as_mut() | provenance | MaD:7 |
8493
| main.rs:124:18:124:27 | source(...) | main.rs:124:18:124:39 | ... .to_string() | provenance | MaD:1 |
8594
| main.rs:124:18:124:39 | ... .to_string() | main.rs:124:9:124:14 | mut s1 | provenance | |
8695
| main.rs:126:15:126:16 | s1 | main.rs:126:14:126:16 | &s1 | provenance | |
87-
| main.rs:128:14:128:15 | s1 | main.rs:128:14:128:24 | s1.as_mut() | provenance | MaD:5 |
96+
| main.rs:128:14:128:15 | s1 | main.rs:128:14:128:24 | s1.as_mut() | provenance | MaD:7 |
8897
nodes
8998
| main.rs:30:9:30:9 | s | semmle.label | s |
9099
| main.rs:30:13:30:22 | source(...) | semmle.label | source(...) |
@@ -120,6 +129,11 @@ nodes
120129
| main.rs:69:27:69:28 | ss [element] | semmle.label | ss [element] |
121130
| main.rs:69:27:69:31 | ss[0] | semmle.label | ss[0] |
122131
| main.rs:70:10:70:11 | s5 | semmle.label | s5 |
132+
| main.rs:78:9:78:11 | ss2 [element] | semmle.label | ss2 [element] |
133+
| main.rs:78:26:78:38 | ...::from(...) [element] | semmle.label | ...::from(...) [element] |
134+
| main.rs:78:36:78:37 | ss [element] | semmle.label | ss [element] |
135+
| main.rs:79:16:79:18 | ss2 [element] | semmle.label | ss2 [element] |
136+
| main.rs:79:16:79:21 | ss2[0] | semmle.label | ss2[0] |
123137
| main.rs:89:9:89:10 | s1 | semmle.label | s1 |
124138
| main.rs:89:14:89:29 | source_slice(...) | semmle.label | source_slice(...) |
125139
| main.rs:90:9:90:10 | s2 | semmle.label | s2 |
@@ -176,6 +190,8 @@ testFailures
176190
| main.rs:67:16:67:20 | ss[0] | main.rs:66:44:66:59 | source_slice(...) | main.rs:67:16:67:20 | ss[0] | $@ | main.rs:66:44:66:59 | source_slice(...) | source_slice(...) |
177191
| main.rs:70:10:70:11 | s5 | main.rs:66:26:66:41 | source_slice(...) | main.rs:70:10:70:11 | s5 | $@ | main.rs:66:26:66:41 | source_slice(...) | source_slice(...) |
178192
| main.rs:70:10:70:11 | s5 | main.rs:66:44:66:59 | source_slice(...) | main.rs:70:10:70:11 | s5 | $@ | main.rs:66:44:66:59 | source_slice(...) | source_slice(...) |
193+
| main.rs:79:16:79:21 | ss2[0] | main.rs:66:26:66:41 | source_slice(...) | main.rs:79:16:79:21 | ss2[0] | $@ | main.rs:66:26:66:41 | source_slice(...) | source_slice(...) |
194+
| main.rs:79:16:79:21 | ss2[0] | main.rs:66:44:66:59 | source_slice(...) | main.rs:79:16:79:21 | ss2[0] | $@ | main.rs:66:44:66:59 | source_slice(...) | source_slice(...) |
179195
| main.rs:91:10:91:11 | s2 | main.rs:89:14:89:29 | source_slice(...) | main.rs:91:10:91:11 | s2 | $@ | main.rs:89:14:89:29 | source_slice(...) | source_slice(...) |
180196
| main.rs:96:16:96:25 | s.as_str() | main.rs:95:13:95:22 | source(...) | main.rs:96:16:96:25 | s.as_str() | $@ | main.rs:95:13:95:22 | source(...) | source(...) |
181197
| main.rs:103:10:103:19 | formatted1 | main.rs:100:13:100:22 | source(...) | main.rs:103:10:103:19 | formatted1 | $@ | main.rs:100:13:100:22 | source(...) | source(...) |

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ fn string_conversions() {
7676
sink(s8); // $ MISSING: hasTaintFlow=37
7777

7878
let ss2: Vec<&str> = Vec::from(ss);
79-
sink_slice(ss2[0]); // $ MISSING: hasTaintFlow=37
79+
sink_slice(ss2[0]); // $ hasTaintFlow=37 SPURIOUS: hasTaintFlow=38
8080
let ss3: Vec<&str> = Vec::try_from(ss).unwrap();
8181
sink_slice(ss3[0]); // $ MISSING: hasTaintFlow=37
8282
let ss4: Vec<&str> = ss.into();

0 commit comments

Comments
 (0)