Skip to content

Commit 1b70111

Browse files
committed
Rust: Don't apply generated models for functions that have a manual model
1 parent d2cfd53 commit 1b70111

File tree

3 files changed

+10
-24
lines changed

3 files changed

+10
-24
lines changed

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -123,12 +123,15 @@ private class SummarizedCallableFromModel extends SummarizedCallable::Range {
123123
summaryModel(path, _, _, _, provenance, _)
124124
}
125125

126+
private predicate hasManualModel() { summaryModel(path, _, _, _, "manual", _) }
127+
126128
override predicate propagatesFlow(
127129
string input, string output, boolean preservesValue, string model
128130
) {
129-
exists(string kind, QlBuiltins::ExtensionId madId |
130-
summaryModel(path, input, output, kind, _, madId) and
131-
model = "MaD:" + madId.toString()
131+
exists(string kind, string provenance, QlBuiltins::ExtensionId madId |
132+
summaryModel(path, input, output, kind, provenance, madId) and
133+
model = "MaD:" + madId.toString() and
134+
(provenance = "manual" or not this.hasManualModel())
132135
|
133136
kind = "value" and
134137
preservesValue = true

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ fn test_snd() {
4242
sink(snd(0, s1)); // $ hasValueFlow=99
4343

4444
let s2 = source(88);
45-
sink(snd(s2, 0)); // $ SPURIOUS: hasValueFlow=88
45+
sink(snd(s2, 0));
4646
}
4747

4848
// has a flow model

rust/ql/test/library-tests/dataflow/models/models.expected

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,7 @@ models
2424
| 23 | Summary: main::set_tuple_element; Argument[0]; ReturnValue.Field[1]; value |
2525
| 24 | Summary: main::set_var_field; Argument[0]; ReturnValue.Field[main::MyFieldEnum::D::field_d]; value |
2626
| 25 | Summary: main::set_var_pos; Argument[0]; ReturnValue.Field[main::MyPosEnum::B(0)]; value |
27-
| 26 | Summary: main::snd; Argument[0]; ReturnValue; value |
28-
| 27 | Summary: main::snd; Argument[1]; ReturnValue; value |
27+
| 26 | Summary: main::snd; Argument[1]; ReturnValue; value |
2928
edges
3029
| main.rs:15:9:15:9 | s | main.rs:16:19:16:19 | s | provenance | |
3130
| main.rs:15:9:15:9 | s | main.rs:16:19:16:19 | s | provenance | |
@@ -40,14 +39,8 @@ edges
4039
| main.rs:41:9:41:10 | s1 | main.rs:42:17:42:18 | s1 | provenance | |
4140
| main.rs:41:14:41:23 | source(...) | main.rs:41:9:41:10 | s1 | provenance | |
4241
| main.rs:41:14:41:23 | source(...) | main.rs:41:9:41:10 | s1 | provenance | |
43-
| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:27 |
44-
| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:27 |
45-
| main.rs:44:9:44:10 | s2 | main.rs:45:14:45:15 | s2 | provenance | |
46-
| main.rs:44:9:44:10 | s2 | main.rs:45:14:45:15 | s2 | provenance | |
47-
| main.rs:44:14:44:23 | source(...) | main.rs:44:9:44:10 | s2 | provenance | |
48-
| main.rs:44:14:44:23 | source(...) | main.rs:44:9:44:10 | s2 | provenance | |
49-
| main.rs:45:14:45:15 | s2 | main.rs:45:10:45:19 | snd(...) | provenance | MaD:26 |
50-
| main.rs:45:14:45:15 | s2 | main.rs:45:10:45:19 | snd(...) | provenance | MaD:26 |
42+
| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:26 |
43+
| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:26 |
5144
| main.rs:54:9:54:9 | s | main.rs:55:27:55:27 | s | provenance | |
5245
| main.rs:54:9:54:9 | s | main.rs:55:27:55:27 | s | provenance | |
5346
| main.rs:54:13:54:21 | source(...) | main.rs:54:9:54:9 | s | provenance | |
@@ -347,14 +340,6 @@ nodes
347340
| main.rs:42:10:42:19 | snd(...) | semmle.label | snd(...) |
348341
| main.rs:42:17:42:18 | s1 | semmle.label | s1 |
349342
| main.rs:42:17:42:18 | s1 | semmle.label | s1 |
350-
| main.rs:44:9:44:10 | s2 | semmle.label | s2 |
351-
| main.rs:44:9:44:10 | s2 | semmle.label | s2 |
352-
| main.rs:44:14:44:23 | source(...) | semmle.label | source(...) |
353-
| main.rs:44:14:44:23 | source(...) | semmle.label | source(...) |
354-
| main.rs:45:10:45:19 | snd(...) | semmle.label | snd(...) |
355-
| main.rs:45:10:45:19 | snd(...) | semmle.label | snd(...) |
356-
| main.rs:45:14:45:15 | s2 | semmle.label | s2 |
357-
| main.rs:45:14:45:15 | s2 | semmle.label | s2 |
358343
| main.rs:54:9:54:9 | s | semmle.label | s |
359344
| main.rs:54:9:54:9 | s | semmle.label | s |
360345
| main.rs:54:13:54:21 | source(...) | semmle.label | source(...) |
@@ -700,8 +685,6 @@ invalidSpecComponent
700685
| main.rs:26:10:26:18 | coerce(...) | main.rs:25:13:25:22 | source(...) | main.rs:26:10:26:18 | coerce(...) | $@ | main.rs:25:13:25:22 | source(...) | source(...) |
701686
| main.rs:42:10:42:19 | snd(...) | main.rs:41:14:41:23 | source(...) | main.rs:42:10:42:19 | snd(...) | $@ | main.rs:41:14:41:23 | source(...) | source(...) |
702687
| main.rs:42:10:42:19 | snd(...) | main.rs:41:14:41:23 | source(...) | main.rs:42:10:42:19 | snd(...) | $@ | main.rs:41:14:41:23 | source(...) | source(...) |
703-
| main.rs:45:10:45:19 | snd(...) | main.rs:44:14:44:23 | source(...) | main.rs:45:10:45:19 | snd(...) | $@ | main.rs:44:14:44:23 | source(...) | source(...) |
704-
| main.rs:45:10:45:19 | snd(...) | main.rs:44:14:44:23 | source(...) | main.rs:45:10:45:19 | snd(...) | $@ | main.rs:44:14:44:23 | source(...) | source(...) |
705688
| main.rs:56:10:56:24 | get_var_pos(...) | main.rs:54:13:54:21 | source(...) | main.rs:56:10:56:24 | get_var_pos(...) | $@ | main.rs:54:13:54:21 | source(...) | source(...) |
706689
| main.rs:56:10:56:24 | get_var_pos(...) | main.rs:54:13:54:21 | source(...) | main.rs:56:10:56:24 | get_var_pos(...) | $@ | main.rs:54:13:54:21 | source(...) | source(...) |
707690
| main.rs:71:33:71:33 | i | main.rs:67:13:67:21 | source(...) | main.rs:71:33:71:33 | i | $@ | main.rs:67:13:67:21 | source(...) | source(...) |

0 commit comments

Comments
 (0)