Skip to content

Commit a8147d0

Browse files
committed
Rust: Add trait model for clone_from.
1 parent 95fd5fa commit a8147d0

File tree

3 files changed

+36
-25
lines changed

3 files changed

+36
-25
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ extensions:
99
- ["<_ as core::ops::arith::Add>::add", "Argument[0].Reference", "ReturnValue", "taint", "manual"]
1010
# Clone
1111
- ["<_ as core::clone::Clone>::clone", "Argument[self].Reference", "ReturnValue", "value", "manual"]
12+
- ["<_ as core::clone::Clone>::clone_from", "Argument[0].Reference", "Argument[self].Reference", "value", "manual"]
1213
# Conversions
1314
- ["<_ as core::convert::From>::from", "Argument[0]", "ReturnValue", "taint", "manual"]
1415
- ["<_ as core::convert::From>::from", "Argument[0].Reference", "ReturnValue", "taint", "manual"]

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

Lines changed: 34 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
models
22
| 1 | Summary: <_ as core::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value |
3-
| 2 | Summary: <alloc::boxed::Box>::new; Argument[0]; ReturnValue.Reference; value |
4-
| 3 | Summary: <core::i64 as core::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value |
5-
| 4 | Summary: <core::option::Option>::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value |
6-
| 5 | Summary: <core::option::Option>::unwrap_or; Argument[0]; ReturnValue; value |
7-
| 6 | Summary: <core::option::Option>::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value |
8-
| 7 | Summary: <core::option::Option>::unwrap_or_else; Argument[0].ReturnValue; ReturnValue; value |
9-
| 8 | Summary: <core::option::Option>::unwrap_or_else; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value |
10-
| 9 | Summary: <core::result::Result>::err; Argument[self].Field[core::result::Result::Err(0)]; ReturnValue.Field[core::option::Option::Some(0)]; value |
11-
| 10 | Summary: <core::result::Result>::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value |
12-
| 11 | Summary: <core::result::Result>::expect_err; Argument[self].Field[core::result::Result::Err(0)]; ReturnValue; value |
13-
| 12 | Summary: <core::result::Result>::ok; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue.Field[core::option::Option::Some(0)]; value |
3+
| 2 | Summary: <_ as core::clone::Clone>::clone_from; Argument[0].Reference; Argument[self].Reference; value |
4+
| 3 | Summary: <alloc::boxed::Box>::new; Argument[0]; ReturnValue.Reference; value |
5+
| 4 | Summary: <core::i64 as core::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value |
6+
| 5 | Summary: <core::option::Option>::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value |
7+
| 6 | Summary: <core::option::Option>::unwrap_or; Argument[0]; ReturnValue; value |
8+
| 7 | Summary: <core::option::Option>::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value |
9+
| 8 | Summary: <core::option::Option>::unwrap_or_else; Argument[0].ReturnValue; ReturnValue; value |
10+
| 9 | Summary: <core::option::Option>::unwrap_or_else; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value |
11+
| 10 | Summary: <core::result::Result>::err; Argument[self].Field[core::result::Result::Err(0)]; ReturnValue.Field[core::option::Option::Some(0)]; value |
12+
| 11 | Summary: <core::result::Result>::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value |
13+
| 12 | Summary: <core::result::Result>::expect_err; Argument[self].Field[core::result::Result::Err(0)]; ReturnValue; value |
14+
| 13 | Summary: <core::result::Result>::ok; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue.Field[core::option::Option::Some(0)]; value |
1415
edges
1516
| main.rs:23:9:23:9 | s | main.rs:24:10:24:10 | s | provenance | |
1617
| main.rs:23:9:23:9 | s | main.rs:26:12:26:12 | x | provenance | |
@@ -38,7 +39,7 @@ edges
3839
| main.rs:82:5:82:5 | l | main.rs:83:10:83:10 | l | provenance | |
3940
| main.rs:115:9:115:9 | i [&ref] | main.rs:116:11:116:11 | i [&ref] | provenance | |
4041
| main.rs:115:13:115:31 | ...::new(...) [&ref] | main.rs:115:9:115:9 | i [&ref] | provenance | |
41-
| main.rs:115:22:115:30 | source(...) | main.rs:115:13:115:31 | ...::new(...) [&ref] | provenance | MaD:2 |
42+
| main.rs:115:22:115:30 | source(...) | main.rs:115:13:115:31 | ...::new(...) [&ref] | provenance | MaD:3 |
4243
| main.rs:116:11:116:11 | i [&ref] | main.rs:116:10:116:11 | * ... | provenance | |
4344
| main.rs:123:9:123:9 | a [tuple.0] | main.rs:124:10:124:10 | a [tuple.0] | provenance | |
4445
| main.rs:123:13:123:26 | TupleExpr [tuple.0] | main.rs:123:9:123:9 | a [tuple.0] | provenance | |
@@ -119,43 +120,43 @@ edges
119120
| main.rs:267:12:267:18 | Some(...) [Some] | main.rs:267:17:267:17 | n | provenance | |
120121
| main.rs:267:17:267:17 | n | main.rs:269:18:269:18 | n | provenance | |
121122
| main.rs:267:17:267:17 | n | main.rs:273:14:273:14 | n | provenance | |
122-
| main.rs:278:9:278:10 | s1 [Some] | main.rs:279:10:279:20 | s1.unwrap() | provenance | MaD:4 |
123+
| main.rs:278:9:278:10 | s1 [Some] | main.rs:279:10:279:20 | s1.unwrap() | provenance | MaD:5 |
123124
| main.rs:278:14:278:29 | Some(...) [Some] | main.rs:278:9:278:10 | s1 [Some] | provenance | |
124125
| main.rs:278:19:278:28 | source(...) | main.rs:278:14:278:29 | Some(...) [Some] | provenance | |
125-
| main.rs:283:9:283:10 | s1 [Some] | main.rs:284:10:284:24 | s1.unwrap_or(...) | provenance | MaD:6 |
126+
| main.rs:283:9:283:10 | s1 [Some] | main.rs:284:10:284:24 | s1.unwrap_or(...) | provenance | MaD:7 |
126127
| main.rs:283:14:283:29 | Some(...) [Some] | main.rs:283:9:283:10 | s1 [Some] | provenance | |
127128
| main.rs:283:19:283:28 | source(...) | main.rs:283:14:283:29 | Some(...) [Some] | provenance | |
128-
| main.rs:287:23:287:32 | source(...) | main.rs:287:10:287:33 | s2.unwrap_or(...) | provenance | MaD:5 |
129-
| main.rs:291:9:291:10 | s1 [Some] | main.rs:292:10:292:32 | s1.unwrap_or_else(...) | provenance | MaD:8 |
129+
| main.rs:287:23:287:32 | source(...) | main.rs:287:10:287:33 | s2.unwrap_or(...) | provenance | MaD:6 |
130+
| main.rs:291:9:291:10 | s1 [Some] | main.rs:292:10:292:32 | s1.unwrap_or_else(...) | provenance | MaD:9 |
130131
| main.rs:291:14:291:29 | Some(...) [Some] | main.rs:291:9:291:10 | s1 [Some] | provenance | |
131132
| main.rs:291:19:291:28 | source(...) | main.rs:291:14:291:29 | Some(...) [Some] | provenance | |
132-
| main.rs:295:31:295:40 | source(...) | main.rs:295:10:295:41 | s2.unwrap_or_else(...) | provenance | MaD:7 |
133+
| main.rs:295:31:295:40 | source(...) | main.rs:295:10:295:41 | s2.unwrap_or_else(...) | provenance | MaD:8 |
133134
| main.rs:299:9:299:10 | s1 [Some] | main.rs:301:14:301:15 | s1 [Some] | provenance | |
134135
| main.rs:299:14:299:29 | Some(...) [Some] | main.rs:299:9:299:10 | s1 [Some] | provenance | |
135136
| main.rs:299:19:299:28 | source(...) | main.rs:299:14:299:29 | Some(...) [Some] | provenance | |
136137
| main.rs:301:9:301:10 | i1 | main.rs:302:10:302:11 | i1 | provenance | |
137138
| main.rs:301:14:301:15 | s1 [Some] | main.rs:301:14:301:16 | TryExpr | provenance | |
138139
| main.rs:301:14:301:16 | TryExpr | main.rs:301:9:301:10 | i1 | provenance | |
139-
| main.rs:308:9:308:10 | r1 [Ok] | main.rs:309:28:309:34 | r1.ok() [Some] | provenance | MaD:12 |
140+
| main.rs:308:9:308:10 | r1 [Ok] | main.rs:309:28:309:34 | r1.ok() [Some] | provenance | MaD:13 |
140141
| main.rs:308:32:308:45 | Ok(...) [Ok] | main.rs:308:9:308:10 | r1 [Ok] | provenance | |
141142
| main.rs:308:35:308:44 | source(...) | main.rs:308:32:308:45 | Ok(...) [Ok] | provenance | |
142-
| main.rs:309:9:309:11 | o1a [Some] | main.rs:311:10:311:21 | o1a.unwrap() | provenance | MaD:4 |
143+
| main.rs:309:9:309:11 | o1a [Some] | main.rs:311:10:311:21 | o1a.unwrap() | provenance | MaD:5 |
143144
| main.rs:309:28:309:34 | r1.ok() [Some] | main.rs:309:9:309:11 | o1a [Some] | provenance | |
144-
| main.rs:314:9:314:10 | r2 [Err] | main.rs:316:28:316:35 | r2.err() [Some] | provenance | MaD:9 |
145+
| main.rs:314:9:314:10 | r2 [Err] | main.rs:316:28:316:35 | r2.err() [Some] | provenance | MaD:10 |
145146
| main.rs:314:32:314:46 | Err(...) [Err] | main.rs:314:9:314:10 | r2 [Err] | provenance | |
146147
| main.rs:314:36:314:45 | source(...) | main.rs:314:32:314:46 | Err(...) [Err] | provenance | |
147-
| main.rs:316:9:316:11 | o2b [Some] | main.rs:318:10:318:21 | o2b.unwrap() | provenance | MaD:4 |
148+
| main.rs:316:9:316:11 | o2b [Some] | main.rs:318:10:318:21 | o2b.unwrap() | provenance | MaD:5 |
148149
| main.rs:316:28:316:35 | r2.err() [Some] | main.rs:316:9:316:11 | o2b [Some] | provenance | |
149150
| main.rs:322:9:322:10 | s1 [Ok] | main.rs:325:14:325:15 | s1 [Ok] | provenance | |
150151
| main.rs:322:32:322:45 | Ok(...) [Ok] | main.rs:322:9:322:10 | s1 [Ok] | provenance | |
151152
| main.rs:322:35:322:44 | source(...) | main.rs:322:32:322:45 | Ok(...) [Ok] | provenance | |
152153
| main.rs:325:9:325:10 | i1 | main.rs:327:10:327:11 | i1 | provenance | |
153154
| main.rs:325:14:325:15 | s1 [Ok] | main.rs:325:14:325:16 | TryExpr | provenance | |
154155
| main.rs:325:14:325:16 | TryExpr | main.rs:325:9:325:10 | i1 | provenance | |
155-
| main.rs:335:9:335:10 | s1 [Ok] | main.rs:336:10:336:22 | s1.expect(...) | provenance | MaD:10 |
156+
| main.rs:335:9:335:10 | s1 [Ok] | main.rs:336:10:336:22 | s1.expect(...) | provenance | MaD:11 |
156157
| main.rs:335:32:335:45 | Ok(...) [Ok] | main.rs:335:9:335:10 | s1 [Ok] | provenance | |
157158
| main.rs:335:35:335:44 | source(...) | main.rs:335:32:335:45 | Ok(...) [Ok] | provenance | |
158-
| main.rs:339:9:339:10 | s2 [Err] | main.rs:341:10:341:26 | s2.expect_err(...) | provenance | MaD:11 |
159+
| main.rs:339:9:339:10 | s2 [Err] | main.rs:341:10:341:26 | s2.expect_err(...) | provenance | MaD:12 |
159160
| main.rs:339:32:339:46 | Err(...) [Err] | main.rs:339:9:339:10 | s2 [Err] | provenance | |
160161
| main.rs:339:36:339:45 | source(...) | main.rs:339:32:339:46 | Err(...) [Err] | provenance | |
161162
| main.rs:350:9:350:10 | s1 [A] | main.rs:352:11:352:12 | s1 [A] | provenance | |
@@ -256,9 +257,13 @@ edges
256257
| main.rs:557:18:557:18 | c | main.rs:557:17:557:18 | &c [&ref] | provenance | |
257258
| main.rs:562:11:562:15 | c_ref [&ref] | main.rs:562:10:562:15 | * ... | provenance | |
258259
| main.rs:583:9:583:9 | a | main.rs:585:10:585:10 | a | provenance | |
260+
| main.rs:583:9:583:9 | a | main.rs:589:19:589:19 | a | provenance | |
259261
| main.rs:583:13:583:22 | source(...) | main.rs:583:9:583:9 | a | provenance | |
260262
| main.rs:585:10:585:10 | a | main.rs:585:10:585:18 | a.clone() | provenance | MaD:1 |
261-
| main.rs:585:10:585:10 | a | main.rs:585:10:585:18 | a.clone() | provenance | MaD:3 |
263+
| main.rs:585:10:585:10 | a | main.rs:585:10:585:18 | a.clone() | provenance | MaD:4 |
264+
| main.rs:589:5:589:5 | [post] b | main.rs:590:10:590:10 | b | provenance | |
265+
| main.rs:589:18:589:19 | &a [&ref] | main.rs:589:5:589:5 | [post] b | provenance | MaD:2 |
266+
| main.rs:589:19:589:19 | a | main.rs:589:18:589:19 | &a [&ref] | provenance | |
262267
nodes
263268
| main.rs:19:10:19:18 | source(...) | semmle.label | source(...) |
264269
| main.rs:23:9:23:9 | s | semmle.label | s |
@@ -556,6 +561,10 @@ nodes
556561
| main.rs:583:13:583:22 | source(...) | semmle.label | source(...) |
557562
| main.rs:585:10:585:10 | a | semmle.label | a |
558563
| main.rs:585:10:585:18 | a.clone() | semmle.label | a.clone() |
564+
| main.rs:589:5:589:5 | [post] b | semmle.label | [post] b |
565+
| main.rs:589:18:589:19 | &a [&ref] | semmle.label | &a [&ref] |
566+
| main.rs:589:19:589:19 | a | semmle.label | a |
567+
| main.rs:590:10:590:10 | b | semmle.label | b |
559568
subpaths
560569
testFailures
561570
#select
@@ -623,3 +632,4 @@ testFailures
623632
| main.rs:559:10:559:10 | a | main.rs:554:13:554:22 | source(...) | main.rs:559:10:559:10 | a | $@ | main.rs:554:13:554:22 | source(...) | source(...) |
624633
| main.rs:562:10:562:15 | * ... | main.rs:556:13:556:22 | source(...) | main.rs:562:10:562:15 | * ... | $@ | main.rs:556:13:556:22 | source(...) | source(...) |
625634
| main.rs:585:10:585:18 | a.clone() | main.rs:583:13:583:22 | source(...) | main.rs:585:10:585:18 | a.clone() | $@ | main.rs:583:13:583:22 | source(...) | source(...) |
635+
| main.rs:590:10:590:10 | b | main.rs:583:13:583:22 | source(...) | main.rs:590:10:590:10 | b | $@ | main.rs:583:13:583:22 | source(...) | source(...) |

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -587,7 +587,7 @@ fn clone() {
587587
let mut b: i64 = 0;
588588
sink(b);
589589
b.clone_from(&a);
590-
sink(b); // $ MISSING: hasValueFlow=60
590+
sink(b); // $ hasValueFlow=60
591591
}
592592

593593
fn main() {

0 commit comments

Comments
 (0)