Skip to content

Commit f1c23e4

Browse files
committed
Rust: Add data flow test cases.
1 parent e850a8a commit f1c23e4

File tree

5 files changed

+305
-159
lines changed

5 files changed

+305
-159
lines changed

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

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -929,9 +929,36 @@ localStep
929929
| main.rs:575:10:575:10 | [post] receiver for b | main.rs:575:10:575:10 | [post] b |
930930
| main.rs:575:10:575:10 | b | main.rs:575:10:575:10 | receiver for b |
931931
| main.rs:575:10:575:10 | b | main.rs:576:20:576:20 | b |
932-
| main.rs:604:13:604:33 | result_questionmark(...) | main.rs:604:9:604:9 | _ |
933-
| main.rs:616:36:616:39 | ...::new(...) | main.rs:616:36:616:41 | MacroExpr |
934-
| main.rs:616:36:616:41 | [post] MacroExpr | main.rs:616:36:616:39 | [post] ...::new(...) |
932+
| main.rs:578:9:578:9 | [SSA] c | main.rs:579:10:579:10 | c |
933+
| main.rs:578:9:578:9 | c | main.rs:578:9:578:9 | [SSA] c |
934+
| main.rs:578:9:578:9 | c | main.rs:578:9:578:9 | c |
935+
| main.rs:578:19:578:56 | ...::from_u32(...) | main.rs:578:19:578:56 | receiver for ...::from_u32(...) |
936+
| main.rs:578:19:578:56 | [post] receiver for ...::from_u32(...) | main.rs:578:19:578:56 | [post] ...::from_u32(...) |
937+
| main.rs:578:19:578:65 | ... .unwrap() | main.rs:578:9:578:9 | c |
938+
| main.rs:583:9:583:9 | [SSA] a | main.rs:585:10:585:10 | a |
939+
| main.rs:583:9:583:9 | a | main.rs:583:9:583:9 | [SSA] a |
940+
| main.rs:583:9:583:9 | a | main.rs:583:9:583:9 | a |
941+
| main.rs:583:13:583:22 | source(...) | main.rs:583:9:583:9 | a |
942+
| main.rs:585:10:585:10 | [post] a | main.rs:589:19:589:19 | a |
943+
| main.rs:585:10:585:10 | [post] receiver for a | main.rs:585:10:585:10 | [post] a |
944+
| main.rs:585:10:585:10 | a | main.rs:585:10:585:10 | receiver for a |
945+
| main.rs:585:10:585:10 | a | main.rs:589:19:589:19 | a |
946+
| main.rs:587:9:587:13 | mut b | main.rs:587:13:587:13 | b |
947+
| main.rs:587:13:587:13 | [SSA] b | main.rs:588:10:588:10 | b |
948+
| main.rs:587:13:587:13 | b | main.rs:587:13:587:13 | [SSA] b |
949+
| main.rs:587:22:587:22 | 0 | main.rs:587:9:587:13 | mut b |
950+
| main.rs:588:10:588:10 | [post] b | main.rs:589:5:589:5 | [SSA] b |
951+
| main.rs:588:10:588:10 | [post] b | main.rs:589:5:589:5 | b |
952+
| main.rs:588:10:588:10 | b | main.rs:589:5:589:5 | [SSA] b |
953+
| main.rs:588:10:588:10 | b | main.rs:589:5:589:5 | b |
954+
| main.rs:589:5:589:5 | [SSA] b | main.rs:590:10:590:10 | b |
955+
| main.rs:589:5:589:5 | [post] b | main.rs:590:10:590:10 | b |
956+
| main.rs:589:5:589:5 | [post] receiver for b | main.rs:589:5:589:5 | [post] b |
957+
| main.rs:589:5:589:5 | b | main.rs:589:5:589:5 | receiver for b |
958+
| main.rs:589:5:589:5 | b | main.rs:590:10:590:10 | b |
959+
| main.rs:618:13:618:33 | result_questionmark(...) | main.rs:618:9:618:9 | _ |
960+
| main.rs:630:36:630:39 | ...::new(...) | main.rs:630:36:630:41 | MacroExpr |
961+
| main.rs:630:36:630:41 | [post] MacroExpr | main.rs:630:36:630:39 | [post] ...::new(...) |
935962
readStep
936963
| main.rs:50:9:50:15 | Some(...) | {EXTERNAL LOCATION} | Some | main.rs:50:14:50:14 | _ |
937964
| main.rs:116:11:116:11 | [post] receiver for i | file://:0:0:0:0 | &ref | main.rs:116:11:116:11 | [post] i |
@@ -1058,6 +1085,8 @@ readStep
10581085
| main.rs:548:19:548:35 | vs_mut.iter_mut() | file://:0:0:0:0 | element | main.rs:548:9:548:14 | &mut ... |
10591086
| main.rs:562:11:562:15 | [post] receiver for c_ref | file://:0:0:0:0 | &ref | main.rs:562:11:562:15 | [post] c_ref |
10601087
| main.rs:562:11:562:15 | c_ref | file://:0:0:0:0 | &ref | main.rs:562:10:562:15 | * ... |
1088+
| main.rs:585:10:585:10 | [post] receiver for a | file://:0:0:0:0 | &ref | main.rs:585:10:585:10 | [post] a |
1089+
| main.rs:589:5:589:5 | [post] receiver for b | file://:0:0:0:0 | &ref | main.rs:589:5:589:5 | [post] b |
10611090
storeStep
10621091
| main.rs:116:11:116:11 | i | file://:0:0:0:0 | &ref | main.rs:116:11:116:11 | receiver for i |
10631092
| main.rs:123:14:123:22 | source(...) | file://:0:0:0:0 | tuple.0 | main.rs:123:13:123:26 | TupleExpr |
@@ -1160,4 +1189,7 @@ storeStep
11601189
| main.rs:557:18:557:18 | c | file://:0:0:0:0 | &ref | main.rs:557:17:557:18 | &c |
11611190
| main.rs:560:15:560:15 | b | file://:0:0:0:0 | &ref | main.rs:560:14:560:15 | &b |
11621191
| main.rs:562:11:562:15 | c_ref | file://:0:0:0:0 | &ref | main.rs:562:11:562:15 | receiver for c_ref |
1163-
| main.rs:583:27:583:27 | 0 | {EXTERNAL LOCATION} | Some | main.rs:583:22:583:28 | Some(...) |
1192+
| main.rs:585:10:585:10 | a | file://:0:0:0:0 | &ref | main.rs:585:10:585:10 | receiver for a |
1193+
| main.rs:589:5:589:5 | b | file://:0:0:0:0 | &ref | main.rs:589:5:589:5 | receiver for b |
1194+
| main.rs:589:19:589:19 | a | file://:0:0:0:0 | &ref | main.rs:589:18:589:19 | &a |
1195+
| main.rs:597:27:597:27 | 0 | {EXTERNAL LOCATION} | Some | main.rs:597:22:597:28 | Some(...) |

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

Lines changed: 33 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
models
2-
| 1 | Summary: <alloc::boxed::Box>::new; Argument[0]; ReturnValue.Reference; value |
3-
| 2 | Summary: <core::option::Option>::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value |
4-
| 3 | Summary: <core::option::Option>::unwrap_or; Argument[0]; ReturnValue; value |
5-
| 4 | Summary: <core::option::Option>::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value |
6-
| 5 | Summary: <core::option::Option>::unwrap_or_else; Argument[0].ReturnValue; ReturnValue; value |
7-
| 6 | Summary: <core::option::Option>::unwrap_or_else; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value |
8-
| 7 | Summary: <core::result::Result>::err; Argument[self].Field[core::result::Result::Err(0)]; ReturnValue.Field[core::option::Option::Some(0)]; value |
9-
| 8 | Summary: <core::result::Result>::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value |
10-
| 9 | Summary: <core::result::Result>::expect_err; Argument[self].Field[core::result::Result::Err(0)]; ReturnValue; value |
11-
| 10 | Summary: <core::result::Result>::ok; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue.Field[core::option::Option::Some(0)]; value |
2+
| 1 | Summary: <_ as core::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value |
3+
| 2 | Summary: <alloc::boxed::Box>::new; Argument[0]; ReturnValue.Reference; value |
4+
| 3 | Summary: <core::i64 as core::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value |
5+
| 4 | Summary: <core::option::Option>::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value |
6+
| 5 | Summary: <core::option::Option>::unwrap_or; Argument[0]; ReturnValue; value |
7+
| 6 | Summary: <core::option::Option>::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value |
8+
| 7 | Summary: <core::option::Option>::unwrap_or_else; Argument[0].ReturnValue; ReturnValue; value |
9+
| 8 | Summary: <core::option::Option>::unwrap_or_else; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value |
10+
| 9 | Summary: <core::result::Result>::err; Argument[self].Field[core::result::Result::Err(0)]; ReturnValue.Field[core::option::Option::Some(0)]; value |
11+
| 10 | Summary: <core::result::Result>::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value |
12+
| 11 | Summary: <core::result::Result>::expect_err; Argument[self].Field[core::result::Result::Err(0)]; ReturnValue; value |
13+
| 12 | Summary: <core::result::Result>::ok; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue.Field[core::option::Option::Some(0)]; value |
1214
edges
1315
| main.rs:23:9:23:9 | s | main.rs:24:10:24:10 | s | provenance | |
1416
| main.rs:23:9:23:9 | s | main.rs:26:12:26:12 | x | provenance | |
@@ -36,7 +38,7 @@ edges
3638
| main.rs:82:5:82:5 | l | main.rs:83:10:83:10 | l | provenance | |
3739
| main.rs:115:9:115:9 | i [&ref] | main.rs:116:11:116:11 | i [&ref] | provenance | |
3840
| main.rs:115:13:115:31 | ...::new(...) [&ref] | main.rs:115:9:115:9 | i [&ref] | provenance | |
39-
| main.rs:115:22:115:30 | source(...) | main.rs:115:13:115:31 | ...::new(...) [&ref] | provenance | MaD:1 |
41+
| main.rs:115:22:115:30 | source(...) | main.rs:115:13:115:31 | ...::new(...) [&ref] | provenance | MaD:2 |
4042
| main.rs:116:11:116:11 | i [&ref] | main.rs:116:10:116:11 | * ... | provenance | |
4143
| main.rs:123:9:123:9 | a [tuple.0] | main.rs:124:10:124:10 | a [tuple.0] | provenance | |
4244
| main.rs:123:13:123:26 | TupleExpr [tuple.0] | main.rs:123:9:123:9 | a [tuple.0] | provenance | |
@@ -117,43 +119,43 @@ edges
117119
| main.rs:267:12:267:18 | Some(...) [Some] | main.rs:267:17:267:17 | n | provenance | |
118120
| main.rs:267:17:267:17 | n | main.rs:269:18:269:18 | n | provenance | |
119121
| main.rs:267:17:267:17 | n | main.rs:273:14:273:14 | n | provenance | |
120-
| main.rs:278:9:278:10 | s1 [Some] | main.rs:279:10:279:20 | s1.unwrap() | provenance | MaD:2 |
122+
| main.rs:278:9:278:10 | s1 [Some] | main.rs:279:10:279:20 | s1.unwrap() | provenance | MaD:4 |
121123
| main.rs:278:14:278:29 | Some(...) [Some] | main.rs:278:9:278:10 | s1 [Some] | provenance | |
122124
| main.rs:278:19:278:28 | source(...) | main.rs:278:14:278:29 | Some(...) [Some] | provenance | |
123-
| main.rs:283:9:283:10 | s1 [Some] | main.rs:284:10:284:24 | s1.unwrap_or(...) | provenance | MaD:4 |
125+
| main.rs:283:9:283:10 | s1 [Some] | main.rs:284:10:284:24 | s1.unwrap_or(...) | provenance | MaD:6 |
124126
| main.rs:283:14:283:29 | Some(...) [Some] | main.rs:283:9:283:10 | s1 [Some] | provenance | |
125127
| main.rs:283:19:283:28 | source(...) | main.rs:283:14:283:29 | Some(...) [Some] | provenance | |
126-
| main.rs:287:23:287:32 | source(...) | main.rs:287:10:287:33 | s2.unwrap_or(...) | provenance | MaD:3 |
127-
| main.rs:291:9:291:10 | s1 [Some] | main.rs:292:10:292:32 | s1.unwrap_or_else(...) | provenance | MaD:6 |
128+
| main.rs:287:23:287:32 | source(...) | main.rs:287:10:287:33 | s2.unwrap_or(...) | provenance | MaD:5 |
129+
| main.rs:291:9:291:10 | s1 [Some] | main.rs:292:10:292:32 | s1.unwrap_or_else(...) | provenance | MaD:8 |
128130
| main.rs:291:14:291:29 | Some(...) [Some] | main.rs:291:9:291:10 | s1 [Some] | provenance | |
129131
| main.rs:291:19:291:28 | source(...) | main.rs:291:14:291:29 | Some(...) [Some] | provenance | |
130-
| main.rs:295:31:295:40 | source(...) | main.rs:295:10:295:41 | s2.unwrap_or_else(...) | provenance | MaD:5 |
132+
| main.rs:295:31:295:40 | source(...) | main.rs:295:10:295:41 | s2.unwrap_or_else(...) | provenance | MaD:7 |
131133
| main.rs:299:9:299:10 | s1 [Some] | main.rs:301:14:301:15 | s1 [Some] | provenance | |
132134
| main.rs:299:14:299:29 | Some(...) [Some] | main.rs:299:9:299:10 | s1 [Some] | provenance | |
133135
| main.rs:299:19:299:28 | source(...) | main.rs:299:14:299:29 | Some(...) [Some] | provenance | |
134136
| main.rs:301:9:301:10 | i1 | main.rs:302:10:302:11 | i1 | provenance | |
135137
| main.rs:301:14:301:15 | s1 [Some] | main.rs:301:14:301:16 | TryExpr | provenance | |
136138
| main.rs:301:14:301:16 | TryExpr | main.rs:301:9:301:10 | i1 | provenance | |
137-
| main.rs:308:9:308:10 | r1 [Ok] | main.rs:309:28:309:34 | r1.ok() [Some] | provenance | MaD:10 |
139+
| main.rs:308:9:308:10 | r1 [Ok] | main.rs:309:28:309:34 | r1.ok() [Some] | provenance | MaD:12 |
138140
| main.rs:308:32:308:45 | Ok(...) [Ok] | main.rs:308:9:308:10 | r1 [Ok] | provenance | |
139141
| main.rs:308:35:308:44 | source(...) | main.rs:308:32:308:45 | Ok(...) [Ok] | provenance | |
140-
| main.rs:309:9:309:11 | o1a [Some] | main.rs:311:10:311:21 | o1a.unwrap() | provenance | MaD:2 |
142+
| main.rs:309:9:309:11 | o1a [Some] | main.rs:311:10:311:21 | o1a.unwrap() | provenance | MaD:4 |
141143
| main.rs:309:28:309:34 | r1.ok() [Some] | main.rs:309:9:309:11 | o1a [Some] | provenance | |
142-
| main.rs:314:9:314:10 | r2 [Err] | main.rs:316:28:316:35 | r2.err() [Some] | provenance | MaD:7 |
144+
| main.rs:314:9:314:10 | r2 [Err] | main.rs:316:28:316:35 | r2.err() [Some] | provenance | MaD:9 |
143145
| main.rs:314:32:314:46 | Err(...) [Err] | main.rs:314:9:314:10 | r2 [Err] | provenance | |
144146
| main.rs:314:36:314:45 | source(...) | main.rs:314:32:314:46 | Err(...) [Err] | provenance | |
145-
| main.rs:316:9:316:11 | o2b [Some] | main.rs:318:10:318:21 | o2b.unwrap() | provenance | MaD:2 |
147+
| main.rs:316:9:316:11 | o2b [Some] | main.rs:318:10:318:21 | o2b.unwrap() | provenance | MaD:4 |
146148
| main.rs:316:28:316:35 | r2.err() [Some] | main.rs:316:9:316:11 | o2b [Some] | provenance | |
147149
| main.rs:322:9:322:10 | s1 [Ok] | main.rs:325:14:325:15 | s1 [Ok] | provenance | |
148150
| main.rs:322:32:322:45 | Ok(...) [Ok] | main.rs:322:9:322:10 | s1 [Ok] | provenance | |
149151
| main.rs:322:35:322:44 | source(...) | main.rs:322:32:322:45 | Ok(...) [Ok] | provenance | |
150152
| main.rs:325:9:325:10 | i1 | main.rs:327:10:327:11 | i1 | provenance | |
151153
| main.rs:325:14:325:15 | s1 [Ok] | main.rs:325:14:325:16 | TryExpr | provenance | |
152154
| main.rs:325:14:325:16 | TryExpr | main.rs:325:9:325:10 | i1 | provenance | |
153-
| main.rs:335:9:335:10 | s1 [Ok] | main.rs:336:10:336:22 | s1.expect(...) | provenance | MaD:8 |
155+
| main.rs:335:9:335:10 | s1 [Ok] | main.rs:336:10:336:22 | s1.expect(...) | provenance | MaD:10 |
154156
| main.rs:335:32:335:45 | Ok(...) [Ok] | main.rs:335:9:335:10 | s1 [Ok] | provenance | |
155157
| main.rs:335:35:335:44 | source(...) | main.rs:335:32:335:45 | Ok(...) [Ok] | provenance | |
156-
| main.rs:339:9:339:10 | s2 [Err] | main.rs:341:10:341:26 | s2.expect_err(...) | provenance | MaD:9 |
158+
| main.rs:339:9:339:10 | s2 [Err] | main.rs:341:10:341:26 | s2.expect_err(...) | provenance | MaD:11 |
157159
| main.rs:339:32:339:46 | Err(...) [Err] | main.rs:339:9:339:10 | s2 [Err] | provenance | |
158160
| main.rs:339:36:339:45 | source(...) | main.rs:339:32:339:46 | Err(...) [Err] | provenance | |
159161
| main.rs:350:9:350:10 | s1 [A] | main.rs:352:11:352:12 | s1 [A] | provenance | |
@@ -253,6 +255,10 @@ edges
253255
| main.rs:557:17:557:18 | &c [&ref] | main.rs:557:9:557:13 | c_ref [&ref] | provenance | |
254256
| main.rs:557:18:557:18 | c | main.rs:557:17:557:18 | &c [&ref] | provenance | |
255257
| main.rs:562:11:562:15 | c_ref [&ref] | main.rs:562:10:562:15 | * ... | provenance | |
258+
| main.rs:583:9:583:9 | a | main.rs:585:10:585:10 | a | provenance | |
259+
| main.rs:583:13:583:22 | source(...) | main.rs:583:9:583:9 | a | provenance | |
260+
| main.rs:585:10:585:10 | a | main.rs:585:10:585:18 | a.clone() | provenance | MaD:1 |
261+
| main.rs:585:10:585:10 | a | main.rs:585:10:585:18 | a.clone() | provenance | MaD:3 |
256262
nodes
257263
| main.rs:19:10:19:18 | source(...) | semmle.label | source(...) |
258264
| main.rs:23:9:23:9 | s | semmle.label | s |
@@ -546,6 +552,10 @@ nodes
546552
| main.rs:559:10:559:10 | a | semmle.label | a |
547553
| main.rs:562:10:562:15 | * ... | semmle.label | * ... |
548554
| main.rs:562:11:562:15 | c_ref [&ref] | semmle.label | c_ref [&ref] |
555+
| main.rs:583:9:583:9 | a | semmle.label | a |
556+
| main.rs:583:13:583:22 | source(...) | semmle.label | source(...) |
557+
| main.rs:585:10:585:10 | a | semmle.label | a |
558+
| main.rs:585:10:585:18 | a.clone() | semmle.label | a.clone() |
549559
subpaths
550560
testFailures
551561
#select
@@ -612,3 +622,4 @@ testFailures
612622
| main.rs:544:10:544:18 | vs_mut[0] | main.rs:542:23:542:32 | source(...) | main.rs:544:10:544:18 | vs_mut[0] | $@ | main.rs:542:23:542:32 | source(...) | source(...) |
613623
| main.rs:559:10:559:10 | a | main.rs:554:13:554:22 | source(...) | main.rs:559:10:559:10 | a | $@ | main.rs:554:13:554:22 | source(...) | source(...) |
614624
| main.rs:562:10:562:15 | * ... | main.rs:556:13:556:22 | source(...) | main.rs:562:10:562:15 | * ... | $@ | main.rs:556:13:556:22 | source(...) | source(...) |
625+
| main.rs:585:10:585:18 | a.clone() | main.rs:583:13:583:22 | source(...) | main.rs:585:10:585:18 | a.clone() | $@ | main.rs:583:13:583:22 | source(...) | source(...) |

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -574,6 +574,20 @@ fn conversions() {
574574
sink(b as i64); // $ hasTaintFlow=51
575575
sink(b.into()); // $ MISSING: hasTaintFlow=51
576576
sink(i64::from(b)); // $ hasTaintFlow=51
577+
578+
let c: char = std::char::from_u32(source(52) as u32).unwrap();
579+
sink(c as i64); // $ MISSING: hasTaintFlow=52
580+
}
581+
582+
fn clone() {
583+
let a = source(60);
584+
585+
sink(a.clone()); // $ hasValueFlow=60
586+
587+
let mut b: i64 = 0;
588+
sink(b);
589+
b.clone_from(&a);
590+
sink(b); // $ MISSING: hasValueFlow=60
577591
}
578592

579593
fn main() {
@@ -619,4 +633,5 @@ fn main() {
619633
iterators();
620634
references();
621635
conversions();
636+
clone();
622637
}

0 commit comments

Comments
 (0)