Skip to content

Commit b5b8af3

Browse files
committed
Rust: Add data flow tests for borrows
1 parent 87b9e60 commit b5b8af3

File tree

2 files changed

+56
-24
lines changed

2 files changed

+56
-24
lines changed

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

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@ edges
88
| main.rs:15:9:15:9 | c | main.rs:16:10:16:10 | c | provenance | |
99
| main.rs:15:13:15:14 | * ... | main.rs:15:9:15:9 | c | provenance | |
1010
| main.rs:15:14:15:14 | b [&ref] | main.rs:15:13:15:14 | * ... | provenance | |
11-
| main.rs:40:18:40:21 | SelfParam [MyNumber] | main.rs:41:15:41:18 | self [MyNumber] | provenance | |
12-
| main.rs:41:15:41:18 | self [MyNumber] | main.rs:42:13:42:38 | ...::MyNumber(...) [MyNumber] | provenance | |
13-
| main.rs:42:13:42:38 | ...::MyNumber(...) [MyNumber] | main.rs:42:32:42:37 | number | provenance | |
14-
| main.rs:42:32:42:37 | number | main.rs:40:31:46:5 | { ... } | provenance | |
15-
| main.rs:58:9:58:17 | my_number [MyNumber] | main.rs:59:10:59:18 | my_number [MyNumber] | provenance | |
16-
| main.rs:58:21:58:50 | ...::MyNumber(...) [MyNumber] | main.rs:58:9:58:17 | my_number [MyNumber] | provenance | |
17-
| main.rs:58:40:58:49 | source(...) | main.rs:58:21:58:50 | ...::MyNumber(...) [MyNumber] | provenance | |
18-
| main.rs:59:10:59:18 | my_number [MyNumber] | main.rs:40:18:40:21 | SelfParam [MyNumber] | provenance | |
19-
| main.rs:59:10:59:18 | my_number [MyNumber] | main.rs:59:10:59:30 | my_number.to_number(...) | provenance | |
11+
| main.rs:49:18:49:21 | SelfParam [MyNumber] | main.rs:50:15:50:18 | self [MyNumber] | provenance | |
12+
| main.rs:50:15:50:18 | self [MyNumber] | main.rs:51:13:51:38 | ...::MyNumber(...) [MyNumber] | provenance | |
13+
| main.rs:51:13:51:38 | ...::MyNumber(...) [MyNumber] | main.rs:51:32:51:37 | number | provenance | |
14+
| main.rs:51:32:51:37 | number | main.rs:49:31:55:5 | { ... } | provenance | |
15+
| main.rs:67:9:67:17 | my_number [MyNumber] | main.rs:68:10:68:18 | my_number [MyNumber] | provenance | |
16+
| main.rs:67:21:67:50 | ...::MyNumber(...) [MyNumber] | main.rs:67:9:67:17 | my_number [MyNumber] | provenance | |
17+
| main.rs:67:40:67:49 | source(...) | main.rs:67:21:67:50 | ...::MyNumber(...) [MyNumber] | provenance | |
18+
| main.rs:68:10:68:18 | my_number [MyNumber] | main.rs:49:18:49:21 | SelfParam [MyNumber] | provenance | |
19+
| main.rs:68:10:68:18 | my_number [MyNumber] | main.rs:68:10:68:30 | my_number.to_number(...) | provenance | |
2020
nodes
2121
| main.rs:13:9:13:9 | a | semmle.label | a |
2222
| main.rs:13:13:13:22 | source(...) | semmle.label | source(...) |
@@ -27,19 +27,20 @@ nodes
2727
| main.rs:15:13:15:14 | * ... | semmle.label | * ... |
2828
| main.rs:15:14:15:14 | b [&ref] | semmle.label | b [&ref] |
2929
| main.rs:16:10:16:10 | c | semmle.label | c |
30-
| main.rs:40:18:40:21 | SelfParam [MyNumber] | semmle.label | SelfParam [MyNumber] |
31-
| main.rs:40:31:46:5 | { ... } | semmle.label | { ... } |
32-
| main.rs:41:15:41:18 | self [MyNumber] | semmle.label | self [MyNumber] |
33-
| main.rs:42:13:42:38 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] |
34-
| main.rs:42:32:42:37 | number | semmle.label | number |
35-
| main.rs:58:9:58:17 | my_number [MyNumber] | semmle.label | my_number [MyNumber] |
36-
| main.rs:58:21:58:50 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] |
37-
| main.rs:58:40:58:49 | source(...) | semmle.label | source(...) |
38-
| main.rs:59:10:59:18 | my_number [MyNumber] | semmle.label | my_number [MyNumber] |
39-
| main.rs:59:10:59:30 | my_number.to_number(...) | semmle.label | my_number.to_number(...) |
30+
| main.rs:49:18:49:21 | SelfParam [MyNumber] | semmle.label | SelfParam [MyNumber] |
31+
| main.rs:49:31:55:5 | { ... } | semmle.label | { ... } |
32+
| main.rs:50:15:50:18 | self [MyNumber] | semmle.label | self [MyNumber] |
33+
| main.rs:51:13:51:38 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] |
34+
| main.rs:51:32:51:37 | number | semmle.label | number |
35+
| main.rs:67:9:67:17 | my_number [MyNumber] | semmle.label | my_number [MyNumber] |
36+
| main.rs:67:21:67:50 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] |
37+
| main.rs:67:40:67:49 | source(...) | semmle.label | source(...) |
38+
| main.rs:68:10:68:18 | my_number [MyNumber] | semmle.label | my_number [MyNumber] |
39+
| main.rs:68:10:68:30 | my_number.to_number(...) | semmle.label | my_number.to_number(...) |
4040
subpaths
41-
| main.rs:59:10:59:18 | my_number [MyNumber] | main.rs:40:18:40:21 | SelfParam [MyNumber] | main.rs:40:31:46:5 | { ... } | main.rs:59:10:59:30 | my_number.to_number(...) |
41+
| main.rs:68:10:68:18 | my_number [MyNumber] | main.rs:49:18:49:21 | SelfParam [MyNumber] | main.rs:49:31:55:5 | { ... } | main.rs:68:10:68:30 | my_number.to_number(...) |
4242
testFailures
43+
| main.rs:78:35:78:54 | //... | Missing result: hasValueFlow=40 |
4344
#select
4445
| main.rs:16:10:16:10 | c | main.rs:13:13:13:22 | source(...) | main.rs:16:10:16:10 | c | $@ | main.rs:13:13:13:22 | source(...) | source(...) |
45-
| main.rs:59:10:59:30 | my_number.to_number(...) | main.rs:58:40:58:49 | source(...) | main.rs:59:10:59:30 | my_number.to_number(...) | $@ | main.rs:58:40:58:49 | source(...) | source(...) |
46+
| main.rs:68:10:68:30 | my_number.to_number(...) | main.rs:67:40:67:49 | source(...) | main.rs:68:10:68:30 | my_number.to_number(...) | $@ | main.rs:67:40:67:49 | source(...) | source(...) |

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

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// -----------------------------------------------------------------------------
2-
// Data flow through pointers.
2+
// Data flow through borrows and pointers.
33

44
fn source(i: i64) -> i64 {
55
1000 + i
@@ -32,6 +32,15 @@ fn write_and_read_through_borrow() {
3232
sink(*b); // $ MISSING: hasValueFlow=37
3333
}
3434

35+
fn takes_borrowed_value(&n: &i64) {
36+
sink(n); // $ MISSING: hasValueFlow=83
37+
}
38+
39+
fn pass_borrowed_value() {
40+
let val = source(83);
41+
takes_borrowed_value(&val);
42+
}
43+
3544
enum MyNumber {
3645
MyNumber(i64)
3746
}
@@ -47,8 +56,8 @@ impl MyNumber {
4756

4857
fn get_number(&self) -> i64 {
4958
match self {
50-
MyNumber::MyNumber(number) => {
51-
*number
59+
&MyNumber::MyNumber(number) => {
60+
number
5261
}
5362
}
5463
}
@@ -69,11 +78,33 @@ fn through_self_in_method_explicit_borrow() {
6978
sink(my_number.get_number()); // $ MISSING: hasValueFlow=40
7079
}
7180

81+
fn ref_nested_pattern_match() {
82+
let a = &(source(23), 1);
83+
84+
// Match "in order", ref then tuple
85+
let b = match a {
86+
&(n, _) => n
87+
};
88+
sink(b); // $ MISSING: hasValueFlow=23
89+
90+
// Match "out of order", tuple then ref
91+
let c = match a {
92+
(n, _) => {
93+
match n {
94+
&i => i
95+
}
96+
}
97+
};
98+
sink(c); // $ MISSING: hasValueFlow=23
99+
}
100+
72101
fn main() {
73102
read_through_borrow();
74103
write_through_borrow();
75104
write_and_read_through_borrow();
105+
pass_borrowed_value();
76106
through_self_in_method_no_borrow();
77107
through_self_in_method_implicit_borrow();
78108
through_self_in_method_explicit_borrow();
109+
ref_nested_pattern_match();
79110
}

0 commit comments

Comments
 (0)