Skip to content

Commit bfb716b

Browse files
committed
Rust: Adapt tests and existing models to account for generated models
1 parent 925d6ac commit bfb716b

File tree

12 files changed

+2335
-774
lines changed

12 files changed

+2335
-774
lines changed

rust/ql/integration-tests/hello-project/summary.expected

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
| Macro calls - resolved | 2 |
1515
| Macro calls - total | 2 |
1616
| Macro calls - unresolved | 0 |
17-
| Taint edges - number of edges | 4 |
17+
| Taint edges - number of edges | 1465 |
1818
| Taint reach - nodes tainted | 0 |
1919
| Taint reach - per million nodes | 0 |
2020
| Taint sinks - cryptographic operations | 0 |

rust/ql/lib/codeql/rust/dataflow/internal/DataFlowConsistency.qll

+2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ private module Input implements InputSig<Location, RustDataFlow> {
1111
not exists(n.asExpr().getLocation())
1212
}
1313

14+
predicate postWithInFlowExclude(RustDataFlow::Node n) { n instanceof Node::FlowSummaryNode }
15+
1416
predicate missingLocationExclude(RustDataFlow::Node n) { not exists(n.asExpr().getLocation()) }
1517
}
1618

rust/ql/lib/codeql/rust/frameworks/stdlib/Clone.qll

+7-2
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,12 @@ final class CloneCallable extends SummarizedCallable::Range {
1515
)
1616
}
1717

18-
final override predicate propagatesFlow(string input, string output, boolean preservesValue) {
19-
input = "Argument[self]" and output = "ReturnValue" and preservesValue = true
18+
final override predicate propagatesFlow(
19+
string input, string output, boolean preservesValue, string model
20+
) {
21+
input = "Argument[self]" and
22+
output = "ReturnValue" and
23+
preservesValue = true and
24+
model = "generated"
2025
}
2126
}

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

-2
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@ extensions:
55
data:
66
# Fmt
77
- ["lang:alloc", "crate::fmt::format", "Argument[0]", "ReturnValue", "taint", "manual"]
8-
# Hint
9-
- ["lang:core", "crate::hint::must_use", "Argument[0]", "ReturnValue", "value", "manual"]
108
# Iterator
119
- ["lang:core", "crate::iter::traits::iterator::Iterator::nth", "Argument[self].Element", "ReturnValue.Field[crate::option::Option::Some(0)]", "value", "manual"]
1210
- ["lang:core", "crate::iter::traits::iterator::Iterator::collect", "Argument[self].Element", "ReturnValue.Element", "value", "manual"]

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

+2,266-692
Large diffs are not rendered by default.

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

+3-5
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,9 @@ private module Tm = TranslateModels<provenance/1>;
88

99
query predicate models = Tm::models/2;
1010

11-
query predicate localStep(Node nodeFrom, Node nodeTo, string model) {
12-
exists(string madId |
13-
RustDataFlow::simpleLocalFlowStep(nodeFrom, nodeTo, madId) and
14-
Tm::translateModels(madId, model)
15-
)
11+
query predicate localStep(Node nodeFrom, Node nodeTo) {
12+
// Local flow steps that don't originate from a flow summary.
13+
RustDataFlow::simpleLocalFlowStep(nodeFrom, nodeTo, "")
1614
}
1715

1816
query predicate storeStep = RustDataFlow::storeStep/3;

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

+9-6
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ models
22
| 1 | Summary: lang:core; <crate::option::Option as crate::clone::Clone>::clone; Argument[self].Field[crate::option::Option::Some(0)]; ReturnValue.Field[crate::option::Option::Some(0)]; value |
33
| 2 | Summary: lang:core; <crate::option::Option>::unwrap; Argument[self].Field[crate::option::Option::Some(0)]; ReturnValue; value |
44
| 3 | Summary: lang:core; <crate::option::Option>::zip; Argument[0].Field[crate::option::Option::Some(0)]; ReturnValue.Field[crate::option::Option::Some(0)].Field[1]; value |
5-
| 4 | Summary: lang:core; <crate::result::Result>::unwrap; Argument[self].Field[crate::result::Result::Ok(0)]; ReturnValue; value |
5+
| 4 | Summary: lang:core; <crate::result::Result as crate::clone::Clone>::clone; Argument[self].Field[crate::result::Result::Ok(0)]; ReturnValue.Field[crate::result::Result::Ok(0)]; value |
6+
| 5 | Summary: lang:core; <crate::result::Result>::unwrap; Argument[self].Field[crate::result::Result::Ok(0)]; ReturnValue; value |
67
edges
78
| main.rs:13:9:13:9 | a [Some] | main.rs:14:10:14:10 | a [Some] | provenance | |
89
| main.rs:13:9:13:9 | a [Some] | main.rs:15:13:15:13 | a [Some] | provenance | |
@@ -11,22 +12,24 @@ edges
1112
| main.rs:14:10:14:10 | a [Some] | main.rs:14:10:14:19 | a.unwrap(...) | provenance | MaD:2 |
1213
| main.rs:15:9:15:9 | b [Some] | main.rs:16:10:16:10 | b [Some] | provenance | |
1314
| main.rs:15:13:15:13 | a [Some] | main.rs:15:13:15:21 | a.clone(...) [Some] | provenance | MaD:1 |
15+
| main.rs:15:13:15:13 | a [Some] | main.rs:15:13:15:21 | a.clone(...) [Some] | provenance | generated |
1416
| main.rs:15:13:15:21 | a.clone(...) [Some] | main.rs:15:9:15:9 | b [Some] | provenance | |
1517
| main.rs:16:10:16:10 | b [Some] | main.rs:16:10:16:19 | b.unwrap(...) | provenance | MaD:2 |
1618
| main.rs:20:9:20:9 | a [Ok] | main.rs:21:10:21:10 | a [Ok] | provenance | |
1719
| main.rs:20:9:20:9 | a [Ok] | main.rs:22:13:22:13 | a [Ok] | provenance | |
1820
| main.rs:20:31:20:44 | Ok(...) [Ok] | main.rs:20:9:20:9 | a [Ok] | provenance | |
1921
| main.rs:20:34:20:43 | source(...) | main.rs:20:31:20:44 | Ok(...) [Ok] | provenance | |
20-
| main.rs:21:10:21:10 | a [Ok] | main.rs:21:10:21:19 | a.unwrap(...) | provenance | MaD:4 |
22+
| main.rs:21:10:21:10 | a [Ok] | main.rs:21:10:21:19 | a.unwrap(...) | provenance | MaD:5 |
2123
| main.rs:22:9:22:9 | b [Ok] | main.rs:23:10:23:10 | b [Ok] | provenance | |
22-
| main.rs:22:13:22:13 | a [Ok] | main.rs:22:13:22:21 | a.clone(...) [Ok] | provenance | |
24+
| main.rs:22:13:22:13 | a [Ok] | main.rs:22:13:22:21 | a.clone(...) [Ok] | provenance | MaD:4 |
25+
| main.rs:22:13:22:13 | a [Ok] | main.rs:22:13:22:21 | a.clone(...) [Ok] | provenance | generated |
2326
| main.rs:22:13:22:21 | a.clone(...) [Ok] | main.rs:22:9:22:9 | b [Ok] | provenance | |
24-
| main.rs:23:10:23:10 | b [Ok] | main.rs:23:10:23:19 | b.unwrap(...) | provenance | MaD:4 |
27+
| main.rs:23:10:23:10 | b [Ok] | main.rs:23:10:23:19 | b.unwrap(...) | provenance | MaD:5 |
2528
| main.rs:27:9:27:9 | a | main.rs:28:10:28:10 | a | provenance | |
2629
| main.rs:27:9:27:9 | a | main.rs:29:13:29:13 | a | provenance | |
2730
| main.rs:27:13:27:22 | source(...) | main.rs:27:9:27:9 | a | provenance | |
2831
| main.rs:29:9:29:9 | b | main.rs:30:10:30:10 | b | provenance | |
29-
| main.rs:29:13:29:13 | a | main.rs:29:13:29:21 | a.clone(...) | provenance | |
32+
| main.rs:29:13:29:13 | a | main.rs:29:13:29:21 | a.clone(...) | provenance | generated |
3033
| main.rs:29:13:29:21 | a.clone(...) | main.rs:29:9:29:9 | b | provenance | |
3134
| main.rs:42:13:42:13 | w [Wrapper] | main.rs:43:15:43:15 | w [Wrapper] | provenance | |
3235
| main.rs:42:17:42:41 | Wrapper {...} [Wrapper] | main.rs:42:13:42:13 | w [Wrapper] | provenance | |
@@ -36,7 +39,7 @@ edges
3639
| main.rs:44:13:44:28 | Wrapper {...} [Wrapper] | main.rs:44:26:44:26 | n | provenance | |
3740
| main.rs:44:26:44:26 | n | main.rs:44:38:44:38 | n | provenance | |
3841
| main.rs:46:13:46:13 | u [Wrapper] | main.rs:47:15:47:15 | u [Wrapper] | provenance | |
39-
| main.rs:46:17:46:17 | w [Wrapper] | main.rs:46:17:46:25 | w.clone(...) [Wrapper] | provenance | |
42+
| main.rs:46:17:46:17 | w [Wrapper] | main.rs:46:17:46:25 | w.clone(...) [Wrapper] | provenance | generated |
4043
| main.rs:46:17:46:25 | w.clone(...) [Wrapper] | main.rs:46:13:46:13 | u [Wrapper] | provenance | |
4144
| main.rs:47:15:47:15 | u [Wrapper] | main.rs:48:13:48:28 | Wrapper {...} [Wrapper] | provenance | |
4245
| main.rs:48:13:48:28 | Wrapper {...} [Wrapper] | main.rs:48:26:48:26 | n | provenance | |

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

+24-11
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
models
2-
| 1 | Summary: lang:alloc; <crate::string::String>::as_str; Argument[self]; ReturnValue; taint |
3-
| 2 | Summary: lang:alloc; crate::fmt::format; Argument[0]; ReturnValue; taint |
4-
| 3 | Summary: lang:core; crate::hint::must_use; Argument[0]; ReturnValue; value |
2+
| 1 | Summary: lang:alloc; <crate::string::String as crate::convert::From>::from; Argument[0]; ReturnValue; value |
3+
| 2 | Summary: lang:alloc; <crate::string::String>::as_str; Argument[self]; ReturnValue; taint |
4+
| 3 | Summary: lang:alloc; crate::fmt::format; Argument[0]; ReturnValue; taint |
5+
| 4 | Summary: lang:core; crate::hint::must_use; Argument[0]; ReturnValue; value |
56
edges
67
| main.rs:26:9:26:9 | s | main.rs:27:19:27:25 | s[...] | provenance | |
78
| main.rs:26:13:26:22 | source(...) | main.rs:26:9:26:9 | s | provenance | |
@@ -11,36 +12,41 @@ edges
1112
| main.rs:32:9:32:10 | s1 | main.rs:35:9:35:10 | s4 | provenance | |
1213
| main.rs:32:14:32:23 | source(...) | main.rs:32:9:32:10 | s1 | provenance | |
1314
| main.rs:35:9:35:10 | s4 | main.rs:38:10:38:11 | s4 | provenance | |
15+
| main.rs:51:9:51:10 | s1 | main.rs:52:27:52:28 | s1 | provenance | |
16+
| main.rs:51:14:51:29 | source_slice(...) | main.rs:51:9:51:10 | s1 | provenance | |
17+
| main.rs:52:9:52:10 | s2 | main.rs:53:10:53:11 | s2 | provenance | |
18+
| main.rs:52:14:52:29 | ...::from(...) | main.rs:52:9:52:10 | s2 | provenance | |
19+
| main.rs:52:27:52:28 | s1 | main.rs:52:14:52:29 | ...::from(...) | provenance | MaD:1 |
1420
| main.rs:63:9:63:9 | s | main.rs:64:16:64:16 | s | provenance | |
1521
| main.rs:63:13:63:22 | source(...) | main.rs:63:9:63:9 | s | provenance | |
16-
| main.rs:64:16:64:16 | s | main.rs:64:16:64:25 | s.as_str(...) | provenance | MaD:1 |
22+
| main.rs:64:16:64:16 | s | main.rs:64:16:64:25 | s.as_str(...) | provenance | MaD:2 |
1723
| main.rs:68:9:68:9 | s | main.rs:70:34:70:61 | MacroExpr | provenance | |
1824
| main.rs:68:9:68:9 | s | main.rs:73:34:73:59 | MacroExpr | provenance | |
1925
| main.rs:68:13:68:22 | source(...) | main.rs:68:9:68:9 | s | provenance | |
2026
| main.rs:70:9:70:18 | formatted1 | main.rs:71:10:71:19 | formatted1 | provenance | |
2127
| main.rs:70:22:70:62 | ...::format(...) | main.rs:70:9:70:18 | formatted1 | provenance | |
22-
| main.rs:70:34:70:61 | MacroExpr | main.rs:70:22:70:62 | ...::format(...) | provenance | MaD:2 |
28+
| main.rs:70:34:70:61 | MacroExpr | main.rs:70:22:70:62 | ...::format(...) | provenance | MaD:3 |
2329
| main.rs:73:9:73:18 | formatted2 | main.rs:74:10:74:19 | formatted2 | provenance | |
2430
| main.rs:73:22:73:60 | ...::format(...) | main.rs:73:9:73:18 | formatted2 | provenance | |
25-
| main.rs:73:34:73:59 | MacroExpr | main.rs:73:22:73:60 | ...::format(...) | provenance | MaD:2 |
31+
| main.rs:73:34:73:59 | MacroExpr | main.rs:73:22:73:60 | ...::format(...) | provenance | MaD:3 |
2632
| main.rs:76:9:76:13 | width | main.rs:77:34:77:74 | MacroExpr | provenance | |
2733
| main.rs:76:17:76:32 | source_usize(...) | main.rs:76:9:76:13 | width | provenance | |
2834
| main.rs:77:9:77:18 | formatted3 | main.rs:78:10:78:19 | formatted3 | provenance | |
2935
| main.rs:77:22:77:75 | ...::format(...) | main.rs:77:9:77:18 | formatted3 | provenance | |
30-
| main.rs:77:34:77:74 | MacroExpr | main.rs:77:22:77:75 | ...::format(...) | provenance | MaD:2 |
36+
| main.rs:77:34:77:74 | MacroExpr | main.rs:77:22:77:75 | ...::format(...) | provenance | MaD:3 |
3137
| main.rs:82:9:82:10 | s1 | main.rs:86:18:86:25 | MacroExpr | provenance | |
3238
| main.rs:82:9:82:10 | s1 | main.rs:87:18:87:32 | MacroExpr | provenance | |
3339
| main.rs:82:14:82:23 | source(...) | main.rs:82:9:82:10 | s1 | provenance | |
3440
| main.rs:86:10:86:26 | res | main.rs:86:18:86:25 | { ... } | provenance | |
3541
| main.rs:86:18:86:25 | ...::format(...) | main.rs:86:10:86:26 | res | provenance | |
3642
| main.rs:86:18:86:25 | ...::must_use(...) | main.rs:86:10:86:26 | MacroExpr | provenance | |
37-
| main.rs:86:18:86:25 | MacroExpr | main.rs:86:18:86:25 | ...::format(...) | provenance | MaD:2 |
38-
| main.rs:86:18:86:25 | { ... } | main.rs:86:18:86:25 | ...::must_use(...) | provenance | MaD:3 |
43+
| main.rs:86:18:86:25 | MacroExpr | main.rs:86:18:86:25 | ...::format(...) | provenance | MaD:3 |
44+
| main.rs:86:18:86:25 | { ... } | main.rs:86:18:86:25 | ...::must_use(...) | provenance | MaD:4 |
3945
| main.rs:87:10:87:33 | res | main.rs:87:18:87:32 | { ... } | provenance | |
4046
| main.rs:87:18:87:32 | ...::format(...) | main.rs:87:10:87:33 | res | provenance | |
4147
| main.rs:87:18:87:32 | ...::must_use(...) | main.rs:87:10:87:33 | MacroExpr | provenance | |
42-
| main.rs:87:18:87:32 | MacroExpr | main.rs:87:18:87:32 | ...::format(...) | provenance | MaD:2 |
43-
| main.rs:87:18:87:32 | { ... } | main.rs:87:18:87:32 | ...::must_use(...) | provenance | MaD:3 |
48+
| main.rs:87:18:87:32 | MacroExpr | main.rs:87:18:87:32 | ...::format(...) | provenance | MaD:3 |
49+
| main.rs:87:18:87:32 | { ... } | main.rs:87:18:87:32 | ...::must_use(...) | provenance | MaD:4 |
4450
nodes
4551
| main.rs:26:9:26:9 | s | semmle.label | s |
4652
| main.rs:26:13:26:22 | source(...) | semmle.label | source(...) |
@@ -52,6 +58,12 @@ nodes
5258
| main.rs:32:14:32:23 | source(...) | semmle.label | source(...) |
5359
| main.rs:35:9:35:10 | s4 | semmle.label | s4 |
5460
| main.rs:38:10:38:11 | s4 | semmle.label | s4 |
61+
| main.rs:51:9:51:10 | s1 | semmle.label | s1 |
62+
| main.rs:51:14:51:29 | source_slice(...) | semmle.label | source_slice(...) |
63+
| main.rs:52:9:52:10 | s2 | semmle.label | s2 |
64+
| main.rs:52:14:52:29 | ...::from(...) | semmle.label | ...::from(...) |
65+
| main.rs:52:27:52:28 | s1 | semmle.label | s1 |
66+
| main.rs:53:10:53:11 | s2 | semmle.label | s2 |
5567
| main.rs:63:9:63:9 | s | semmle.label | s |
5668
| main.rs:63:13:63:22 | source(...) | semmle.label | source(...) |
5769
| main.rs:64:16:64:16 | s | semmle.label | s |
@@ -91,6 +103,7 @@ testFailures
91103
#select
92104
| 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(...) |
93105
| 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(...) |
106+
| 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(...) |
94107
| 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(...) |
95108
| 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(...) |
96109
| main.rs:74:10:74:19 | formatted2 | main.rs:68:13:68:22 | source(...) | main.rs:74:10:74:19 | formatted2 | $@ | main.rs:68:13:68:22 | source(...) | source(...) |

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ fn string_add_reference() {
5050
fn string_from() {
5151
let s1 = source_slice(36);
5252
let s2 = String::from(s1);
53-
sink(s2); // $ MISSING: hasTaintFlow=36
53+
sink(s2); // $ hasValueFlow=36
5454
}
5555

5656
fn string_to_string() {

0 commit comments

Comments
 (0)