Skip to content

Commit e8357a6

Browse files
committed
Rust: Add additional data flow tests
1 parent 066cfa3 commit e8357a6

File tree

6 files changed

+132
-99
lines changed

6 files changed

+132
-99
lines changed
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
models
2+
edges
3+
| main.rs:11:20:11:52 | if cond {...} else {...} | main.rs:12:10:12:16 | f(...) | provenance | |
4+
| main.rs:11:30:11:39 | source(...) | main.rs:11:20:11:52 | if cond {...} else {...} | provenance | |
5+
| main.rs:16:20:16:23 | ... | main.rs:18:18:18:21 | data | provenance | |
6+
| main.rs:22:13:22:22 | source(...) | main.rs:23:13:23:13 | a | provenance | |
7+
| main.rs:23:13:23:13 | a | main.rs:16:20:16:23 | ... | provenance | |
8+
| main.rs:27:20:27:23 | ... | main.rs:28:9:32:9 | if cond {...} else {...} | provenance | |
9+
| main.rs:33:13:33:22 | source(...) | main.rs:34:21:34:21 | a | provenance | |
10+
| main.rs:34:13:34:22 | f(...) | main.rs:35:10:35:10 | b | provenance | |
11+
| main.rs:34:21:34:21 | a | main.rs:27:20:27:23 | ... | provenance | |
12+
| main.rs:34:21:34:21 | a | main.rs:34:13:34:22 | f(...) | provenance | |
13+
nodes
14+
| main.rs:11:20:11:52 | if cond {...} else {...} | semmle.label | if cond {...} else {...} |
15+
| main.rs:11:30:11:39 | source(...) | semmle.label | source(...) |
16+
| main.rs:12:10:12:16 | f(...) | semmle.label | f(...) |
17+
| main.rs:16:20:16:23 | ... | semmle.label | ... |
18+
| main.rs:18:18:18:21 | data | semmle.label | data |
19+
| main.rs:22:13:22:22 | source(...) | semmle.label | source(...) |
20+
| main.rs:23:13:23:13 | a | semmle.label | a |
21+
| main.rs:27:20:27:23 | ... | semmle.label | ... |
22+
| main.rs:28:9:32:9 | if cond {...} else {...} | semmle.label | if cond {...} else {...} |
23+
| main.rs:33:13:33:22 | source(...) | semmle.label | source(...) |
24+
| main.rs:34:13:34:22 | f(...) | semmle.label | f(...) |
25+
| main.rs:34:21:34:21 | a | semmle.label | a |
26+
| main.rs:35:10:35:10 | b | semmle.label | b |
27+
subpaths
28+
| main.rs:34:21:34:21 | a | main.rs:27:20:27:23 | ... | main.rs:28:9:32:9 | if cond {...} else {...} | main.rs:34:13:34:22 | f(...) |
29+
testFailures
30+
#select
31+
| main.rs:12:10:12:16 | f(...) | main.rs:11:30:11:39 | source(...) | main.rs:12:10:12:16 | f(...) | $@ | main.rs:11:30:11:39 | source(...) | source(...) |
32+
| main.rs:18:18:18:21 | data | main.rs:22:13:22:22 | source(...) | main.rs:18:18:18:21 | data | $@ | main.rs:22:13:22:22 | source(...) | source(...) |
33+
| main.rs:35:10:35:10 | b | main.rs:33:13:33:22 | source(...) | main.rs:35:10:35:10 | b | $@ | main.rs:33:13:33:22 | 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.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: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
fn source(i: i64) -> i64 {
2+
1000 + i
3+
}
4+
5+
fn sink(s: i64) {
6+
println!("{}", s);
7+
}
8+
9+
10+
fn closure_flow_out() {
11+
let f = |cond| if cond { source(92) } else { 0 };
12+
sink(f(true)); // $ hasValueFlow=92
13+
}
14+
15+
fn closure_flow_in() {
16+
let f = |cond, data|
17+
if cond {
18+
sink(data); // $ hasValueFlow=87
19+
} else {
20+
sink(0)
21+
};
22+
let a = source(87);
23+
f(true, a);
24+
}
25+
26+
fn closure_flow_through() {
27+
let f = |cond, data|
28+
if cond {
29+
data
30+
} else {
31+
0
32+
};
33+
let a = source(43);
34+
let b = f(true, a);
35+
sink(b); // $ hasValueFlow=43
36+
}
37+
38+
fn closure_captured_variable() {
39+
let mut capt = 1;
40+
sink(capt);
41+
let mut f = || {
42+
capt = source(73);
43+
};
44+
f();
45+
sink(capt); // $ MISSING: hasValueFlow=73
46+
let g = || {
47+
sink(capt); // $ MISSING: hasValueFlow=73
48+
};
49+
g();
50+
}
51+
52+
fn main() {
53+
closure_flow_out();
54+
closure_flow_in();
55+
closure_flow_through();
56+
closure_captured_variable();
57+
}

rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected

Lines changed: 15 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -427,51 +427,20 @@ localStep
427427
| main.rs:377:13:377:19 | [post] mut_arr | main.rs:379:10:379:16 | mut_arr |
428428
| main.rs:377:13:377:19 | mut_arr | main.rs:379:10:379:16 | mut_arr |
429429
| main.rs:377:13:377:22 | mut_arr[1] | main.rs:377:9:377:9 | d |
430-
| main.rs:383:9:383:9 | [SSA] f | main.rs:384:10:384:10 | f |
431-
| main.rs:383:9:383:9 | f | main.rs:383:9:383:9 | [SSA] f |
432-
| main.rs:383:13:383:52 | \|...\| ... | main.rs:383:9:383:9 | f |
433-
| main.rs:383:14:383:17 | ... | main.rs:383:14:383:17 | cond |
434-
| main.rs:383:14:383:17 | [SSA] cond | main.rs:383:23:383:26 | cond |
435-
| main.rs:383:14:383:17 | cond | main.rs:383:14:383:17 | [SSA] cond |
436-
| main.rs:383:28:383:41 | { ... } | main.rs:383:20:383:52 | if cond {...} else {...} |
437-
| main.rs:383:30:383:39 | source(...) | main.rs:383:28:383:41 | { ... } |
438-
| main.rs:383:48:383:52 | { ... } | main.rs:383:20:383:52 | if cond {...} else {...} |
439-
| main.rs:383:50:383:50 | 0 | main.rs:383:48:383:52 | { ... } |
440-
| main.rs:388:9:388:9 | [SSA] f | main.rs:395:5:395:5 | f |
441-
| main.rs:388:9:388:9 | f | main.rs:388:9:388:9 | [SSA] f |
442-
| main.rs:388:13:393:9 | \|...\| ... | main.rs:388:9:388:9 | f |
443-
| main.rs:388:14:388:17 | ... | main.rs:388:14:388:17 | cond |
444-
| main.rs:388:14:388:17 | [SSA] cond | main.rs:389:12:389:15 | cond |
445-
| main.rs:388:14:388:17 | cond | main.rs:388:14:388:17 | [SSA] cond |
446-
| main.rs:388:20:388:23 | ... | main.rs:388:20:388:23 | data |
447-
| main.rs:388:20:388:23 | [SSA] data | main.rs:390:18:390:21 | data |
448-
| main.rs:388:20:388:23 | data | main.rs:388:20:388:23 | [SSA] data |
449-
| main.rs:389:17:391:9 | { ... } | main.rs:389:9:393:9 | if cond {...} else {...} |
450-
| main.rs:391:16:393:9 | { ... } | main.rs:389:9:393:9 | if cond {...} else {...} |
451-
| main.rs:392:13:392:19 | sink(...) | main.rs:391:16:393:9 | { ... } |
452-
| main.rs:394:9:394:9 | [SSA] a | main.rs:395:13:395:13 | a |
453-
| main.rs:394:9:394:9 | a | main.rs:394:9:394:9 | [SSA] a |
454-
| main.rs:394:13:394:22 | source(...) | main.rs:394:9:394:9 | a |
455-
| main.rs:399:9:399:9 | [SSA] f | main.rs:406:13:406:13 | f |
456-
| main.rs:399:9:399:9 | f | main.rs:399:9:399:9 | [SSA] f |
457-
| main.rs:399:13:404:9 | \|...\| ... | main.rs:399:9:399:9 | f |
458-
| main.rs:399:14:399:17 | ... | main.rs:399:14:399:17 | cond |
459-
| main.rs:399:14:399:17 | [SSA] cond | main.rs:400:12:400:15 | cond |
460-
| main.rs:399:14:399:17 | cond | main.rs:399:14:399:17 | [SSA] cond |
461-
| main.rs:399:20:399:23 | ... | main.rs:399:20:399:23 | data |
462-
| main.rs:399:20:399:23 | [SSA] data | main.rs:401:13:401:16 | data |
463-
| main.rs:399:20:399:23 | data | main.rs:399:20:399:23 | [SSA] data |
464-
| main.rs:400:17:402:9 | { ... } | main.rs:400:9:404:9 | if cond {...} else {...} |
465-
| main.rs:401:13:401:16 | data | main.rs:400:17:402:9 | { ... } |
466-
| main.rs:402:16:404:9 | { ... } | main.rs:400:9:404:9 | if cond {...} else {...} |
467-
| main.rs:403:13:403:13 | 0 | main.rs:402:16:404:9 | { ... } |
468-
| main.rs:405:9:405:9 | [SSA] a | main.rs:406:21:406:21 | a |
469-
| main.rs:405:9:405:9 | a | main.rs:405:9:405:9 | [SSA] a |
470-
| main.rs:405:13:405:22 | source(...) | main.rs:405:9:405:9 | a |
471-
| main.rs:406:9:406:9 | [SSA] b | main.rs:407:10:407:10 | b |
472-
| main.rs:406:9:406:9 | b | main.rs:406:9:406:9 | [SSA] b |
473-
| main.rs:406:13:406:22 | f(...) | main.rs:406:9:406:9 | b |
474-
| main.rs:431:13:431:33 | result_questionmark(...) | main.rs:431:9:431:9 | _ |
430+
| main.rs:386:9:386:9 | a | main.rs:386:9:386:9 | [SSA] a |
431+
| main.rs:386:13:386:22 | source(...) | main.rs:386:9:386:9 | a |
432+
| main.rs:387:9:387:9 | [SSA] b | main.rs:388:14:388:14 | b |
433+
| main.rs:387:9:387:9 | b | main.rs:387:9:387:9 | [SSA] b |
434+
| main.rs:387:13:387:14 | &a | main.rs:387:9:387:9 | b |
435+
| main.rs:388:9:388:9 | [SSA] c | main.rs:389:10:389:10 | c |
436+
| main.rs:388:9:388:9 | c | main.rs:388:9:388:9 | [SSA] c |
437+
| main.rs:388:13:388:14 | * ... | main.rs:388:9:388:9 | c |
438+
| main.rs:393:17:393:17 | 1 | main.rs:393:9:393:13 | a |
439+
| main.rs:395:9:395:9 | [SSA] b | main.rs:396:6:396:6 | b |
440+
| main.rs:395:9:395:9 | b | main.rs:395:9:395:9 | [SSA] b |
441+
| main.rs:395:13:395:18 | &mut a | main.rs:395:9:395:9 | b |
442+
| main.rs:396:10:396:19 | source(...) | main.rs:396:5:396:6 | * ... |
443+
| main.rs:421:13:421:33 | result_questionmark(...) | main.rs:421:9:421:9 | _ |
475444
storeStep
476445
| main.rs:94:14:94:22 | source(...) | tuple.0 | main.rs:94:13:94:26 | TupleExpr |
477446
| main.rs:94:25:94:25 | 2 | tuple.1 | main.rs:94:13:94:26 | TupleExpr |
@@ -540,7 +509,7 @@ storeStep
540509
| main.rs:373:27:373:27 | 2 | array[] | main.rs:373:23:373:31 | [...] |
541510
| main.rs:373:30:373:30 | 3 | array[] | main.rs:373:23:373:31 | [...] |
542511
| main.rs:376:18:376:27 | source(...) | array[] | main.rs:376:5:376:11 | [post] mut_arr |
543-
| main.rs:414:27:414:27 | 0 | Some | main.rs:414:22:414:28 | Some(...) |
512+
| main.rs:404:27:404:27 | 0 | Some | main.rs:404:22:404:28 | Some(...) |
544513
readStep
545514
| file://:0:0:0:0 | [summary param] self in lang:core::_::<crate::option::Option>::unwrap | Some | file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::option::Option::Some(0)] in lang:core::_::<crate::option::Option>::unwrap |
546515
| main.rs:33:9:33:15 | Some(...) | Some | main.rs:33:14:33:14 | _ |

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

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -99,16 +99,6 @@ edges
9999
| main.rs:377:13:377:19 | mut_arr [array[]] | main.rs:377:13:377:22 | mut_arr[1] | provenance | |
100100
| main.rs:377:13:377:22 | mut_arr[1] | main.rs:378:10:378:10 | d | provenance | |
101101
| main.rs:379:10:379:16 | mut_arr [array[]] | main.rs:379:10:379:19 | mut_arr[0] | provenance | |
102-
| main.rs:383:20:383:52 | if cond {...} else {...} | main.rs:384:10:384:16 | f(...) | provenance | |
103-
| main.rs:383:30:383:39 | source(...) | main.rs:383:20:383:52 | if cond {...} else {...} | provenance | |
104-
| main.rs:388:20:388:23 | ... | main.rs:390:18:390:21 | data | provenance | |
105-
| main.rs:394:13:394:22 | source(...) | main.rs:395:13:395:13 | a | provenance | |
106-
| main.rs:395:13:395:13 | a | main.rs:388:20:388:23 | ... | provenance | |
107-
| main.rs:399:20:399:23 | ... | main.rs:400:9:404:9 | if cond {...} else {...} | provenance | |
108-
| main.rs:405:13:405:22 | source(...) | main.rs:406:21:406:21 | a | provenance | |
109-
| main.rs:406:13:406:22 | f(...) | main.rs:407:10:407:10 | b | provenance | |
110-
| main.rs:406:21:406:21 | a | main.rs:399:20:399:23 | ... | provenance | |
111-
| main.rs:406:21:406:21 | a | main.rs:406:13:406:22 | f(...) | provenance | |
112102
nodes
113103
| main.rs:15:10:15:18 | source(...) | semmle.label | source(...) |
114104
| main.rs:19:13:19:21 | source(...) | semmle.label | source(...) |
@@ -233,21 +223,7 @@ nodes
233223
| main.rs:378:10:378:10 | d | semmle.label | d |
234224
| main.rs:379:10:379:16 | mut_arr [array[]] | semmle.label | mut_arr [array[]] |
235225
| main.rs:379:10:379:19 | mut_arr[0] | semmle.label | mut_arr[0] |
236-
| main.rs:383:20:383:52 | if cond {...} else {...} | semmle.label | if cond {...} else {...} |
237-
| main.rs:383:30:383:39 | source(...) | semmle.label | source(...) |
238-
| main.rs:384:10:384:16 | f(...) | semmle.label | f(...) |
239-
| main.rs:388:20:388:23 | ... | semmle.label | ... |
240-
| main.rs:390:18:390:21 | data | semmle.label | data |
241-
| main.rs:394:13:394:22 | source(...) | semmle.label | source(...) |
242-
| main.rs:395:13:395:13 | a | semmle.label | a |
243-
| main.rs:399:20:399:23 | ... | semmle.label | ... |
244-
| main.rs:400:9:404:9 | if cond {...} else {...} | semmle.label | if cond {...} else {...} |
245-
| main.rs:405:13:405:22 | source(...) | semmle.label | source(...) |
246-
| main.rs:406:13:406:22 | f(...) | semmle.label | f(...) |
247-
| main.rs:406:21:406:21 | a | semmle.label | a |
248-
| main.rs:407:10:407:10 | b | semmle.label | b |
249226
subpaths
250-
| main.rs:406:21:406:21 | a | main.rs:399:20:399:23 | ... | main.rs:400:9:404:9 | if cond {...} else {...} | main.rs:406:13:406:22 | f(...) |
251227
testFailures
252228
#select
253229
| main.rs:15:10:15:18 | source(...) | main.rs:15:10:15:18 | source(...) | main.rs:15:10:15:18 | source(...) | $@ | main.rs:15:10:15:18 | source(...) | source(...) |
@@ -282,6 +258,3 @@ testFailures
282258
| main.rs:367:18:367:18 | c | main.rs:362:23:362:32 | source(...) | main.rs:367:18:367:18 | c | $@ | main.rs:362:23:362:32 | source(...) | source(...) |
283259
| main.rs:378:10:378:10 | d | main.rs:376:18:376:27 | source(...) | main.rs:378:10:378:10 | d | $@ | main.rs:376:18:376:27 | source(...) | source(...) |
284260
| main.rs:379:10:379:19 | mut_arr[0] | main.rs:376:18:376:27 | source(...) | main.rs:379:10:379:19 | mut_arr[0] | $@ | main.rs:376:18:376:27 | source(...) | source(...) |
285-
| main.rs:384:10:384:16 | f(...) | main.rs:383:30:383:39 | source(...) | main.rs:384:10:384:16 | f(...) | $@ | main.rs:383:30:383:39 | source(...) | source(...) |
286-
| main.rs:390:18:390:21 | data | main.rs:394:13:394:22 | source(...) | main.rs:390:18:390:21 | data | $@ | main.rs:394:13:394:22 | source(...) | source(...) |
287-
| main.rs:407:10:407:10 | b | main.rs:405:13:405:22 | source(...) | main.rs:407:10:407:10 | b | $@ | main.rs:405:13:405:22 | source(...) | source(...) |

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

Lines changed: 15 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -379,32 +379,22 @@ fn array_assignment() {
379379
sink(mut_arr[0]); // $ SPURIOUS: hasValueFlow=55
380380
}
381381

382-
fn closure_flow_out() {
383-
let f = |cond| if cond { source(92) } else { 0 };
384-
sink(f(true)); // $ hasValueFlow=92
385-
}
382+
// -----------------------------------------------------------------------------
383+
// Data flow through mutable borrows
386384

387-
fn closure_flow_in() {
388-
let f = |cond, data|
389-
if cond {
390-
sink(data); // $ hasValueFlow=87
391-
} else {
392-
sink(0)
393-
};
394-
let a = source(87);
395-
f(true, a);
385+
fn read_through_borrow() {
386+
let a = source(21);
387+
let b = &a;
388+
let c = *b;
389+
sink(c); // $ MISSING: hasValueFlow=21
396390
}
397391

398-
fn closure_flow_through() {
399-
let f = |cond, data|
400-
if cond {
401-
data
402-
} else {
403-
0
404-
};
405-
let a = source(43);
406-
let b = f(true, a);
407-
sink(b); // $ hasValueFlow=43
392+
fn write_through_borrow() {
393+
let mut a = 1;
394+
sink(a);
395+
let b = &mut a;
396+
*b = source(39);
397+
sink(a); // $ MISSING: hasValueFlow=39
408398
}
409399

410400
fn main() {
@@ -440,7 +430,6 @@ fn main() {
440430
array_for_loop();
441431
array_slice_pattern();
442432
array_assignment();
443-
closure_flow_out();
444-
closure_flow_in();
445-
closure_flow_through();
433+
read_through_borrow();
434+
write_through_borrow();
446435
}

0 commit comments

Comments
 (0)