Skip to content

Commit a1069b1

Browse files
committed
Rust: Add examples with methods called as functions
1 parent dd102c4 commit a1069b1

File tree

5 files changed

+311
-194
lines changed

5 files changed

+311
-194
lines changed

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

+84-63
Original file line numberDiff line numberDiff line change
@@ -28,31 +28,40 @@ edges
2828
| main.rs:55:26:55:26 | a | main.rs:51:21:51:26 | ...: i64 | provenance | |
2929
| main.rs:55:26:55:26 | a | main.rs:55:13:55:27 | pass_through(...) | provenance | |
3030
| main.rs:67:23:67:28 | ...: i64 | main.rs:68:14:68:14 | n | provenance | |
31-
| main.rs:70:31:76:5 | { ... } | main.rs:88:13:88:25 | mn.get_data(...) | provenance | |
32-
| main.rs:74:13:74:21 | source(...) | main.rs:70:31:76:5 | { ... } | provenance | |
33-
| main.rs:77:28:77:33 | ...: i64 | main.rs:77:43:83:5 | { ... } | provenance | |
34-
| main.rs:88:9:88:9 | a | main.rs:89:10:89:10 | a | provenance | |
35-
| main.rs:88:13:88:25 | mn.get_data(...) | main.rs:88:9:88:9 | a | provenance | |
36-
| main.rs:94:9:94:9 | a | main.rs:95:16:95:16 | a | provenance | |
37-
| main.rs:94:13:94:21 | source(...) | main.rs:94:9:94:9 | a | provenance | |
38-
| main.rs:95:16:95:16 | a | main.rs:67:23:67:28 | ...: i64 | provenance | |
39-
| main.rs:100:9:100:9 | a | main.rs:101:29:101:29 | a | provenance | |
40-
| main.rs:100:13:100:21 | source(...) | main.rs:100:9:100:9 | a | provenance | |
41-
| main.rs:101:9:101:9 | b | main.rs:102:10:102:10 | b | provenance | |
42-
| main.rs:101:13:101:30 | mn.data_through(...) | main.rs:101:9:101:9 | b | provenance | |
43-
| main.rs:101:29:101:29 | a | main.rs:77:28:77:33 | ...: i64 | provenance | |
44-
| main.rs:101:29:101:29 | a | main.rs:101:13:101:30 | mn.data_through(...) | provenance | |
45-
| main.rs:138:9:138:9 | a | main.rs:139:10:139:10 | a | provenance | |
46-
| main.rs:138:13:138:21 | source(...) | main.rs:138:9:138:9 | a | provenance | |
47-
| main.rs:148:13:148:13 | c | main.rs:149:14:149:14 | c | provenance | |
48-
| main.rs:148:17:148:25 | source(...) | main.rs:148:13:148:13 | c | provenance | |
49-
| main.rs:164:25:164:30 | ...: i64 | main.rs:165:10:165:10 | c | provenance | |
50-
| main.rs:165:6:165:6 | [post] n [&ref] | main.rs:164:12:164:22 | ...: ... [Return] [&ref] | provenance | |
51-
| main.rs:165:10:165:10 | c | main.rs:165:6:165:6 | [post] n [&ref] | provenance | |
52-
| main.rs:173:13:173:13 | [post] m [&ref] | main.rs:174:11:174:11 | m [&ref] | provenance | |
53-
| main.rs:173:16:173:25 | source(...) | main.rs:164:25:164:30 | ...: i64 | provenance | |
54-
| main.rs:173:16:173:25 | source(...) | main.rs:173:13:173:13 | [post] m [&ref] | provenance | |
55-
| main.rs:174:11:174:11 | m [&ref] | main.rs:174:10:174:11 | * ... | provenance | |
31+
| main.rs:71:31:77:5 | { ... } | main.rs:90:13:90:25 | mn.get_data(...) | provenance | |
32+
| main.rs:75:13:75:21 | source(...) | main.rs:71:31:77:5 | { ... } | provenance | |
33+
| main.rs:79:28:79:33 | ...: i64 | main.rs:79:43:85:5 | { ... } | provenance | |
34+
| main.rs:90:9:90:9 | a | main.rs:91:10:91:10 | a | provenance | |
35+
| main.rs:90:13:90:25 | mn.get_data(...) | main.rs:90:9:90:9 | a | provenance | |
36+
| main.rs:96:9:96:9 | a | main.rs:97:16:97:16 | a | provenance | |
37+
| main.rs:96:13:96:21 | source(...) | main.rs:96:9:96:9 | a | provenance | |
38+
| main.rs:97:16:97:16 | a | main.rs:67:23:67:28 | ...: i64 | provenance | |
39+
| main.rs:102:9:102:9 | a | main.rs:103:29:103:29 | a | provenance | |
40+
| main.rs:102:13:102:21 | source(...) | main.rs:102:9:102:9 | a | provenance | |
41+
| main.rs:103:9:103:9 | b | main.rs:104:10:104:10 | b | provenance | |
42+
| main.rs:103:13:103:30 | mn.data_through(...) | main.rs:103:9:103:9 | b | provenance | |
43+
| main.rs:103:29:103:29 | a | main.rs:79:28:79:33 | ...: i64 | provenance | |
44+
| main.rs:103:29:103:29 | a | main.rs:103:13:103:30 | mn.data_through(...) | provenance | |
45+
| main.rs:128:12:128:17 | ...: i64 | main.rs:129:24:129:24 | n | provenance | |
46+
| main.rs:129:9:129:26 | MyInt {...} [MyInt] | main.rs:128:28:130:5 | { ... } [MyInt] | provenance | |
47+
| main.rs:129:24:129:24 | n | main.rs:129:9:129:26 | MyInt {...} [MyInt] | provenance | |
48+
| main.rs:134:9:134:9 | n [MyInt] | main.rs:135:9:135:26 | MyInt {...} [MyInt] | provenance | |
49+
| main.rs:134:13:134:34 | ...::new(...) [MyInt] | main.rs:134:9:134:9 | n [MyInt] | provenance | |
50+
| main.rs:134:24:134:33 | source(...) | main.rs:128:12:128:17 | ...: i64 | provenance | |
51+
| main.rs:134:24:134:33 | source(...) | main.rs:134:13:134:34 | ...::new(...) [MyInt] | provenance | |
52+
| main.rs:135:9:135:26 | MyInt {...} [MyInt] | main.rs:135:24:135:24 | m | provenance | |
53+
| main.rs:135:24:135:24 | m | main.rs:136:10:136:10 | m | provenance | |
54+
| main.rs:202:9:202:9 | a | main.rs:203:10:203:10 | a | provenance | |
55+
| main.rs:202:13:202:21 | source(...) | main.rs:202:9:202:9 | a | provenance | |
56+
| main.rs:212:13:212:13 | c | main.rs:213:14:213:14 | c | provenance | |
57+
| main.rs:212:17:212:25 | source(...) | main.rs:212:13:212:13 | c | provenance | |
58+
| main.rs:228:25:228:30 | ...: i64 | main.rs:229:10:229:10 | c | provenance | |
59+
| main.rs:229:6:229:6 | [post] n [&ref] | main.rs:228:12:228:22 | ...: ... [Return] [&ref] | provenance | |
60+
| main.rs:229:10:229:10 | c | main.rs:229:6:229:6 | [post] n [&ref] | provenance | |
61+
| main.rs:237:13:237:13 | [post] m [&ref] | main.rs:238:11:238:11 | m [&ref] | provenance | |
62+
| main.rs:237:16:237:25 | source(...) | main.rs:228:25:228:30 | ...: i64 | provenance | |
63+
| main.rs:237:16:237:25 | source(...) | main.rs:237:13:237:13 | [post] m [&ref] | provenance | |
64+
| main.rs:238:11:238:11 | m [&ref] | main.rs:238:10:238:11 | * ... | provenance | |
5665
nodes
5766
| main.rs:12:28:14:1 | { ... } | semmle.label | { ... } |
5867
| main.rs:13:5:13:13 | source(...) | semmle.label | source(...) |
@@ -87,52 +96,64 @@ nodes
8796
| main.rs:56:10:56:10 | b | semmle.label | b |
8897
| main.rs:67:23:67:28 | ...: i64 | semmle.label | ...: i64 |
8998
| main.rs:68:14:68:14 | n | semmle.label | n |
90-
| main.rs:70:31:76:5 | { ... } | semmle.label | { ... } |
91-
| main.rs:74:13:74:21 | source(...) | semmle.label | source(...) |
92-
| main.rs:77:28:77:33 | ...: i64 | semmle.label | ...: i64 |
93-
| main.rs:77:43:83:5 | { ... } | semmle.label | { ... } |
94-
| main.rs:88:9:88:9 | a | semmle.label | a |
95-
| main.rs:88:13:88:25 | mn.get_data(...) | semmle.label | mn.get_data(...) |
96-
| main.rs:89:10:89:10 | a | semmle.label | a |
97-
| main.rs:94:9:94:9 | a | semmle.label | a |
98-
| main.rs:94:13:94:21 | source(...) | semmle.label | source(...) |
99-
| main.rs:95:16:95:16 | a | semmle.label | a |
100-
| main.rs:100:9:100:9 | a | semmle.label | a |
101-
| main.rs:100:13:100:21 | source(...) | semmle.label | source(...) |
102-
| main.rs:101:9:101:9 | b | semmle.label | b |
103-
| main.rs:101:13:101:30 | mn.data_through(...) | semmle.label | mn.data_through(...) |
104-
| main.rs:101:29:101:29 | a | semmle.label | a |
105-
| main.rs:102:10:102:10 | b | semmle.label | b |
106-
| main.rs:138:9:138:9 | a | semmle.label | a |
107-
| main.rs:138:13:138:21 | source(...) | semmle.label | source(...) |
108-
| main.rs:139:10:139:10 | a | semmle.label | a |
109-
| main.rs:148:13:148:13 | c | semmle.label | c |
110-
| main.rs:148:17:148:25 | source(...) | semmle.label | source(...) |
111-
| main.rs:149:14:149:14 | c | semmle.label | c |
112-
| main.rs:164:12:164:22 | ...: ... [Return] [&ref] | semmle.label | ...: ... [Return] [&ref] |
113-
| main.rs:164:25:164:30 | ...: i64 | semmle.label | ...: i64 |
114-
| main.rs:165:6:165:6 | [post] n [&ref] | semmle.label | [post] n [&ref] |
115-
| main.rs:165:10:165:10 | c | semmle.label | c |
116-
| main.rs:173:13:173:13 | [post] m [&ref] | semmle.label | [post] m [&ref] |
117-
| main.rs:173:16:173:25 | source(...) | semmle.label | source(...) |
118-
| main.rs:174:10:174:11 | * ... | semmle.label | * ... |
119-
| main.rs:174:11:174:11 | m [&ref] | semmle.label | m [&ref] |
99+
| main.rs:71:31:77:5 | { ... } | semmle.label | { ... } |
100+
| main.rs:75:13:75:21 | source(...) | semmle.label | source(...) |
101+
| main.rs:79:28:79:33 | ...: i64 | semmle.label | ...: i64 |
102+
| main.rs:79:43:85:5 | { ... } | semmle.label | { ... } |
103+
| main.rs:90:9:90:9 | a | semmle.label | a |
104+
| main.rs:90:13:90:25 | mn.get_data(...) | semmle.label | mn.get_data(...) |
105+
| main.rs:91:10:91:10 | a | semmle.label | a |
106+
| main.rs:96:9:96:9 | a | semmle.label | a |
107+
| main.rs:96:13:96:21 | source(...) | semmle.label | source(...) |
108+
| main.rs:97:16:97:16 | a | semmle.label | a |
109+
| main.rs:102:9:102:9 | a | semmle.label | a |
110+
| main.rs:102:13:102:21 | source(...) | semmle.label | source(...) |
111+
| main.rs:103:9:103:9 | b | semmle.label | b |
112+
| main.rs:103:13:103:30 | mn.data_through(...) | semmle.label | mn.data_through(...) |
113+
| main.rs:103:29:103:29 | a | semmle.label | a |
114+
| main.rs:104:10:104:10 | b | semmle.label | b |
115+
| main.rs:128:12:128:17 | ...: i64 | semmle.label | ...: i64 |
116+
| main.rs:128:28:130:5 | { ... } [MyInt] | semmle.label | { ... } [MyInt] |
117+
| main.rs:129:9:129:26 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] |
118+
| main.rs:129:24:129:24 | n | semmle.label | n |
119+
| main.rs:134:9:134:9 | n [MyInt] | semmle.label | n [MyInt] |
120+
| main.rs:134:13:134:34 | ...::new(...) [MyInt] | semmle.label | ...::new(...) [MyInt] |
121+
| main.rs:134:24:134:33 | source(...) | semmle.label | source(...) |
122+
| main.rs:135:9:135:26 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] |
123+
| main.rs:135:24:135:24 | m | semmle.label | m |
124+
| main.rs:136:10:136:10 | m | semmle.label | m |
125+
| main.rs:202:9:202:9 | a | semmle.label | a |
126+
| main.rs:202:13:202:21 | source(...) | semmle.label | source(...) |
127+
| main.rs:203:10:203:10 | a | semmle.label | a |
128+
| main.rs:212:13:212:13 | c | semmle.label | c |
129+
| main.rs:212:17:212:25 | source(...) | semmle.label | source(...) |
130+
| main.rs:213:14:213:14 | c | semmle.label | c |
131+
| main.rs:228:12:228:22 | ...: ... [Return] [&ref] | semmle.label | ...: ... [Return] [&ref] |
132+
| main.rs:228:25:228:30 | ...: i64 | semmle.label | ...: i64 |
133+
| main.rs:229:6:229:6 | [post] n [&ref] | semmle.label | [post] n [&ref] |
134+
| main.rs:229:10:229:10 | c | semmle.label | c |
135+
| main.rs:237:13:237:13 | [post] m [&ref] | semmle.label | [post] m [&ref] |
136+
| main.rs:237:16:237:25 | source(...) | semmle.label | source(...) |
137+
| main.rs:238:10:238:11 | * ... | semmle.label | * ... |
138+
| main.rs:238:11:238:11 | m [&ref] | semmle.label | m [&ref] |
120139
subpaths
121140
| main.rs:36:26:36:26 | a | main.rs:30:17:30:22 | ...: i64 | main.rs:30:32:32:1 | { ... } | main.rs:36:13:36:27 | pass_through(...) |
122141
| main.rs:41:26:44:5 | { ... } | main.rs:30:17:30:22 | ...: i64 | main.rs:30:32:32:1 | { ... } | main.rs:41:13:44:6 | pass_through(...) |
123142
| main.rs:55:26:55:26 | a | main.rs:51:21:51:26 | ...: i64 | main.rs:51:36:53:5 | { ... } | main.rs:55:13:55:27 | pass_through(...) |
124-
| main.rs:101:29:101:29 | a | main.rs:77:28:77:33 | ...: i64 | main.rs:77:43:83:5 | { ... } | main.rs:101:13:101:30 | mn.data_through(...) |
125-
| main.rs:173:16:173:25 | source(...) | main.rs:164:25:164:30 | ...: i64 | main.rs:164:12:164:22 | ...: ... [Return] [&ref] | main.rs:173:13:173:13 | [post] m [&ref] |
143+
| main.rs:103:29:103:29 | a | main.rs:79:28:79:33 | ...: i64 | main.rs:79:43:85:5 | { ... } | main.rs:103:13:103:30 | mn.data_through(...) |
144+
| main.rs:134:24:134:33 | source(...) | main.rs:128:12:128:17 | ...: i64 | main.rs:128:28:130:5 | { ... } [MyInt] | main.rs:134:13:134:34 | ...::new(...) [MyInt] |
145+
| main.rs:237:16:237:25 | source(...) | main.rs:228:25:228:30 | ...: i64 | main.rs:228:12:228:22 | ...: ... [Return] [&ref] | main.rs:237:13:237:13 | [post] m [&ref] |
126146
testFailures
127147
#select
128148
| main.rs:18:10:18:10 | a | main.rs:13:5:13:13 | source(...) | main.rs:18:10:18:10 | a | $@ | main.rs:13:5:13:13 | source(...) | source(...) |
129149
| main.rs:22:10:22:10 | n | main.rs:26:13:26:21 | source(...) | main.rs:22:10:22:10 | n | $@ | main.rs:26:13:26:21 | source(...) | source(...) |
130150
| main.rs:37:10:37:10 | b | main.rs:35:13:35:21 | source(...) | main.rs:37:10:37:10 | b | $@ | main.rs:35:13:35:21 | source(...) | source(...) |
131151
| main.rs:45:10:45:10 | a | main.rs:43:9:43:18 | source(...) | main.rs:45:10:45:10 | a | $@ | main.rs:43:9:43:18 | source(...) | source(...) |
132152
| main.rs:56:10:56:10 | b | main.rs:49:13:49:22 | source(...) | main.rs:56:10:56:10 | b | $@ | main.rs:49:13:49:22 | source(...) | source(...) |
133-
| main.rs:68:14:68:14 | n | main.rs:94:13:94:21 | source(...) | main.rs:68:14:68:14 | n | $@ | main.rs:94:13:94:21 | source(...) | source(...) |
134-
| main.rs:89:10:89:10 | a | main.rs:74:13:74:21 | source(...) | main.rs:89:10:89:10 | a | $@ | main.rs:74:13:74:21 | source(...) | source(...) |
135-
| main.rs:102:10:102:10 | b | main.rs:100:13:100:21 | source(...) | main.rs:102:10:102:10 | b | $@ | main.rs:100:13:100:21 | source(...) | source(...) |
136-
| main.rs:139:10:139:10 | a | main.rs:138:13:138:21 | source(...) | main.rs:139:10:139:10 | a | $@ | main.rs:138:13:138:21 | source(...) | source(...) |
137-
| main.rs:149:14:149:14 | c | main.rs:148:17:148:25 | source(...) | main.rs:149:14:149:14 | c | $@ | main.rs:148:17:148:25 | source(...) | source(...) |
138-
| main.rs:174:10:174:11 | * ... | main.rs:173:16:173:25 | source(...) | main.rs:174:10:174:11 | * ... | $@ | main.rs:173:16:173:25 | source(...) | source(...) |
153+
| main.rs:68:14:68:14 | n | main.rs:96:13:96:21 | source(...) | main.rs:68:14:68:14 | n | $@ | main.rs:96:13:96:21 | source(...) | source(...) |
154+
| main.rs:91:10:91:10 | a | main.rs:75:13:75:21 | source(...) | main.rs:91:10:91:10 | a | $@ | main.rs:75:13:75:21 | source(...) | source(...) |
155+
| main.rs:104:10:104:10 | b | main.rs:102:13:102:21 | source(...) | main.rs:104:10:104:10 | b | $@ | main.rs:102:13:102:21 | source(...) | source(...) |
156+
| main.rs:136:10:136:10 | m | main.rs:134:24:134:33 | source(...) | main.rs:136:10:136:10 | m | $@ | main.rs:134:24:134:33 | source(...) | source(...) |
157+
| main.rs:203:10:203:10 | a | main.rs:202:13:202:21 | source(...) | main.rs:203:10:203:10 | a | $@ | main.rs:202:13:202:21 | source(...) | source(...) |
158+
| main.rs:213:14:213:14 | c | main.rs:212:17:212:25 | source(...) | main.rs:213:14:213:14 | c | $@ | main.rs:212:17:212:25 | source(...) | source(...) |
159+
| main.rs:238:10:238:11 | * ... | main.rs:237:16:237:25 | source(...) | main.rs:238:10:238:11 | * ... | $@ | main.rs:237:16:237:25 | source(...) | source(...) |

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

+66-2
Original file line numberDiff line numberDiff line change
@@ -65,15 +65,17 @@ struct MyFlag {
6565

6666
impl MyFlag {
6767
fn data_in(&self, n: i64) {
68-
sink(n); // $ hasValueFlow=1
68+
sink(n); // $ hasValueFlow=1 MISSING: hasValueFlow=8
6969
}
70+
7071
fn get_data(&self) -> i64 {
7172
if self.flag {
7273
0
7374
} else {
7475
source(2)
7576
}
7677
}
78+
7779
fn data_through(&self, n: i64) -> i64 {
7880
if self.flag {
7981
0
@@ -102,12 +104,38 @@ fn data_through_method() {
102104
sink(b); // $ hasValueFlow=4
103105
}
104106

107+
fn data_in_to_method_called_as_function() {
108+
let mn = MyFlag { flag: true };
109+
let a = source(8);
110+
MyFlag::data_in(&mn, a);
111+
}
112+
113+
fn data_through_method_called_as_function() {
114+
let mn = MyFlag { flag: true };
115+
let a = source(12);
116+
let b = MyFlag::data_through(&mn, a);
117+
sink(b); // $ MISSING: hasValueFlow=12
118+
}
119+
105120
use std::ops::Add;
106121

107122
struct MyInt {
108123
value: i64,
109124
}
110125

126+
impl MyInt {
127+
// Associated function
128+
fn new(n: i64) -> Self {
129+
MyInt { value: n }
130+
}
131+
}
132+
133+
fn data_through_associated_function() {
134+
let n = MyInt::new(source(34));
135+
let MyInt { value: m } = n;
136+
sink(m); // $ hasValueFlow=34
137+
}
138+
111139
impl Add for MyInt {
112140
type Output = MyInt;
113141

@@ -117,7 +145,7 @@ impl Add for MyInt {
117145
}
118146
}
119147

120-
pub fn test_operator_overloading() {
148+
fn test_operator_overloading() {
121149
let a = MyInt { value: source(5) };
122150
let b = MyInt { value: 2 };
123151
let c = a + b;
@@ -132,6 +160,42 @@ pub fn test_operator_overloading() {
132160
let b = MyInt { value: 2 };
133161
let d = a.add(b);
134162
sink(d.value); // $ MISSING: hasValueFlow=7
163+
164+
}
165+
166+
trait MyTrait {
167+
type Output;
168+
fn take_self(self, _other: Self::Output) -> Self::Output;
169+
fn take_second(self, other: Self::Output) -> Self::Output;
170+
}
171+
172+
impl MyTrait for MyInt {
173+
type Output = MyInt;
174+
175+
fn take_self(self, _other: MyInt) -> MyInt {
176+
self
177+
}
178+
179+
fn take_second(self, other: MyInt) -> MyInt {
180+
other
181+
}
182+
}
183+
184+
fn data_through_trait_method_called_as_function() {
185+
let a = MyInt { value: source(8) };
186+
let b = MyInt { value: 2 };
187+
let MyInt { value: c } = MyTrait::take_self(a, b);
188+
sink(c); // $ MISSING: hasValueFlow=8
189+
190+
let a = MyInt { value: 0 };
191+
let b = MyInt { value: source(37) };
192+
let MyInt { value: c } = MyTrait::take_second(a, b);
193+
sink(c); // $ MISSING: hasValueFlow=37
194+
195+
let a = MyInt { value: 0 };
196+
let b = MyInt { value: source(38) };
197+
let MyInt { value: c } = MyTrait::take_self(a, b);
198+
sink(c);
135199
}
136200

137201
async fn async_source() -> i64 {

0 commit comments

Comments
 (0)