Skip to content

Commit 11685a8

Browse files
committed
Rust: Add flow tests involving references
1 parent 4581e77 commit 11685a8

File tree

5 files changed

+138
-90
lines changed

5 files changed

+138
-90
lines changed

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

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,29 @@ pub fn test_operator_overloading() {
134134
sink(d.value); // $ MISSING: hasValueFlow=7
135135
}
136136

137+
// Flow out of mutable parameters.
138+
139+
fn set_int(n: &mut i64, c: i64) {
140+
*n = c;
141+
}
142+
143+
fn mutates_argument_1() {
144+
// Passing an already borrowed value to a function and then reading from the same borrow.
145+
let mut n = 0;
146+
let m = &mut n;
147+
sink(*m);
148+
set_int(m, source(37));
149+
sink(*m); // $ MISSING: hasValueFlow=37
150+
}
151+
152+
fn mutates_argument_2() {
153+
// Borrowing at the call and then reading from the unborrowed variable.
154+
let mut n = 0;
155+
sink(n);
156+
set_int(&mut n, source(88));
157+
sink(n); // $ MISSING: hasValueFlow=88
158+
}
159+
137160
fn main() {
138161
data_out_of_call();
139162
data_in_to_call();
@@ -145,4 +168,6 @@ fn main() {
145168
data_through_method();
146169

147170
test_operator_overloading();
171+
mutates_argument_1();
172+
mutates_argument_2();
148173
}

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

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,21 @@
2929
| main.rs:131:28:131:36 | source(...) | main.rs:1:1:3:1 | fn source |
3030
| main.rs:133:13:133:20 | a.add(...) | main.rs:114:5:117:5 | fn add |
3131
| main.rs:134:5:134:17 | sink(...) | main.rs:5:1:7:1 | fn sink |
32-
| main.rs:138:5:138:22 | data_out_of_call(...) | main.rs:16:1:19:1 | fn data_out_of_call |
33-
| main.rs:139:5:139:21 | data_in_to_call(...) | main.rs:25:1:28:1 | fn data_in_to_call |
34-
| main.rs:140:5:140:23 | data_through_call(...) | main.rs:34:1:38:1 | fn data_through_call |
35-
| main.rs:141:5:141:34 | data_through_nested_function(...) | main.rs:48:1:57:1 | fn data_through_nested_function |
36-
| main.rs:143:5:143:24 | data_out_of_method(...) | main.rs:86:1:90:1 | fn data_out_of_method |
37-
| main.rs:144:5:144:28 | data_in_to_method_call(...) | main.rs:92:1:96:1 | fn data_in_to_method_call |
38-
| main.rs:145:5:145:25 | data_through_method(...) | main.rs:98:1:103:1 | fn data_through_method |
39-
| main.rs:147:5:147:31 | test_operator_overloading(...) | main.rs:120:1:135:1 | fn test_operator_overloading |
32+
| main.rs:147:5:147:12 | sink(...) | main.rs:5:1:7:1 | fn sink |
33+
| main.rs:148:5:148:26 | set_int(...) | main.rs:139:1:141:1 | fn set_int |
34+
| main.rs:148:16:148:25 | source(...) | main.rs:1:1:3:1 | fn source |
35+
| main.rs:149:5:149:12 | sink(...) | main.rs:5:1:7:1 | fn sink |
36+
| main.rs:155:5:155:11 | sink(...) | main.rs:5:1:7:1 | fn sink |
37+
| main.rs:156:5:156:31 | set_int(...) | main.rs:139:1:141:1 | fn set_int |
38+
| main.rs:156:21:156:30 | source(...) | main.rs:1:1:3:1 | fn source |
39+
| main.rs:157:5:157:11 | sink(...) | main.rs:5:1:7:1 | fn sink |
40+
| main.rs:161:5:161:22 | data_out_of_call(...) | main.rs:16:1:19:1 | fn data_out_of_call |
41+
| main.rs:162:5:162:21 | data_in_to_call(...) | main.rs:25:1:28:1 | fn data_in_to_call |
42+
| main.rs:163:5:163:23 | data_through_call(...) | main.rs:34:1:38:1 | fn data_through_call |
43+
| main.rs:164:5:164:34 | data_through_nested_function(...) | main.rs:48:1:57:1 | fn data_through_nested_function |
44+
| main.rs:166:5:166:24 | data_out_of_method(...) | main.rs:86:1:90:1 | fn data_out_of_method |
45+
| main.rs:167:5:167:28 | data_in_to_method_call(...) | main.rs:92:1:96:1 | fn data_in_to_method_call |
46+
| main.rs:168:5:168:25 | data_through_method(...) | main.rs:98:1:103:1 | fn data_through_method |
47+
| main.rs:170:5:170:31 | test_operator_overloading(...) | main.rs:120:1:135:1 | fn test_operator_overloading |
48+
| main.rs:171:5:171:24 | mutates_argument_1(...) | main.rs:143:1:150:1 | fn mutates_argument_1 |
49+
| main.rs:172:5:172:24 | mutates_argument_2(...) | main.rs:152:1:158:1 | fn mutates_argument_2 |

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

Lines changed: 82 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -8,42 +8,42 @@ 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:35:25:35:26 | &... [&ref] | main.rs:35:26:35:26 | n | provenance | |
12-
| main.rs:35:25:35:32 | ...: ... [&ref] | main.rs:35:25:35:26 | &... [&ref] | provenance | |
13-
| main.rs:35:26:35:26 | n | main.rs:36:10:36:10 | n | provenance | |
14-
| main.rs:40:9:40:11 | val | main.rs:41:27:41:29 | val | provenance | |
15-
| main.rs:40:15:40:24 | source(...) | main.rs:40:9:40:11 | val | provenance | |
16-
| main.rs:41:26:41:29 | &val [&ref] | main.rs:35:25:35:32 | ...: ... [&ref] | provenance | |
17-
| main.rs:41:27:41:29 | val | main.rs:41:26:41:29 | &val [&ref] | provenance | |
18-
| main.rs:49:18:49:21 | SelfParam [MyNumber] | main.rs:50:15:50:18 | self [MyNumber] | provenance | |
19-
| main.rs:50:15:50:18 | self [MyNumber] | main.rs:51:13:51:38 | ...::MyNumber(...) [MyNumber] | provenance | |
20-
| main.rs:51:13:51:38 | ...::MyNumber(...) [MyNumber] | main.rs:51:32:51:37 | number | provenance | |
21-
| main.rs:51:32:51:37 | number | main.rs:49:31:55:5 | { ... } | provenance | |
22-
| main.rs:57:19:57:23 | SelfParam [&ref, MyNumber] | main.rs:58:15:58:18 | self [&ref, MyNumber] | provenance | |
23-
| main.rs:58:15:58:18 | self [&ref, MyNumber] | main.rs:59:13:59:39 | &... [&ref, MyNumber] | provenance | |
24-
| main.rs:59:13:59:39 | &... [&ref, MyNumber] | main.rs:59:14:59:39 | ...::MyNumber(...) [MyNumber] | provenance | |
25-
| main.rs:59:14:59:39 | ...::MyNumber(...) [MyNumber] | main.rs:59:33:59:38 | number | provenance | |
26-
| main.rs:59:33:59:38 | number | main.rs:57:33:63:5 | { ... } | provenance | |
27-
| main.rs:67:9:67:17 | my_number [MyNumber] | main.rs:68:10:68:18 | my_number [MyNumber] | provenance | |
28-
| main.rs:67:21:67:50 | ...::MyNumber(...) [MyNumber] | main.rs:67:9:67:17 | my_number [MyNumber] | provenance | |
29-
| main.rs:67:40:67:49 | source(...) | main.rs:67:21:67:50 | ...::MyNumber(...) [MyNumber] | provenance | |
30-
| main.rs:68:10:68:18 | my_number [MyNumber] | main.rs:49:18:49:21 | SelfParam [MyNumber] | provenance | |
31-
| main.rs:68:10:68:18 | my_number [MyNumber] | main.rs:68:10:68:30 | my_number.to_number(...) | provenance | |
32-
| main.rs:77:9:77:17 | my_number [&ref, MyNumber] | main.rs:78:10:78:18 | my_number [&ref, MyNumber] | provenance | |
33-
| main.rs:77:21:77:51 | &... [&ref, MyNumber] | main.rs:77:9:77:17 | my_number [&ref, MyNumber] | provenance | |
34-
| main.rs:77:22:77:51 | ...::MyNumber(...) [MyNumber] | main.rs:77:21:77:51 | &... [&ref, MyNumber] | provenance | |
35-
| main.rs:77:41:77:50 | source(...) | main.rs:77:22:77:51 | ...::MyNumber(...) [MyNumber] | provenance | |
36-
| main.rs:78:10:78:18 | my_number [&ref, MyNumber] | main.rs:57:19:57:23 | SelfParam [&ref, MyNumber] | provenance | |
37-
| main.rs:78:10:78:18 | my_number [&ref, MyNumber] | main.rs:78:10:78:31 | my_number.get_number(...) | provenance | |
38-
| main.rs:82:9:82:9 | a [&ref, tuple.0] | main.rs:85:19:85:19 | a [&ref, tuple.0] | provenance | |
39-
| main.rs:82:13:82:28 | &... [&ref, tuple.0] | main.rs:82:9:82:9 | a [&ref, tuple.0] | provenance | |
40-
| main.rs:82:14:82:28 | TupleExpr [tuple.0] | main.rs:82:13:82:28 | &... [&ref, tuple.0] | provenance | |
41-
| main.rs:82:15:82:24 | source(...) | main.rs:82:14:82:28 | TupleExpr [tuple.0] | provenance | |
42-
| main.rs:85:9:85:9 | b | main.rs:88:10:88:10 | b | provenance | |
43-
| main.rs:85:19:85:19 | a [&ref, tuple.0] | main.rs:86:9:86:15 | &... [&ref, tuple.0] | provenance | |
44-
| main.rs:86:9:86:15 | &... [&ref, tuple.0] | main.rs:86:10:86:15 | TuplePat [tuple.0] | provenance | |
45-
| main.rs:86:10:86:15 | TuplePat [tuple.0] | main.rs:86:11:86:11 | n | provenance | |
46-
| main.rs:86:11:86:11 | n | main.rs:85:9:85:9 | b | provenance | |
11+
| main.rs:37:25:37:26 | &... [&ref] | main.rs:37:26:37:26 | n | provenance | |
12+
| main.rs:37:25:37:32 | ...: ... [&ref] | main.rs:37:25:37:26 | &... [&ref] | provenance | |
13+
| main.rs:37:26:37:26 | n | main.rs:38:10:38:10 | n | provenance | |
14+
| main.rs:42:9:42:11 | val | main.rs:43:27:43:29 | val | provenance | |
15+
| main.rs:42:15:42:24 | source(...) | main.rs:42:9:42:11 | val | provenance | |
16+
| main.rs:43:26:43:29 | &val [&ref] | main.rs:37:25:37:32 | ...: ... [&ref] | provenance | |
17+
| main.rs:43:27:43:29 | val | main.rs:43:26:43:29 | &val [&ref] | provenance | |
18+
| main.rs:51:18:51:21 | SelfParam [MyNumber] | main.rs:52:15:52:18 | self [MyNumber] | provenance | |
19+
| main.rs:52:15:52:18 | self [MyNumber] | main.rs:53:13:53:38 | ...::MyNumber(...) [MyNumber] | provenance | |
20+
| main.rs:53:13:53:38 | ...::MyNumber(...) [MyNumber] | main.rs:53:32:53:37 | number | provenance | |
21+
| main.rs:53:32:53:37 | number | main.rs:51:31:57:5 | { ... } | provenance | |
22+
| main.rs:59:19:59:23 | SelfParam [&ref, MyNumber] | main.rs:60:15:60:18 | self [&ref, MyNumber] | provenance | |
23+
| main.rs:60:15:60:18 | self [&ref, MyNumber] | main.rs:61:13:61:39 | &... [&ref, MyNumber] | provenance | |
24+
| main.rs:61:13:61:39 | &... [&ref, MyNumber] | main.rs:61:14:61:39 | ...::MyNumber(...) [MyNumber] | provenance | |
25+
| main.rs:61:14:61:39 | ...::MyNumber(...) [MyNumber] | main.rs:61:33:61:38 | number | provenance | |
26+
| main.rs:61:33:61:38 | number | main.rs:59:33:65:5 | { ... } | provenance | |
27+
| main.rs:69:9:69:17 | my_number [MyNumber] | main.rs:70:10:70:18 | my_number [MyNumber] | provenance | |
28+
| main.rs:69:21:69:50 | ...::MyNumber(...) [MyNumber] | main.rs:69:9:69:17 | my_number [MyNumber] | provenance | |
29+
| main.rs:69:40:69:49 | source(...) | main.rs:69:21:69:50 | ...::MyNumber(...) [MyNumber] | provenance | |
30+
| main.rs:70:10:70:18 | my_number [MyNumber] | main.rs:51:18:51:21 | SelfParam [MyNumber] | provenance | |
31+
| main.rs:70:10:70:18 | my_number [MyNumber] | main.rs:70:10:70:30 | my_number.to_number(...) | provenance | |
32+
| main.rs:79:9:79:17 | my_number [&ref, MyNumber] | main.rs:80:10:80:18 | my_number [&ref, MyNumber] | provenance | |
33+
| main.rs:79:21:79:51 | &... [&ref, MyNumber] | main.rs:79:9:79:17 | my_number [&ref, MyNumber] | provenance | |
34+
| main.rs:79:22:79:51 | ...::MyNumber(...) [MyNumber] | main.rs:79:21:79:51 | &... [&ref, MyNumber] | provenance | |
35+
| main.rs:79:41:79:50 | source(...) | main.rs:79:22:79:51 | ...::MyNumber(...) [MyNumber] | provenance | |
36+
| main.rs:80:10:80:18 | my_number [&ref, MyNumber] | main.rs:59:19:59:23 | SelfParam [&ref, MyNumber] | provenance | |
37+
| main.rs:80:10:80:18 | my_number [&ref, MyNumber] | main.rs:80:10:80:31 | my_number.get_number(...) | provenance | |
38+
| main.rs:84:9:84:9 | a [&ref, tuple.0] | main.rs:87:19:87:19 | a [&ref, tuple.0] | provenance | |
39+
| main.rs:84:13:84:28 | &... [&ref, tuple.0] | main.rs:84:9:84:9 | a [&ref, tuple.0] | provenance | |
40+
| main.rs:84:14:84:28 | TupleExpr [tuple.0] | main.rs:84:13:84:28 | &... [&ref, tuple.0] | provenance | |
41+
| main.rs:84:15:84:24 | source(...) | main.rs:84:14:84:28 | TupleExpr [tuple.0] | provenance | |
42+
| main.rs:87:9:87:9 | b | main.rs:90:10:90:10 | b | provenance | |
43+
| main.rs:87:19:87:19 | a [&ref, tuple.0] | main.rs:88:9:88:15 | &... [&ref, tuple.0] | provenance | |
44+
| main.rs:88:9:88:15 | &... [&ref, tuple.0] | main.rs:88:10:88:15 | TuplePat [tuple.0] | provenance | |
45+
| main.rs:88:10:88:15 | TuplePat [tuple.0] | main.rs:88:11:88:11 | n | provenance | |
46+
| main.rs:88:11:88:11 | n | main.rs:87:9:87:9 | b | provenance | |
4747
nodes
4848
| main.rs:13:9:13:9 | a | semmle.label | a |
4949
| main.rs:13:13:13:22 | source(...) | semmle.label | source(...) |
@@ -54,53 +54,53 @@ nodes
5454
| main.rs:15:13:15:14 | * ... | semmle.label | * ... |
5555
| main.rs:15:14:15:14 | b [&ref] | semmle.label | b [&ref] |
5656
| main.rs:16:10:16:10 | c | semmle.label | c |
57-
| main.rs:35:25:35:26 | &... [&ref] | semmle.label | &... [&ref] |
58-
| main.rs:35:25:35:32 | ...: ... [&ref] | semmle.label | ...: ... [&ref] |
59-
| main.rs:35:26:35:26 | n | semmle.label | n |
60-
| main.rs:36:10:36:10 | n | semmle.label | n |
61-
| main.rs:40:9:40:11 | val | semmle.label | val |
62-
| main.rs:40:15:40:24 | source(...) | semmle.label | source(...) |
63-
| main.rs:41:26:41:29 | &val [&ref] | semmle.label | &val [&ref] |
64-
| main.rs:41:27:41:29 | val | semmle.label | val |
65-
| main.rs:49:18:49:21 | SelfParam [MyNumber] | semmle.label | SelfParam [MyNumber] |
66-
| main.rs:49:31:55:5 | { ... } | semmle.label | { ... } |
67-
| main.rs:50:15:50:18 | self [MyNumber] | semmle.label | self [MyNumber] |
68-
| main.rs:51:13:51:38 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] |
69-
| main.rs:51:32:51:37 | number | semmle.label | number |
70-
| main.rs:57:19:57:23 | SelfParam [&ref, MyNumber] | semmle.label | SelfParam [&ref, MyNumber] |
71-
| main.rs:57:33:63:5 | { ... } | semmle.label | { ... } |
72-
| main.rs:58:15:58:18 | self [&ref, MyNumber] | semmle.label | self [&ref, MyNumber] |
73-
| main.rs:59:13:59:39 | &... [&ref, MyNumber] | semmle.label | &... [&ref, MyNumber] |
74-
| main.rs:59:14:59:39 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] |
75-
| main.rs:59:33:59:38 | number | semmle.label | number |
76-
| main.rs:67:9:67:17 | my_number [MyNumber] | semmle.label | my_number [MyNumber] |
77-
| main.rs:67:21:67:50 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] |
78-
| main.rs:67:40:67:49 | source(...) | semmle.label | source(...) |
79-
| main.rs:68:10:68:18 | my_number [MyNumber] | semmle.label | my_number [MyNumber] |
80-
| main.rs:68:10:68:30 | my_number.to_number(...) | semmle.label | my_number.to_number(...) |
81-
| main.rs:77:9:77:17 | my_number [&ref, MyNumber] | semmle.label | my_number [&ref, MyNumber] |
82-
| main.rs:77:21:77:51 | &... [&ref, MyNumber] | semmle.label | &... [&ref, MyNumber] |
83-
| main.rs:77:22:77:51 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] |
84-
| main.rs:77:41:77:50 | source(...) | semmle.label | source(...) |
85-
| main.rs:78:10:78:18 | my_number [&ref, MyNumber] | semmle.label | my_number [&ref, MyNumber] |
86-
| main.rs:78:10:78:31 | my_number.get_number(...) | semmle.label | my_number.get_number(...) |
87-
| main.rs:82:9:82:9 | a [&ref, tuple.0] | semmle.label | a [&ref, tuple.0] |
88-
| main.rs:82:13:82:28 | &... [&ref, tuple.0] | semmle.label | &... [&ref, tuple.0] |
89-
| main.rs:82:14:82:28 | TupleExpr [tuple.0] | semmle.label | TupleExpr [tuple.0] |
90-
| main.rs:82:15:82:24 | source(...) | semmle.label | source(...) |
91-
| main.rs:85:9:85:9 | b | semmle.label | b |
92-
| main.rs:85:19:85:19 | a [&ref, tuple.0] | semmle.label | a [&ref, tuple.0] |
93-
| main.rs:86:9:86:15 | &... [&ref, tuple.0] | semmle.label | &... [&ref, tuple.0] |
94-
| main.rs:86:10:86:15 | TuplePat [tuple.0] | semmle.label | TuplePat [tuple.0] |
95-
| main.rs:86:11:86:11 | n | semmle.label | n |
96-
| main.rs:88:10:88:10 | b | semmle.label | b |
57+
| main.rs:37:25:37:26 | &... [&ref] | semmle.label | &... [&ref] |
58+
| main.rs:37:25:37:32 | ...: ... [&ref] | semmle.label | ...: ... [&ref] |
59+
| main.rs:37:26:37:26 | n | semmle.label | n |
60+
| main.rs:38:10:38:10 | n | semmle.label | n |
61+
| main.rs:42:9:42:11 | val | semmle.label | val |
62+
| main.rs:42:15:42:24 | source(...) | semmle.label | source(...) |
63+
| main.rs:43:26:43:29 | &val [&ref] | semmle.label | &val [&ref] |
64+
| main.rs:43:27:43:29 | val | semmle.label | val |
65+
| main.rs:51:18:51:21 | SelfParam [MyNumber] | semmle.label | SelfParam [MyNumber] |
66+
| main.rs:51:31:57:5 | { ... } | semmle.label | { ... } |
67+
| main.rs:52:15:52:18 | self [MyNumber] | semmle.label | self [MyNumber] |
68+
| main.rs:53:13:53:38 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] |
69+
| main.rs:53:32:53:37 | number | semmle.label | number |
70+
| main.rs:59:19:59:23 | SelfParam [&ref, MyNumber] | semmle.label | SelfParam [&ref, MyNumber] |
71+
| main.rs:59:33:65:5 | { ... } | semmle.label | { ... } |
72+
| main.rs:60:15:60:18 | self [&ref, MyNumber] | semmle.label | self [&ref, MyNumber] |
73+
| main.rs:61:13:61:39 | &... [&ref, MyNumber] | semmle.label | &... [&ref, MyNumber] |
74+
| main.rs:61:14:61:39 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] |
75+
| main.rs:61:33:61:38 | number | semmle.label | number |
76+
| main.rs:69:9:69:17 | my_number [MyNumber] | semmle.label | my_number [MyNumber] |
77+
| main.rs:69:21:69:50 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] |
78+
| main.rs:69:40:69:49 | source(...) | semmle.label | source(...) |
79+
| main.rs:70:10:70:18 | my_number [MyNumber] | semmle.label | my_number [MyNumber] |
80+
| main.rs:70:10:70:30 | my_number.to_number(...) | semmle.label | my_number.to_number(...) |
81+
| main.rs:79:9:79:17 | my_number [&ref, MyNumber] | semmle.label | my_number [&ref, MyNumber] |
82+
| main.rs:79:21:79:51 | &... [&ref, MyNumber] | semmle.label | &... [&ref, MyNumber] |
83+
| main.rs:79:22:79:51 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] |
84+
| main.rs:79:41:79:50 | source(...) | semmle.label | source(...) |
85+
| main.rs:80:10:80:18 | my_number [&ref, MyNumber] | semmle.label | my_number [&ref, MyNumber] |
86+
| main.rs:80:10:80:31 | my_number.get_number(...) | semmle.label | my_number.get_number(...) |
87+
| main.rs:84:9:84:9 | a [&ref, tuple.0] | semmle.label | a [&ref, tuple.0] |
88+
| main.rs:84:13:84:28 | &... [&ref, tuple.0] | semmle.label | &... [&ref, tuple.0] |
89+
| main.rs:84:14:84:28 | TupleExpr [tuple.0] | semmle.label | TupleExpr [tuple.0] |
90+
| main.rs:84:15:84:24 | source(...) | semmle.label | source(...) |
91+
| main.rs:87:9:87:9 | b | semmle.label | b |
92+
| main.rs:87:19:87:19 | a [&ref, tuple.0] | semmle.label | a [&ref, tuple.0] |
93+
| main.rs:88:9:88:15 | &... [&ref, tuple.0] | semmle.label | &... [&ref, tuple.0] |
94+
| main.rs:88:10:88:15 | TuplePat [tuple.0] | semmle.label | TuplePat [tuple.0] |
95+
| main.rs:88:11:88:11 | n | semmle.label | n |
96+
| main.rs:90:10:90:10 | b | semmle.label | b |
9797
subpaths
98-
| 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(...) |
99-
| main.rs:78:10:78:18 | my_number [&ref, MyNumber] | main.rs:57:19:57:23 | SelfParam [&ref, MyNumber] | main.rs:57:33:63:5 | { ... } | main.rs:78:10:78:31 | my_number.get_number(...) |
98+
| 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(...) |
99+
| 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(...) |
100100
testFailures
101101
#select
102102
| 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(...) |
103-
| main.rs:36:10:36:10 | n | main.rs:40:15:40:24 | source(...) | main.rs:36:10:36:10 | n | $@ | main.rs:40:15:40:24 | source(...) | source(...) |
104-
| 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(...) |
105-
| main.rs:78:10:78:31 | my_number.get_number(...) | main.rs:77:41:77:50 | source(...) | main.rs:78:10:78:31 | my_number.get_number(...) | $@ | main.rs:77:41:77:50 | source(...) | source(...) |
106-
| main.rs:88:10:88:10 | b | main.rs:82:15:82:24 | source(...) | main.rs:88:10:88:10 | b | $@ | main.rs:82:15:82:24 | source(...) | source(...) |
103+
| 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(...) |
104+
| 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(...) |
105+
| 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(...) |
106+
| 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(...) |

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ fn write_and_read_through_borrow() {
3030
sink(*b);
3131
*b = source(37);
3232
sink(*b); // $ MISSING: hasValueFlow=37
33+
*b = 0;
34+
sink(*b); // now cleared
3335
}
3436

3537
fn takes_borrowed_value(&n: &i64) {

rust/ql/test/utils-tests/modelgenerator/summaries.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,3 +76,14 @@ impl MyStruct {
7676
pub fn apply<F>(n: i64, f: F) -> i64 where F : FnOnce(i64) -> i64 {
7777
f(n)
7878
}
79+
80+
// Flow out of mutated arguments
81+
82+
pub fn set_int(n: &mut i64, c: i64) {
83+
*n = c;
84+
}
85+
86+
// summary=repo::test;crate::summaries::read_int;Argument[0];ReturnValue;value;dfc-generated
87+
pub fn read_int(n: &mut i64) -> i64 {
88+
*n
89+
}

0 commit comments

Comments
 (0)