Skip to content

Commit bf9563e

Browse files
committed
Rust: Add data flow tests using ref patterns
1 parent 57a7cb4 commit bf9563e

File tree

2 files changed

+105
-81
lines changed

2 files changed

+105
-81
lines changed

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

Lines changed: 66 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -18,35 +18,35 @@ edges
1818
| main.rs:42:15:42:24 | source(...) | main.rs:42:9:42:11 | val | provenance | |
1919
| main.rs:43:26:43:29 | &val [&ref] | main.rs:37:25:37:32 | ...: ... [&ref] | provenance | |
2020
| main.rs:43:27:43:29 | val | main.rs:43:26:43:29 | &val [&ref] | provenance | |
21-
| main.rs:51:18:51:21 | SelfParam [MyNumber] | main.rs:52:15:52:18 | self [MyNumber] | provenance | |
22-
| main.rs:52:15:52:18 | self [MyNumber] | main.rs:53:13:53:38 | ...::MyNumber(...) [MyNumber] | provenance | |
23-
| main.rs:53:13:53:38 | ...::MyNumber(...) [MyNumber] | main.rs:53:32:53:37 | number | provenance | |
24-
| main.rs:53:32:53:37 | number | main.rs:51:31:57:5 | { ... } | provenance | |
25-
| main.rs:59:19:59:23 | SelfParam [&ref, MyNumber] | main.rs:60:15:60:18 | self [&ref, MyNumber] | provenance | |
26-
| main.rs:60:15:60:18 | self [&ref, MyNumber] | main.rs:61:13:61:39 | &... [&ref, MyNumber] | provenance | |
27-
| main.rs:61:13:61:39 | &... [&ref, MyNumber] | main.rs:61:14:61:39 | ...::MyNumber(...) [MyNumber] | provenance | |
28-
| main.rs:61:14:61:39 | ...::MyNumber(...) [MyNumber] | main.rs:61:33:61:38 | number | provenance | |
29-
| main.rs:61:33:61:38 | number | main.rs:59:33:65:5 | { ... } | provenance | |
30-
| main.rs:69:9:69:17 | my_number [MyNumber] | main.rs:70:10:70:18 | my_number [MyNumber] | provenance | |
31-
| main.rs:69:21:69:50 | ...::MyNumber(...) [MyNumber] | main.rs:69:9:69:17 | my_number [MyNumber] | provenance | |
32-
| main.rs:69:40:69:49 | source(...) | main.rs:69:21:69:50 | ...::MyNumber(...) [MyNumber] | provenance | |
33-
| main.rs:70:10:70:18 | my_number [MyNumber] | main.rs:51:18:51:21 | SelfParam [MyNumber] | provenance | |
34-
| main.rs:70:10:70:18 | my_number [MyNumber] | main.rs:70:10:70:30 | my_number.to_number(...) | provenance | |
35-
| main.rs:79:9:79:17 | my_number [&ref, MyNumber] | main.rs:80:10:80:18 | my_number [&ref, MyNumber] | provenance | |
36-
| main.rs:79:21:79:51 | &... [&ref, MyNumber] | main.rs:79:9:79:17 | my_number [&ref, MyNumber] | provenance | |
37-
| main.rs:79:22:79:51 | ...::MyNumber(...) [MyNumber] | main.rs:79:21:79:51 | &... [&ref, MyNumber] | provenance | |
38-
| main.rs:79:41:79:50 | source(...) | main.rs:79:22:79:51 | ...::MyNumber(...) [MyNumber] | provenance | |
39-
| main.rs:80:10:80:18 | my_number [&ref, MyNumber] | main.rs:59:19:59:23 | SelfParam [&ref, MyNumber] | provenance | |
40-
| main.rs:80:10:80:18 | my_number [&ref, MyNumber] | main.rs:80:10:80:31 | my_number.get_number(...) | provenance | |
41-
| main.rs:84:9:84:9 | a [&ref, tuple.0] | main.rs:87:19:87:19 | a [&ref, tuple.0] | provenance | |
42-
| main.rs:84:13:84:28 | &... [&ref, tuple.0] | main.rs:84:9:84:9 | a [&ref, tuple.0] | provenance | |
43-
| main.rs:84:14:84:28 | TupleExpr [tuple.0] | main.rs:84:13:84:28 | &... [&ref, tuple.0] | provenance | |
44-
| main.rs:84:15:84:24 | source(...) | main.rs:84:14:84:28 | TupleExpr [tuple.0] | provenance | |
45-
| main.rs:87:9:87:9 | b | main.rs:90:10:90:10 | b | provenance | |
46-
| main.rs:87:19:87:19 | a [&ref, tuple.0] | main.rs:88:9:88:15 | &... [&ref, tuple.0] | provenance | |
47-
| main.rs:88:9:88:15 | &... [&ref, tuple.0] | main.rs:88:10:88:15 | TuplePat [tuple.0] | provenance | |
48-
| main.rs:88:10:88:15 | TuplePat [tuple.0] | main.rs:88:11:88:11 | n | provenance | |
49-
| main.rs:88:11:88:11 | n | main.rs:87:9:87:9 | b | provenance | |
21+
| main.rs:76:18:76:21 | SelfParam [MyNumber] | main.rs:77:15:77:18 | self [MyNumber] | provenance | |
22+
| main.rs:77:15:77:18 | self [MyNumber] | main.rs:78:13:78:38 | ...::MyNumber(...) [MyNumber] | provenance | |
23+
| main.rs:78:13:78:38 | ...::MyNumber(...) [MyNumber] | main.rs:78:32:78:37 | number | provenance | |
24+
| main.rs:78:32:78:37 | number | main.rs:76:31:80:5 | { ... } | provenance | |
25+
| main.rs:82:19:82:23 | SelfParam [&ref, MyNumber] | main.rs:83:15:83:18 | self [&ref, MyNumber] | provenance | |
26+
| main.rs:83:15:83:18 | self [&ref, MyNumber] | main.rs:84:13:84:39 | &... [&ref, MyNumber] | provenance | |
27+
| main.rs:84:13:84:39 | &... [&ref, MyNumber] | main.rs:84:14:84:39 | ...::MyNumber(...) [MyNumber] | provenance | |
28+
| main.rs:84:14:84:39 | ...::MyNumber(...) [MyNumber] | main.rs:84:33:84:38 | number | provenance | |
29+
| main.rs:84:33:84:38 | number | main.rs:82:33:86:5 | { ... } | provenance | |
30+
| main.rs:90:9:90:17 | my_number [MyNumber] | main.rs:91:10:91:18 | my_number [MyNumber] | provenance | |
31+
| main.rs:90:21:90:50 | ...::MyNumber(...) [MyNumber] | main.rs:90:9:90:17 | my_number [MyNumber] | provenance | |
32+
| main.rs:90:40:90:49 | source(...) | main.rs:90:21:90:50 | ...::MyNumber(...) [MyNumber] | provenance | |
33+
| main.rs:91:10:91:18 | my_number [MyNumber] | main.rs:76:18:76:21 | SelfParam [MyNumber] | provenance | |
34+
| main.rs:91:10:91:18 | my_number [MyNumber] | main.rs:91:10:91:30 | my_number.to_number(...) | provenance | |
35+
| main.rs:100:9:100:17 | my_number [&ref, MyNumber] | main.rs:101:10:101:18 | my_number [&ref, MyNumber] | provenance | |
36+
| main.rs:100:21:100:51 | &... [&ref, MyNumber] | main.rs:100:9:100:17 | my_number [&ref, MyNumber] | provenance | |
37+
| main.rs:100:22:100:51 | ...::MyNumber(...) [MyNumber] | main.rs:100:21:100:51 | &... [&ref, MyNumber] | provenance | |
38+
| main.rs:100:41:100:50 | source(...) | main.rs:100:22:100:51 | ...::MyNumber(...) [MyNumber] | provenance | |
39+
| main.rs:101:10:101:18 | my_number [&ref, MyNumber] | main.rs:82:19:82:23 | SelfParam [&ref, MyNumber] | provenance | |
40+
| main.rs:101:10:101:18 | my_number [&ref, MyNumber] | main.rs:101:10:101:31 | my_number.get_number(...) | provenance | |
41+
| main.rs:105:9:105:9 | a [&ref, tuple.0] | main.rs:108:19:108:19 | a [&ref, tuple.0] | provenance | |
42+
| main.rs:105:13:105:28 | &... [&ref, tuple.0] | main.rs:105:9:105:9 | a [&ref, tuple.0] | provenance | |
43+
| main.rs:105:14:105:28 | TupleExpr [tuple.0] | main.rs:105:13:105:28 | &... [&ref, tuple.0] | provenance | |
44+
| main.rs:105:15:105:24 | source(...) | main.rs:105:14:105:28 | TupleExpr [tuple.0] | provenance | |
45+
| main.rs:108:9:108:9 | b | main.rs:111:10:111:10 | b | provenance | |
46+
| main.rs:108:19:108:19 | a [&ref, tuple.0] | main.rs:109:9:109:15 | &... [&ref, tuple.0] | provenance | |
47+
| main.rs:109:9:109:15 | &... [&ref, tuple.0] | main.rs:109:10:109:15 | TuplePat [tuple.0] | provenance | |
48+
| main.rs:109:10:109:15 | TuplePat [tuple.0] | main.rs:109:11:109:11 | n | provenance | |
49+
| main.rs:109:11:109:11 | n | main.rs:108:9:108:9 | b | provenance | |
5050
nodes
5151
| main.rs:13:9:13:9 | a | semmle.label | a |
5252
| main.rs:13:13:13:22 | source(...) | semmle.label | source(...) |
@@ -69,46 +69,46 @@ nodes
6969
| main.rs:42:15:42:24 | source(...) | semmle.label | source(...) |
7070
| main.rs:43:26:43:29 | &val [&ref] | semmle.label | &val [&ref] |
7171
| main.rs:43:27:43:29 | val | semmle.label | val |
72-
| main.rs:51:18:51:21 | SelfParam [MyNumber] | semmle.label | SelfParam [MyNumber] |
73-
| main.rs:51:31:57:5 | { ... } | semmle.label | { ... } |
74-
| main.rs:52:15:52:18 | self [MyNumber] | semmle.label | self [MyNumber] |
75-
| main.rs:53:13:53:38 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] |
76-
| main.rs:53:32:53:37 | number | semmle.label | number |
77-
| main.rs:59:19:59:23 | SelfParam [&ref, MyNumber] | semmle.label | SelfParam [&ref, MyNumber] |
78-
| main.rs:59:33:65:5 | { ... } | semmle.label | { ... } |
79-
| main.rs:60:15:60:18 | self [&ref, MyNumber] | semmle.label | self [&ref, MyNumber] |
80-
| main.rs:61:13:61:39 | &... [&ref, MyNumber] | semmle.label | &... [&ref, MyNumber] |
81-
| main.rs:61:14:61:39 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] |
82-
| main.rs:61:33:61:38 | number | semmle.label | number |
83-
| main.rs:69:9:69:17 | my_number [MyNumber] | semmle.label | my_number [MyNumber] |
84-
| main.rs:69:21:69:50 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] |
85-
| main.rs:69:40:69:49 | source(...) | semmle.label | source(...) |
86-
| main.rs:70:10:70:18 | my_number [MyNumber] | semmle.label | my_number [MyNumber] |
87-
| main.rs:70:10:70:30 | my_number.to_number(...) | semmle.label | my_number.to_number(...) |
88-
| main.rs:79:9:79:17 | my_number [&ref, MyNumber] | semmle.label | my_number [&ref, MyNumber] |
89-
| main.rs:79:21:79:51 | &... [&ref, MyNumber] | semmle.label | &... [&ref, MyNumber] |
90-
| main.rs:79:22:79:51 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] |
91-
| main.rs:79:41:79:50 | source(...) | semmle.label | source(...) |
92-
| main.rs:80:10:80:18 | my_number [&ref, MyNumber] | semmle.label | my_number [&ref, MyNumber] |
93-
| main.rs:80:10:80:31 | my_number.get_number(...) | semmle.label | my_number.get_number(...) |
94-
| main.rs:84:9:84:9 | a [&ref, tuple.0] | semmle.label | a [&ref, tuple.0] |
95-
| main.rs:84:13:84:28 | &... [&ref, tuple.0] | semmle.label | &... [&ref, tuple.0] |
96-
| main.rs:84:14:84:28 | TupleExpr [tuple.0] | semmle.label | TupleExpr [tuple.0] |
97-
| main.rs:84:15:84:24 | source(...) | semmle.label | source(...) |
98-
| main.rs:87:9:87:9 | b | semmle.label | b |
99-
| main.rs:87:19:87:19 | a [&ref, tuple.0] | semmle.label | a [&ref, tuple.0] |
100-
| main.rs:88:9:88:15 | &... [&ref, tuple.0] | semmle.label | &... [&ref, tuple.0] |
101-
| main.rs:88:10:88:15 | TuplePat [tuple.0] | semmle.label | TuplePat [tuple.0] |
102-
| main.rs:88:11:88:11 | n | semmle.label | n |
103-
| main.rs:90:10:90:10 | b | semmle.label | b |
72+
| main.rs:76:18:76:21 | SelfParam [MyNumber] | semmle.label | SelfParam [MyNumber] |
73+
| main.rs:76:31:80:5 | { ... } | semmle.label | { ... } |
74+
| main.rs:77:15:77:18 | self [MyNumber] | semmle.label | self [MyNumber] |
75+
| main.rs:78:13:78:38 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] |
76+
| main.rs:78:32:78:37 | number | semmle.label | number |
77+
| main.rs:82:19:82:23 | SelfParam [&ref, MyNumber] | semmle.label | SelfParam [&ref, MyNumber] |
78+
| main.rs:82:33:86:5 | { ... } | semmle.label | { ... } |
79+
| main.rs:83:15:83:18 | self [&ref, MyNumber] | semmle.label | self [&ref, MyNumber] |
80+
| main.rs:84:13:84:39 | &... [&ref, MyNumber] | semmle.label | &... [&ref, MyNumber] |
81+
| main.rs:84:14:84:39 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] |
82+
| main.rs:84:33:84:38 | number | semmle.label | number |
83+
| main.rs:90:9:90:17 | my_number [MyNumber] | semmle.label | my_number [MyNumber] |
84+
| main.rs:90:21:90:50 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] |
85+
| main.rs:90:40:90:49 | source(...) | semmle.label | source(...) |
86+
| main.rs:91:10:91:18 | my_number [MyNumber] | semmle.label | my_number [MyNumber] |
87+
| main.rs:91:10:91:30 | my_number.to_number(...) | semmle.label | my_number.to_number(...) |
88+
| main.rs:100:9:100:17 | my_number [&ref, MyNumber] | semmle.label | my_number [&ref, MyNumber] |
89+
| main.rs:100:21:100:51 | &... [&ref, MyNumber] | semmle.label | &... [&ref, MyNumber] |
90+
| main.rs:100:22:100:51 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] |
91+
| main.rs:100:41:100:50 | source(...) | semmle.label | source(...) |
92+
| main.rs:101:10:101:18 | my_number [&ref, MyNumber] | semmle.label | my_number [&ref, MyNumber] |
93+
| main.rs:101:10:101:31 | my_number.get_number(...) | semmle.label | my_number.get_number(...) |
94+
| main.rs:105:9:105:9 | a [&ref, tuple.0] | semmle.label | a [&ref, tuple.0] |
95+
| main.rs:105:13:105:28 | &... [&ref, tuple.0] | semmle.label | &... [&ref, tuple.0] |
96+
| main.rs:105:14:105:28 | TupleExpr [tuple.0] | semmle.label | TupleExpr [tuple.0] |
97+
| main.rs:105:15:105:24 | source(...) | semmle.label | source(...) |
98+
| main.rs:108:9:108:9 | b | semmle.label | b |
99+
| main.rs:108:19:108:19 | a [&ref, tuple.0] | semmle.label | a [&ref, tuple.0] |
100+
| main.rs:109:9:109:15 | &... [&ref, tuple.0] | semmle.label | &... [&ref, tuple.0] |
101+
| main.rs:109:10:109:15 | TuplePat [tuple.0] | semmle.label | TuplePat [tuple.0] |
102+
| main.rs:109:11:109:11 | n | semmle.label | n |
103+
| main.rs:111:10:111:10 | b | semmle.label | b |
104104
subpaths
105-
| main.rs:70:10:70:18 | my_number [MyNumber] | main.rs:51:18:51:21 | SelfParam [MyNumber] | main.rs:51:31:57:5 | { ... } | main.rs:70:10:70:30 | my_number.to_number(...) |
106-
| main.rs:80:10:80:18 | my_number [&ref, MyNumber] | main.rs:59:19:59:23 | SelfParam [&ref, MyNumber] | main.rs:59:33:65:5 | { ... } | main.rs:80:10:80:31 | my_number.get_number(...) |
105+
| main.rs:91:10:91:18 | my_number [MyNumber] | main.rs:76:18:76:21 | SelfParam [MyNumber] | main.rs:76:31:80:5 | { ... } | main.rs:91:10:91:30 | my_number.to_number(...) |
106+
| main.rs:101:10:101:18 | my_number [&ref, MyNumber] | main.rs:82:19:82:23 | SelfParam [&ref, MyNumber] | main.rs:82:33:86:5 | { ... } | main.rs:101:10:101:31 | my_number.get_number(...) |
107107
testFailures
108108
#select
109109
| 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(...) |
110110
| main.rs:32:10:32:11 | * ... | main.rs:31:10:31:19 | source(...) | main.rs:32:10:32:11 | * ... | $@ | main.rs:31:10:31:19 | source(...) | source(...) |
111111
| main.rs:38:10:38:10 | n | main.rs:42:15:42:24 | source(...) | main.rs:38:10:38:10 | n | $@ | main.rs:42:15:42:24 | source(...) | source(...) |
112-
| main.rs:70:10:70:30 | my_number.to_number(...) | main.rs:69:40:69:49 | source(...) | main.rs:70:10:70:30 | my_number.to_number(...) | $@ | main.rs:69:40:69:49 | source(...) | source(...) |
113-
| main.rs:80:10:80:31 | my_number.get_number(...) | main.rs:79:41:79:50 | source(...) | main.rs:80:10:80:31 | my_number.get_number(...) | $@ | main.rs:79:41:79:50 | source(...) | source(...) |
114-
| main.rs:90:10:90:10 | b | main.rs:84:15:84:24 | source(...) | main.rs:90:10:90:10 | b | $@ | main.rs:84:15:84:24 | source(...) | source(...) |
112+
| main.rs:91:10:91:30 | my_number.to_number(...) | main.rs:90:40:90:49 | source(...) | main.rs:91:10:91:30 | my_number.to_number(...) | $@ | main.rs:90:40:90:49 | source(...) | source(...) |
113+
| main.rs:101:10:101:31 | my_number.get_number(...) | main.rs:100:41:100:50 | source(...) | main.rs:101:10:101:31 | my_number.get_number(...) | $@ | main.rs:100:41:100:50 | source(...) | source(...) |
114+
| main.rs:111:10:111:10 | b | main.rs:105:15:105:24 | source(...) | main.rs:111:10:111:10 | b | $@ | main.rs:105:15:105:24 | source(...) | source(...) |

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

Lines changed: 39 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -43,24 +43,45 @@ fn pass_borrowed_value() {
4343
takes_borrowed_value(&val);
4444
}
4545

46+
mod test_ref_pattern {
47+
use super::{sink, source};
48+
49+
pub fn read_through_ref() {
50+
let a = source(21);
51+
let ref p = a;
52+
sink(*p); // $ MISSING: hasValueFlow=21
53+
}
54+
55+
pub fn write_through_ref_mut() {
56+
let ref mut a = source(78);
57+
sink(*a); // $ MISSING: hasValueFlow=78
58+
*a = 0;
59+
sink(*a); // now cleared
60+
}
61+
62+
pub fn ref_pattern_in_match() {
63+
let a = Some(source(17));
64+
let b = match a {
65+
Some(ref p) => sink(*p), // $ MISSING: hasValueFlow=17
66+
None => (),
67+
};
68+
}
69+
}
70+
4671
enum MyNumber {
47-
MyNumber(i64)
72+
MyNumber(i64),
4873
}
4974

5075
impl MyNumber {
5176
fn to_number(self) -> i64 {
5277
match self {
53-
MyNumber::MyNumber(number) => {
54-
number
55-
}
78+
MyNumber::MyNumber(number) => number,
5679
}
5780
}
5881

5982
fn get_number(&self) -> i64 {
6083
match self {
61-
&MyNumber::MyNumber(number) => {
62-
number
63-
}
84+
&MyNumber::MyNumber(number) => number,
6485
}
6586
}
6687
}
@@ -83,23 +104,23 @@ fn through_self_in_method_explicit_borrow() {
83104
fn ref_nested_pattern_match() {
84105
let a = &(source(23), 1);
85106

86-
// Match "in order", ref then tuple
107+
// Match "in order", reference pattern then tuple pattern
87108
let b = match a {
88-
&(n, _) => n
109+
&(n, _) => n,
89110
};
90111
sink(b); // $ hasValueFlow=23
91112

92-
// Match "out of order", tuple then ref
113+
// Match "out of order", tuple pattern then deref pattern
93114
let c = match a {
94-
(n, _) => {
95-
match n {
96-
&i => i
97-
}
98-
}
115+
(n, _) => match n {
116+
&i => i,
117+
},
99118
};
100119
sink(c); // $ MISSING: hasValueFlow=23
101120
}
102121

122+
use test_ref_pattern::*;
123+
103124
fn main() {
104125
read_through_borrow();
105126
write_through_borrow();
@@ -109,4 +130,7 @@ fn main() {
109130
through_self_in_method_implicit_borrow();
110131
through_self_in_method_explicit_borrow();
111132
ref_nested_pattern_match();
133+
read_through_ref();
134+
write_through_ref_mut();
135+
ref_pattern_in_match();
112136
}

0 commit comments

Comments
 (0)