Skip to content

Commit 04d3f98

Browse files
committed
Rust: Add tests for flow through clone
1 parent f114053 commit 04d3f98

File tree

3 files changed

+118
-0
lines changed

3 files changed

+118
-0
lines changed
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
models
2+
| 1 | Summary: lang:core; <crate::option::Option>::unwrap; Argument[self].Variant[crate::option::Option::Some(0)]; ReturnValue; value |
3+
| 2 | Summary: lang:core; <crate::result::Result>::unwrap; Argument[self].Variant[crate::result::Result::Ok(0)]; ReturnValue; value |
4+
edges
5+
| main.rs:13:9:13:9 | a [Some] | main.rs:14:10:14:10 | a [Some] | provenance | |
6+
| main.rs:13:13:13:28 | Some(...) [Some] | main.rs:13:9:13:9 | a [Some] | provenance | |
7+
| main.rs:13:18:13:27 | source(...) | main.rs:13:13:13:28 | Some(...) [Some] | provenance | |
8+
| main.rs:14:10:14:10 | a [Some] | main.rs:14:10:14:19 | a.unwrap(...) | provenance | MaD:1 |
9+
| main.rs:20:9:20:9 | a [Ok] | main.rs:21:10:21:10 | a [Ok] | provenance | |
10+
| main.rs:20:31:20:44 | Ok(...) [Ok] | main.rs:20:9:20:9 | a [Ok] | provenance | |
11+
| main.rs:20:34:20:43 | source(...) | main.rs:20:31:20:44 | Ok(...) [Ok] | provenance | |
12+
| main.rs:21:10:21:10 | a [Ok] | main.rs:21:10:21:19 | a.unwrap(...) | provenance | MaD:2 |
13+
| main.rs:27:9:27:9 | a | main.rs:28:10:28:10 | a | provenance | |
14+
| main.rs:27:13:27:22 | source(...) | main.rs:27:9:27:9 | a | provenance | |
15+
| main.rs:42:13:42:13 | w [Wrapper.n] | main.rs:43:15:43:15 | w [Wrapper.n] | provenance | |
16+
| main.rs:42:17:42:41 | Wrapper {...} [Wrapper.n] | main.rs:42:13:42:13 | w [Wrapper.n] | provenance | |
17+
| main.rs:42:30:42:39 | source(...) | main.rs:42:17:42:41 | Wrapper {...} [Wrapper.n] | provenance | |
18+
| main.rs:43:15:43:15 | w [Wrapper.n] | main.rs:44:13:44:28 | Wrapper {...} [Wrapper.n] | provenance | |
19+
| main.rs:44:13:44:28 | Wrapper {...} [Wrapper.n] | main.rs:44:26:44:26 | n | provenance | |
20+
| main.rs:44:26:44:26 | n | main.rs:44:38:44:38 | n | provenance | |
21+
nodes
22+
| main.rs:13:9:13:9 | a [Some] | semmle.label | a [Some] |
23+
| main.rs:13:13:13:28 | Some(...) [Some] | semmle.label | Some(...) [Some] |
24+
| main.rs:13:18:13:27 | source(...) | semmle.label | source(...) |
25+
| main.rs:14:10:14:10 | a [Some] | semmle.label | a [Some] |
26+
| main.rs:14:10:14:19 | a.unwrap(...) | semmle.label | a.unwrap(...) |
27+
| main.rs:20:9:20:9 | a [Ok] | semmle.label | a [Ok] |
28+
| main.rs:20:31:20:44 | Ok(...) [Ok] | semmle.label | Ok(...) [Ok] |
29+
| main.rs:20:34:20:43 | source(...) | semmle.label | source(...) |
30+
| main.rs:21:10:21:10 | a [Ok] | semmle.label | a [Ok] |
31+
| main.rs:21:10:21:19 | a.unwrap(...) | semmle.label | a.unwrap(...) |
32+
| main.rs:27:9:27:9 | a | semmle.label | a |
33+
| main.rs:27:13:27:22 | source(...) | semmle.label | source(...) |
34+
| main.rs:28:10:28:10 | a | semmle.label | a |
35+
| main.rs:42:13:42:13 | w [Wrapper.n] | semmle.label | w [Wrapper.n] |
36+
| main.rs:42:17:42:41 | Wrapper {...} [Wrapper.n] | semmle.label | Wrapper {...} [Wrapper.n] |
37+
| main.rs:42:30:42:39 | source(...) | semmle.label | source(...) |
38+
| main.rs:43:15:43:15 | w [Wrapper.n] | semmle.label | w [Wrapper.n] |
39+
| main.rs:44:13:44:28 | Wrapper {...} [Wrapper.n] | semmle.label | Wrapper {...} [Wrapper.n] |
40+
| main.rs:44:26:44:26 | n | semmle.label | n |
41+
| main.rs:44:38:44:38 | n | semmle.label | n |
42+
subpaths
43+
testFailures
44+
#select
45+
| main.rs:14:10:14:19 | a.unwrap(...) | main.rs:13:18:13:27 | source(...) | main.rs:14:10:14:19 | a.unwrap(...) | $@ | main.rs:13:18:13:27 | source(...) | source(...) |
46+
| main.rs:21:10:21:19 | a.unwrap(...) | main.rs:20:34:20:43 | source(...) | main.rs:21:10:21:19 | a.unwrap(...) | $@ | main.rs:20:34:20:43 | source(...) | source(...) |
47+
| main.rs:28:10:28:10 | a | main.rs:27:13:27:22 | source(...) | main.rs:28:10:28:10 | a | $@ | main.rs:27:13:27:22 | source(...) | source(...) |
48+
| main.rs:44:38:44:38 | n | main.rs:42:30:42:39 | source(...) | main.rs:44:38:44:38 | n | $@ | main.rs:42:30:42:39 | source(...) | source(...) |
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/**
2+
* @kind path-problem
3+
*/
4+
5+
import rust
6+
import utils.test.InlineFlowTest
7+
import DefaultFlowTest
8+
import ValueFlow::PathGraph
9+
10+
from ValueFlow::PathNode source, ValueFlow::PathNode sink
11+
where ValueFlow::flowPath(source, sink)
12+
select sink, source, sink, "$@", source, source.toString()
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
2+
fn source(i: i64) -> i64 {
3+
1000 + i
4+
}
5+
6+
fn sink(s: i64) {
7+
println!("{}", s);
8+
}
9+
10+
// Flow through `clone` methods
11+
12+
fn option_clone() {
13+
let a = Some(source(88));
14+
sink(a.unwrap()); // $ hasValueFlow=88
15+
let b = a.clone();
16+
sink(b.unwrap()); // $ MISSING: hasValueFlow=88
17+
}
18+
19+
fn result_clone() {
20+
let a: Result<i64, i64> = Ok(source(37));
21+
sink(a.unwrap()); // $ hasValueFlow=37
22+
let b = a.clone();
23+
sink(b.unwrap()); // $ MISSING: hasValueFlow=37
24+
}
25+
26+
fn i64_clone() {
27+
let a = source(12);
28+
sink(a); // $ hasValueFlow=12
29+
let b = a.clone();
30+
sink(b); // $ MISSING: hasValueFlow=12
31+
}
32+
33+
mod my_clone {
34+
use super::{source, sink};
35+
36+
#[derive(Clone)]
37+
struct Wrapper {
38+
n: i64
39+
}
40+
41+
pub fn wrapper_clone() {
42+
let w = Wrapper { n: source(73) };
43+
match w {
44+
Wrapper { n: n } => sink(n) // $ hasValueFlow=73
45+
}
46+
let u = w.clone();
47+
match u {
48+
Wrapper { n: n } => sink(n) // $ MISSING: hasValueFlow=73
49+
}
50+
}
51+
}
52+
53+
fn main() {
54+
option_clone();
55+
result_clone();
56+
i64_clone();
57+
my_clone::wrapper_clone();
58+
}

0 commit comments

Comments
 (0)