Skip to content

Commit 74ed18a

Browse files
authored
Merge pull request #21035 from hvitved/rust/ord-models
Rust: Add models for `core::cmp::Ord::{min,max,clamp}`
2 parents 2824c98 + fc49360 commit 74ed18a

File tree

9 files changed

+666
-555
lines changed

9 files changed

+666
-555
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,10 @@ extensions:
116116
- ["<core::str>::parse", "Argument[self]", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"]
117117
- ["<core::str>::trim", "Argument[self]", "ReturnValue.Reference", "taint", "manual"]
118118
- ["<core::str>::to_string", "Argument[self]", "ReturnValue", "taint", "manual"]
119+
# Ord
120+
- ["<_ as core::cmp::Ord>::min", "Argument[self,0]", "ReturnValue", "value", "manual"]
121+
- ["<_ as core::cmp::Ord>::max", "Argument[self,0]", "ReturnValue", "value", "manual"]
122+
- ["<_ as core::cmp::Ord>::clamp", "Argument[self,0,1]", "ReturnValue", "value", "manual"]
119123
- addsTo:
120124
pack: codeql/rust-all
121125
extensible: sourceModel
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
multipleResolvedTargets
2-
| main.rs:236:11:236:15 | * ... |
3-
| main.rs:272:13:272:29 | * ... |
2+
| main.rs:252:11:252:15 | * ... |
3+
| main.rs:288:13:288:29 | * ... |

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

Lines changed: 396 additions & 396 deletions
Large diffs are not rendered by default.

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

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,11 +106,19 @@ impl MyFlag {
106106
}
107107

108108
fn get_data(self) -> i64 {
109-
if self.flag { 0 } else { source(2) }
109+
if self.flag {
110+
0
111+
} else {
112+
source(2)
113+
}
110114
}
111115

112116
fn data_through(self, n: i64) -> i64 {
113-
if self.flag { 0 } else { n }
117+
if self.flag {
118+
0
119+
} else {
120+
n
121+
}
114122
}
115123
}
116124

@@ -120,11 +128,19 @@ impl MyTrait for MyFlag {
120128
}
121129

122130
fn get_data_trait(self) -> i64 {
123-
if self.flag { 0 } else { source(21) }
131+
if self.flag {
132+
0
133+
} else {
134+
source(21)
135+
}
124136
}
125137

126138
fn data_through_trait(self, n: i64) -> i64 {
127-
if self.flag { 0 } else { n }
139+
if self.flag {
140+
0
141+
} else {
142+
n
143+
}
128144
}
129145
}
130146

@@ -275,6 +291,10 @@ fn test_operator_overloading() {
275291
let a = MyInt { value: source(28) };
276292
let c = *a;
277293
sink(c); // $ hasValueFlow=28
294+
295+
let a = MyInt { value: source(29) };
296+
let c = a.min(1042);
297+
sink(c); // $ MISSING: hasValueFlow=29
278298
}
279299

280300
trait MyTrait2 {

rust/ql/test/library-tests/dataflow/global/viableCallable.expected

Lines changed: 110 additions & 108 deletions
Large diffs are not rendered by default.

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

Lines changed: 110 additions & 43 deletions
Large diffs are not rendered by default.

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,10 +149,29 @@ fn test_pin() {
149149
}
150150
}
151151

152+
fn test_ord() {
153+
let a = source(50);
154+
let b = source(51);
155+
let c = a.min(b);
156+
sink(c); // $ hasValueFlow=50 hasValueFlow=51
157+
158+
let d = source(52);
159+
let e = source(53);
160+
let f = d.max(e);
161+
sink(f); // $ hasValueFlow=52 hasValueFlow=53
162+
163+
let g = source(54);
164+
let h = source(55);
165+
let i = source(56);
166+
let j = g.clamp(h, i);
167+
sink(j); // $ hasValueFlow=54 hasValueFlow=55 hasValueFlow=56
168+
}
169+
152170
fn main() {
153171
option_clone();
154172
result_clone();
155173
i64_clone();
156174
my_clone::wrapper_clone();
157175
test_pin();
176+
test_ord();
158177
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ models
77
| 6 | Source: main::enum_source; ReturnValue.Field[main::MyFieldEnum::D::field_d]; test-source |
88
| 7 | Source: main::simple_source; ReturnValue; test-source |
99
| 8 | Source: main::source_into_function::pass_source; Argument[1].Parameter[0]; test-source |
10-
| 9 | Summary: <_ as core::cmp::Ord>::max; Argument[self]; ReturnValue; value |
10+
| 9 | Summary: <_ as core::cmp::Ord>::max; Argument[self,0]; ReturnValue; value |
1111
| 10 | Summary: <_ as core::cmp::PartialOrd>::lt; Argument[self].Reference; ReturnValue; taint |
1212
| 11 | Summary: <_ as core::ops::index::Index>::index; Argument[self].Reference.Element; ReturnValue.Reference; value |
1313
| 12 | Summary: main::apply; Argument[0]; Argument[1].Parameter[0]; value |

rust/ql/test/library-tests/dataflow/models/models.ext.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,5 +33,4 @@ extensions:
3333
- ["main::apply", "Argument[0]", "Argument[1].Parameter[0]", "value", "manual"]
3434
- ["main::apply", "Argument[1].ReturnValue", "ReturnValue", "value", "manual"]
3535
- ["main::get_async_number", "Argument[0]", "ReturnValue.Future", "value", "manual"]
36-
- ["<_ as core::cmp::Ord>::max", "Argument[self]", "ReturnValue", "value", "manual"]
3736
- ["<_ as core::cmp::PartialOrd>::lt", "Argument[self].Reference", "ReturnValue", "taint", "manual"]

0 commit comments

Comments
 (0)