Skip to content

Commit 9da5d71

Browse files
committed
Rust: Add test with data flow inconsistency
1 parent 1d8e7fd commit 9da5d71

File tree

3 files changed

+43
-2
lines changed

3 files changed

+43
-2
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
identityLocalStep
2+
| main.rs:404:7:404:18 | phi(default_name) | Node steps to itself |

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

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -440,7 +440,28 @@ localStep
440440
| main.rs:395:9:395:9 | b | main.rs:395:9:395:9 | [SSA] b |
441441
| main.rs:395:13:395:18 | &mut a | main.rs:395:9:395:9 | b |
442442
| 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 | _ |
443+
| main.rs:402:39:402:43 | [SSA] names | main.rs:404:23:404:27 | names |
444+
| main.rs:402:39:402:43 | names | main.rs:402:39:402:43 | [SSA] names |
445+
| main.rs:402:39:402:72 | ...: Vec::<...> | main.rs:402:39:402:43 | names |
446+
| main.rs:403:7:403:18 | [SSA] default_name | main.rs:404:23:404:27 | [SSA] [input] SSA phi read(default_name) |
447+
| main.rs:403:7:403:18 | default_name | main.rs:403:7:403:18 | [SSA] default_name |
448+
| main.rs:403:22:403:43 | ... .to_string(...) | main.rs:403:7:403:18 | default_name |
449+
| main.rs:404:3:410:3 | for ... in ... { ... } | main.rs:402:75:411:1 | { ... } |
450+
| main.rs:404:7:404:18 | [SSA] SSA phi read(default_name) | main.rs:404:29:410:3 | [SSA] [input] SSA phi read(default_name) |
451+
| main.rs:404:7:404:18 | [SSA] SSA phi read(default_name) | main.rs:408:7:408:14 | [SSA] [input] SSA phi read(default_name) |
452+
| main.rs:404:8:404:11 | [SSA] cond | main.rs:405:8:405:11 | cond |
453+
| main.rs:404:8:404:11 | cond | main.rs:404:8:404:11 | [SSA] cond |
454+
| main.rs:404:14:404:17 | [SSA] name | main.rs:406:15:406:18 | name |
455+
| main.rs:404:14:404:17 | name | main.rs:404:14:404:17 | [SSA] name |
456+
| main.rs:404:23:404:27 | [SSA] [input] SSA phi read(default_name) | main.rs:404:7:404:18 | [SSA] SSA phi read(default_name) |
457+
| main.rs:404:29:410:3 | [SSA] [input] SSA phi read(default_name) | main.rs:404:7:404:18 | [SSA] SSA phi read(default_name) |
458+
| main.rs:405:5:409:5 | if cond {...} | main.rs:404:29:410:3 | { ... } |
459+
| main.rs:406:11:406:11 | [SSA] n | main.rs:407:12:407:12 | n |
460+
| main.rs:406:11:406:11 | n | main.rs:406:11:406:11 | [SSA] n |
461+
| main.rs:406:15:406:62 | name.unwrap_or_else(...) | main.rs:406:11:406:11 | n |
462+
| main.rs:406:35:406:61 | [SSA] <captured entry> default_name | main.rs:406:38:406:49 | default_name |
463+
| main.rs:408:7:408:14 | [SSA] [input] SSA phi read(default_name) | main.rs:404:7:404:18 | [SSA] SSA phi read(default_name) |
464+
| main.rs:434:13:434:33 | result_questionmark(...) | main.rs:434:9:434:9 | _ |
444465
storeStep
445466
| main.rs:94:14:94:22 | source(...) | tuple.0 | main.rs:94:13:94:26 | TupleExpr |
446467
| main.rs:94:25:94:25 | 2 | tuple.1 | main.rs:94:13:94:26 | TupleExpr |
@@ -509,7 +530,8 @@ storeStep
509530
| main.rs:373:27:373:27 | 2 | array[] | main.rs:373:23:373:31 | [...] |
510531
| main.rs:373:30:373:30 | 3 | array[] | main.rs:373:23:373:31 | [...] |
511532
| main.rs:376:18:376:27 | source(...) | array[] | main.rs:376:5:376:11 | [post] mut_arr |
512-
| main.rs:404:27:404:27 | 0 | Some | main.rs:404:22:404:28 | Some(...) |
533+
| main.rs:406:35:406:61 | default_name | captured default_name | main.rs:406:35:406:61 | \|...\| ... |
534+
| main.rs:417:27:417:27 | 0 | Some | main.rs:417:22:417:28 | Some(...) |
513535
readStep
514536
| 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 |
515537
| main.rs:33:9:33:15 | Some(...) | Some | main.rs:33:14:33:14 | _ |
@@ -579,3 +601,6 @@ readStep
579601
| main.rs:376:5:376:11 | mut_arr | array[] | main.rs:376:5:376:14 | mut_arr[1] |
580602
| main.rs:377:13:377:19 | mut_arr | array[] | main.rs:377:13:377:22 | mut_arr[1] |
581603
| main.rs:379:10:379:16 | mut_arr | array[] | main.rs:379:10:379:19 | mut_arr[0] |
604+
| main.rs:404:23:404:27 | names | array[] | main.rs:404:7:404:18 | TuplePat |
605+
| main.rs:406:35:406:61 | [post] \|...\| ... | captured default_name | main.rs:406:35:406:61 | [post] default_name |
606+
| main.rs:406:38:406:49 | this | captured default_name | main.rs:406:38:406:49 | default_name |

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,19 @@ fn write_through_borrow() {
397397
sink(a); // $ MISSING: hasValueFlow=39
398398
}
399399

400+
// Test data flow inconsistency occuring with captured variables and `continue`
401+
// in a loop.
402+
pub fn captured_variable_and_continue(names: Vec<(bool, Option<String>)>) {
403+
let default_name = source(83).to_string();
404+
for (cond, name) in names {
405+
if cond {
406+
let n = name.unwrap_or_else(|| default_name.to_string());
407+
sink(n.len() as i64);
408+
continue;
409+
}
410+
}
411+
}
412+
400413
fn main() {
401414
direct();
402415
variable_usage();
@@ -432,4 +445,5 @@ fn main() {
432445
array_assignment();
433446
read_through_borrow();
434447
write_through_borrow();
448+
captured_variable_and_continue(vec![]);
435449
}

0 commit comments

Comments
 (0)