diff --git a/rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll b/rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll index 3949ebbb7900..03a0a5c7c0b3 100644 --- a/rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll +++ b/rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll @@ -194,6 +194,16 @@ predicate interpretPath(string path, Function f, Provenance orig, Provenance p, ) } +private predicate summaryModel( + Function f, string input, string output, string kind, Provenance p, boolean isExact, + QlBuiltins::ExtensionId madId +) { + exists(string path, Provenance p_ | + summaryModel(path, input, output, kind, p_, madId) and + interpretPath(path, f, p_, p, isExact) + ) +} + private class SummarizedCallableFromModel extends SummarizedCallable::Range { string input_; string output_; @@ -202,12 +212,7 @@ private class SummarizedCallableFromModel extends SummarizedCallable::Range { boolean isExact_; QlBuiltins::ExtensionId madId; - SummarizedCallableFromModel() { - exists(string path, Provenance p | - summaryModel(path, input_, output_, kind, p, madId) and - interpretPath(path, this, p, p_, isExact_) - ) - } + SummarizedCallableFromModel() { summaryModel(this, input_, output_, kind, p_, isExact_, madId) } override predicate propagatesFlow( string input, string output, boolean preservesValue, Provenance p, boolean isExact, string model @@ -237,6 +242,10 @@ predicate mayInvokeCallback(Function f, int n) { ) } +private predicate hasGeneratedSummaryModel(Function f, boolean isExact) { + summaryModel(f, _, _, _, any(Provenance g | g.isGenerated()), isExact, _) +} + private class SummarizedCallableWithCallback extends SummarizedCallable::Range { private int pos; @@ -249,8 +258,15 @@ private class SummarizedCallableWithCallback extends SummarizedCallable::Range { output = "Argument[" + pos + "].Parameter[closure-self]" and preservesValue = true and p = "hq-generated" and - isExact = true and - model = "heuristic-callback" + model = "heuristic-callback" and + // If a generated model already exists for this function, inherit its exactness + // to prevent that either model suppresses the other + ( + hasGeneratedSummaryModel(this, isExact) + or + not hasGeneratedSummaryModel(this, _) and + isExact = true + ) } } diff --git a/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected b/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected index 9c039d360fc5..3cdc629dc11d 100644 --- a/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected +++ b/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected @@ -749,86 +749,92 @@ localStep | main.rs:530:9:530:11 | [SSA] vs2 | main.rs:531:15:531:17 | vs2 | | main.rs:530:9:530:11 | vs2 | main.rs:530:9:530:11 | [SSA] vs2 | | main.rs:530:9:530:11 | vs2 | main.rs:530:9:530:11 | vs2 | -| main.rs:530:26:530:27 | [post] vs | main.rs:535:5:535:6 | vs | -| main.rs:530:26:530:27 | vs | main.rs:535:5:535:6 | vs | +| main.rs:530:26:530:27 | [post] vs | main.rs:537:5:537:6 | vs | +| main.rs:530:26:530:27 | vs | main.rs:537:5:537:6 | vs | | main.rs:530:26:530:44 | ... .collect() | main.rs:530:9:530:11 | vs2 | | main.rs:531:10:531:10 | [SSA] v | main.rs:532:14:532:14 | v | | main.rs:531:10:531:10 | v | main.rs:531:10:531:10 | [SSA] v | | main.rs:531:10:531:10 | v | main.rs:531:10:531:10 | v | -| main.rs:535:5:535:6 | [post] vs | main.rs:536:5:536:6 | vs | -| main.rs:535:5:535:6 | vs | main.rs:536:5:536:6 | vs | -| main.rs:535:20:535:20 | ... | main.rs:535:20:535:20 | x | -| main.rs:535:20:535:20 | [SSA] x | main.rs:535:29:535:29 | x | -| main.rs:535:20:535:20 | x | main.rs:535:20:535:20 | [SSA] x | -| main.rs:535:20:535:20 | x | main.rs:535:20:535:20 | x | -| main.rs:536:5:536:6 | [post] vs | main.rs:538:14:538:15 | vs | -| main.rs:536:5:536:6 | vs | main.rs:538:14:538:15 | vs | -| main.rs:536:24:536:35 | \|...\| ... | main.rs:536:24:536:35 | \|...\| ... | -| main.rs:536:25:536:25 | ... | main.rs:536:25:536:25 | x | -| main.rs:536:25:536:25 | [SSA] x | main.rs:536:34:536:34 | x | -| main.rs:536:25:536:25 | x | main.rs:536:25:536:25 | [SSA] x | -| main.rs:536:25:536:25 | x | main.rs:536:25:536:25 | x | -| main.rs:538:9:538:9 | [SSA] v | main.rs:539:14:539:14 | v | -| main.rs:538:9:538:9 | v | main.rs:538:9:538:9 | [SSA] v | -| main.rs:538:9:538:9 | v | main.rs:538:9:538:9 | v | -| main.rs:542:9:542:18 | mut vs_mut | main.rs:542:13:542:18 | vs_mut | -| main.rs:542:13:542:18 | [SSA] vs_mut | main.rs:544:10:544:15 | vs_mut | -| main.rs:542:13:542:18 | vs_mut | main.rs:542:13:542:18 | [SSA] vs_mut | -| main.rs:542:22:542:42 | [...] | main.rs:542:9:542:18 | mut vs_mut | -| main.rs:544:10:544:15 | [post] vs_mut | main.rs:545:11:545:16 | [SSA] vs_mut | -| main.rs:544:10:544:15 | [post] vs_mut | main.rs:545:11:545:16 | vs_mut | -| main.rs:544:10:544:15 | vs_mut | main.rs:545:11:545:16 | [SSA] vs_mut | -| main.rs:544:10:544:15 | vs_mut | main.rs:545:11:545:16 | vs_mut | -| main.rs:545:11:545:16 | [SSA] vs_mut | main.rs:546:11:546:16 | [SSA] vs_mut | -| main.rs:545:11:545:16 | [SSA] vs_mut | main.rs:546:11:546:16 | vs_mut | -| main.rs:545:11:545:16 | [post] vs_mut | main.rs:546:11:546:16 | [SSA] vs_mut | -| main.rs:545:11:545:16 | [post] vs_mut | main.rs:546:11:546:16 | vs_mut | -| main.rs:545:11:545:16 | vs_mut | main.rs:546:11:546:16 | [SSA] vs_mut | -| main.rs:545:11:545:16 | vs_mut | main.rs:546:11:546:16 | vs_mut | -| main.rs:546:11:546:16 | [SSA] vs_mut | main.rs:548:19:548:24 | vs_mut | -| main.rs:546:11:546:16 | [post] vs_mut | main.rs:548:19:548:24 | vs_mut | -| main.rs:546:11:546:16 | vs_mut | main.rs:548:19:548:24 | vs_mut | -| main.rs:548:5:550:5 | for ... in ... { ... } | main.rs:516:16:551:1 | { ... } | -| main.rs:548:14:548:14 | [SSA] v | main.rs:549:14:549:14 | v | -| main.rs:548:14:548:14 | v | main.rs:548:14:548:14 | [SSA] v | -| main.rs:548:14:548:14 | v | main.rs:548:14:548:14 | v | -| main.rs:554:9:554:9 | [SSA] a | main.rs:559:10:559:10 | a | -| main.rs:554:9:554:9 | a | main.rs:554:9:554:9 | [SSA] a | -| main.rs:554:9:554:9 | a | main.rs:554:9:554:9 | a | -| main.rs:554:13:554:22 | source(...) | main.rs:554:9:554:9 | a | -| main.rs:555:9:555:9 | [SSA] b | main.rs:560:15:560:15 | b | -| main.rs:555:9:555:9 | b | main.rs:555:9:555:9 | [SSA] b | -| main.rs:555:9:555:9 | b | main.rs:555:9:555:9 | b | -| main.rs:555:13:555:22 | source(...) | main.rs:555:9:555:9 | b | -| main.rs:556:9:556:9 | [SSA] c | main.rs:557:18:557:18 | c | -| main.rs:556:9:556:9 | c | main.rs:556:9:556:9 | [SSA] c | -| main.rs:556:9:556:9 | c | main.rs:556:9:556:9 | c | -| main.rs:556:13:556:22 | source(...) | main.rs:556:9:556:9 | c | -| main.rs:557:9:557:13 | [SSA] c_ref | main.rs:561:14:561:18 | c_ref | -| main.rs:557:9:557:13 | c_ref | main.rs:557:9:557:13 | [SSA] c_ref | -| main.rs:557:9:557:13 | c_ref | main.rs:557:9:557:13 | c_ref | -| main.rs:557:17:557:18 | &c | main.rs:557:9:557:13 | c_ref | -| main.rs:561:14:561:18 | [post] c_ref | main.rs:562:11:562:15 | c_ref | -| main.rs:561:14:561:18 | c_ref | main.rs:562:11:562:15 | c_ref | -| main.rs:566:9:566:9 | [SSA] a | main.rs:568:10:568:10 | a | -| main.rs:566:9:566:9 | a | main.rs:566:9:566:9 | [SSA] a | -| main.rs:566:9:566:9 | a | main.rs:566:9:566:9 | a | -| main.rs:566:18:566:27 | source(...) | main.rs:566:9:566:9 | a | -| main.rs:568:10:568:10 | [post] a | main.rs:569:10:569:10 | a | -| main.rs:568:10:568:10 | a | main.rs:569:10:569:10 | a | -| main.rs:569:10:569:10 | [post] a | main.rs:570:20:570:20 | a | -| main.rs:569:10:569:10 | a | main.rs:570:20:570:20 | a | -| main.rs:572:9:572:9 | [SSA] b | main.rs:574:10:574:10 | b | -| main.rs:572:9:572:9 | b | main.rs:572:9:572:9 | [SSA] b | -| main.rs:572:9:572:9 | b | main.rs:572:9:572:9 | b | -| main.rs:572:18:572:34 | ... as i32 | main.rs:572:9:572:9 | b | -| main.rs:574:10:574:10 | [post] b | main.rs:575:10:575:10 | b | -| main.rs:574:10:574:10 | b | main.rs:575:10:575:10 | b | -| main.rs:575:10:575:10 | [post] b | main.rs:576:20:576:20 | b | -| main.rs:575:10:575:10 | b | main.rs:576:20:576:20 | b | -| main.rs:604:13:604:33 | result_questionmark(...) | main.rs:604:9:604:9 | _ | -| main.rs:616:36:616:39 | ...::new(...) | main.rs:616:36:616:41 | MacroExpr | -| main.rs:616:36:616:41 | [post] MacroExpr | main.rs:616:36:616:39 | [post] ...::new(...) | +| main.rs:535:9:535:16 | captured | main.rs:535:9:535:16 | [SSA] captured | +| main.rs:535:9:535:16 | captured | main.rs:535:9:535:16 | captured | +| main.rs:535:9:535:16 | captured | main.rs:538:24:541:5 | captured | +| main.rs:535:20:535:29 | source(...) | main.rs:535:9:535:16 | captured | +| main.rs:537:5:537:6 | [post] vs | main.rs:538:5:538:6 | vs | +| main.rs:537:5:537:6 | vs | main.rs:538:5:538:6 | vs | +| main.rs:537:20:537:20 | ... | main.rs:537:20:537:20 | x | +| main.rs:537:20:537:20 | [SSA] x | main.rs:537:29:537:29 | x | +| main.rs:537:20:537:20 | x | main.rs:537:20:537:20 | [SSA] x | +| main.rs:537:20:537:20 | x | main.rs:537:20:537:20 | x | +| main.rs:538:5:538:6 | [post] vs | main.rs:543:14:543:15 | vs | +| main.rs:538:5:538:6 | vs | main.rs:543:14:543:15 | vs | +| main.rs:538:24:541:5 | \|...\| ... | main.rs:538:24:541:5 | \|...\| ... | +| main.rs:538:24:541:5 | closure self in \|...\| ... | main.rs:540:14:540:21 | this | +| main.rs:538:25:538:25 | ... | main.rs:538:25:538:25 | x | +| main.rs:538:25:538:25 | [SSA] x | main.rs:539:15:539:15 | x | +| main.rs:538:25:538:25 | x | main.rs:538:25:538:25 | [SSA] x | +| main.rs:538:25:538:25 | x | main.rs:538:25:538:25 | x | +| main.rs:540:9:540:22 | sink(...) | main.rs:538:28:541:5 | { ... } | +| main.rs:543:9:543:9 | [SSA] v | main.rs:544:14:544:14 | v | +| main.rs:543:9:543:9 | v | main.rs:543:9:543:9 | [SSA] v | +| main.rs:543:9:543:9 | v | main.rs:543:9:543:9 | v | +| main.rs:547:9:547:18 | mut vs_mut | main.rs:547:13:547:18 | vs_mut | +| main.rs:547:13:547:18 | [SSA] vs_mut | main.rs:549:10:549:15 | vs_mut | +| main.rs:547:13:547:18 | vs_mut | main.rs:547:13:547:18 | [SSA] vs_mut | +| main.rs:547:22:547:42 | [...] | main.rs:547:9:547:18 | mut vs_mut | +| main.rs:549:10:549:15 | [post] vs_mut | main.rs:550:11:550:16 | [SSA] vs_mut | +| main.rs:549:10:549:15 | [post] vs_mut | main.rs:550:11:550:16 | vs_mut | +| main.rs:549:10:549:15 | vs_mut | main.rs:550:11:550:16 | [SSA] vs_mut | +| main.rs:549:10:549:15 | vs_mut | main.rs:550:11:550:16 | vs_mut | +| main.rs:550:11:550:16 | [SSA] vs_mut | main.rs:551:11:551:16 | [SSA] vs_mut | +| main.rs:550:11:550:16 | [SSA] vs_mut | main.rs:551:11:551:16 | vs_mut | +| main.rs:550:11:550:16 | [post] vs_mut | main.rs:551:11:551:16 | [SSA] vs_mut | +| main.rs:550:11:550:16 | [post] vs_mut | main.rs:551:11:551:16 | vs_mut | +| main.rs:550:11:550:16 | vs_mut | main.rs:551:11:551:16 | [SSA] vs_mut | +| main.rs:550:11:550:16 | vs_mut | main.rs:551:11:551:16 | vs_mut | +| main.rs:551:11:551:16 | [SSA] vs_mut | main.rs:553:19:553:24 | vs_mut | +| main.rs:551:11:551:16 | [post] vs_mut | main.rs:553:19:553:24 | vs_mut | +| main.rs:551:11:551:16 | vs_mut | main.rs:553:19:553:24 | vs_mut | +| main.rs:553:5:555:5 | for ... in ... { ... } | main.rs:516:16:556:1 | { ... } | +| main.rs:553:14:553:14 | [SSA] v | main.rs:554:14:554:14 | v | +| main.rs:553:14:553:14 | v | main.rs:553:14:553:14 | [SSA] v | +| main.rs:553:14:553:14 | v | main.rs:553:14:553:14 | v | +| main.rs:559:9:559:9 | [SSA] a | main.rs:564:10:564:10 | a | +| main.rs:559:9:559:9 | a | main.rs:559:9:559:9 | [SSA] a | +| main.rs:559:9:559:9 | a | main.rs:559:9:559:9 | a | +| main.rs:559:13:559:22 | source(...) | main.rs:559:9:559:9 | a | +| main.rs:560:9:560:9 | [SSA] b | main.rs:565:15:565:15 | b | +| main.rs:560:9:560:9 | b | main.rs:560:9:560:9 | [SSA] b | +| main.rs:560:9:560:9 | b | main.rs:560:9:560:9 | b | +| main.rs:560:13:560:22 | source(...) | main.rs:560:9:560:9 | b | +| main.rs:561:9:561:9 | [SSA] c | main.rs:562:18:562:18 | c | +| main.rs:561:9:561:9 | c | main.rs:561:9:561:9 | [SSA] c | +| main.rs:561:9:561:9 | c | main.rs:561:9:561:9 | c | +| main.rs:561:13:561:22 | source(...) | main.rs:561:9:561:9 | c | +| main.rs:562:9:562:13 | [SSA] c_ref | main.rs:566:14:566:18 | c_ref | +| main.rs:562:9:562:13 | c_ref | main.rs:562:9:562:13 | [SSA] c_ref | +| main.rs:562:9:562:13 | c_ref | main.rs:562:9:562:13 | c_ref | +| main.rs:562:17:562:18 | &c | main.rs:562:9:562:13 | c_ref | +| main.rs:566:14:566:18 | [post] c_ref | main.rs:567:11:567:15 | c_ref | +| main.rs:566:14:566:18 | c_ref | main.rs:567:11:567:15 | c_ref | +| main.rs:571:9:571:9 | [SSA] a | main.rs:573:10:573:10 | a | +| main.rs:571:9:571:9 | a | main.rs:571:9:571:9 | [SSA] a | +| main.rs:571:9:571:9 | a | main.rs:571:9:571:9 | a | +| main.rs:571:18:571:27 | source(...) | main.rs:571:9:571:9 | a | +| main.rs:573:10:573:10 | [post] a | main.rs:574:10:574:10 | a | +| main.rs:573:10:573:10 | a | main.rs:574:10:574:10 | a | +| main.rs:574:10:574:10 | [post] a | main.rs:575:20:575:20 | a | +| main.rs:574:10:574:10 | a | main.rs:575:20:575:20 | a | +| main.rs:577:9:577:9 | [SSA] b | main.rs:579:10:579:10 | b | +| main.rs:577:9:577:9 | b | main.rs:577:9:577:9 | [SSA] b | +| main.rs:577:9:577:9 | b | main.rs:577:9:577:9 | b | +| main.rs:577:18:577:34 | ... as i32 | main.rs:577:9:577:9 | b | +| main.rs:579:10:579:10 | [post] b | main.rs:580:10:580:10 | b | +| main.rs:579:10:579:10 | b | main.rs:580:10:580:10 | b | +| main.rs:580:10:580:10 | [post] b | main.rs:581:20:581:20 | b | +| main.rs:580:10:580:10 | b | main.rs:581:20:581:20 | b | +| main.rs:609:13:609:33 | result_questionmark(...) | main.rs:609:9:609:9 | _ | +| main.rs:621:36:621:39 | ...::new(...) | main.rs:621:36:621:41 | MacroExpr | +| main.rs:621:36:621:41 | [post] MacroExpr | main.rs:621:36:621:39 | [post] ...::new(...) | readStep | main.rs:50:9:50:15 | Some(...) | {EXTERNAL LOCATION} | Some | main.rs:50:14:50:14 | _ | | main.rs:116:10:116:11 | * ... [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:116:10:116:11 | * ... | @@ -845,9 +851,9 @@ readStep | main.rs:142:10:142:10 | a | file://:0:0:0:0 | tuple.0 | main.rs:142:10:142:12 | a.0 | | main.rs:143:10:143:10 | a | file://:0:0:0:0 | tuple.1 | main.rs:143:10:143:12 | a.1 | | main.rs:149:10:149:10 | b | file://:0:0:0:0 | tuple.0 | main.rs:149:10:149:12 | b.0 | -| main.rs:149:10:149:12 | b.0 | file://:0:0:0:0 | tuple.0 | main.rs:149:10:149:15 | ... .0 | +| main.rs:149:10:149:12 | b.0 | file://:0:0:0:0 | tuple.0 | main.rs:149:10:149:14 | ... .0 | | main.rs:150:10:150:10 | b | file://:0:0:0:0 | tuple.0 | main.rs:150:10:150:12 | b.0 | -| main.rs:150:10:150:12 | b.0 | file://:0:0:0:0 | tuple.1 | main.rs:150:10:150:15 | ... .1 | +| main.rs:150:10:150:12 | b.0 | file://:0:0:0:0 | tuple.1 | main.rs:150:10:150:14 | ... .1 | | main.rs:151:10:151:10 | b | file://:0:0:0:0 | tuple.1 | main.rs:151:10:151:12 | b.1 | | main.rs:164:10:164:10 | p | main.rs:158:5:158:10 | Point.x | main.rs:164:10:164:12 | p.x | | main.rs:165:10:165:10 | p | main.rs:159:5:159:10 | Point.y | main.rs:165:10:165:12 | p.y | @@ -967,38 +973,40 @@ readStep | main.rs:530:26:530:27 | vs [implicit deref 0 in state before deref] | file://:0:0:0:0 | &ref | main.rs:530:26:530:27 | vs [implicit deref 0 in state after deref] | | main.rs:531:9:531:10 | &... | file://:0:0:0:0 | &ref | main.rs:531:10:531:10 | v | | main.rs:531:15:531:17 | vs2 | file://:0:0:0:0 | element | main.rs:531:9:531:10 | &... | -| main.rs:535:5:535:6 | [post] vs [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:535:5:535:6 | [post] vs [implicit deref 0 in state after deref] | -| main.rs:535:5:535:6 | [post] vs [implicit deref 0 in state after borrow] | file://:0:0:0:0 | &ref | main.rs:535:5:535:6 | [post] vs | -| main.rs:535:5:535:6 | vs [implicit deref 0 in state before deref] | file://:0:0:0:0 | &ref | main.rs:535:5:535:6 | vs [implicit deref 0 in state after deref] | -| main.rs:535:28:535:29 | * ... [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:535:28:535:29 | * ... | -| main.rs:535:29:535:29 | [post] x [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:535:29:535:29 | [post] x | -| main.rs:536:5:536:6 | [post] vs [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:536:5:536:6 | [post] vs [implicit deref 0 in state after deref] | -| main.rs:536:5:536:6 | [post] vs [implicit deref 0 in state after borrow] | file://:0:0:0:0 | &ref | main.rs:536:5:536:6 | [post] vs | -| main.rs:536:5:536:6 | vs [implicit deref 0 in state before deref] | file://:0:0:0:0 | &ref | main.rs:536:5:536:6 | vs [implicit deref 0 in state after deref] | -| main.rs:536:33:536:34 | * ... [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:536:33:536:34 | * ... | -| main.rs:536:34:536:34 | [post] x [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:536:34:536:34 | [post] x | -| main.rs:538:14:538:27 | vs.into_iter() | file://:0:0:0:0 | element | main.rs:538:9:538:9 | v | -| main.rs:544:10:544:15 | [post] vs_mut [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:544:10:544:15 | [post] vs_mut | -| main.rs:544:10:544:18 | vs_mut[0] [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:544:10:544:18 | vs_mut[0] | -| main.rs:545:10:545:39 | * ... [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:545:10:545:39 | * ... | -| main.rs:545:11:545:16 | [post] vs_mut [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:545:11:545:16 | [post] vs_mut [implicit deref 0 in state after deref] | -| main.rs:545:11:545:16 | [post] vs_mut [implicit deref 0 in state after borrow] | file://:0:0:0:0 | &ref | main.rs:545:11:545:16 | [post] vs_mut | -| main.rs:545:11:545:16 | vs_mut [implicit deref 0 in state before deref] | file://:0:0:0:0 | &ref | main.rs:545:11:545:16 | vs_mut [implicit deref 0 in state after deref] | -| main.rs:545:11:545:23 | [post] vs_mut.iter() [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:545:11:545:23 | [post] vs_mut.iter() | -| main.rs:545:11:545:39 | [post] ... .unwrap() [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:545:11:545:39 | [post] ... .unwrap() | -| main.rs:546:10:546:39 | * ... [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:546:10:546:39 | * ... | -| main.rs:546:11:546:16 | [post] vs_mut [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:546:11:546:16 | [post] vs_mut [implicit deref 0 in state after deref] | -| main.rs:546:11:546:16 | [post] vs_mut [implicit deref 0 in state after borrow] | file://:0:0:0:0 | &ref | main.rs:546:11:546:16 | [post] vs_mut | -| main.rs:546:11:546:16 | vs_mut [implicit deref 0 in state before deref] | file://:0:0:0:0 | &ref | main.rs:546:11:546:16 | vs_mut [implicit deref 0 in state after deref] | -| main.rs:546:11:546:23 | [post] vs_mut.iter() [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:546:11:546:23 | [post] vs_mut.iter() | -| main.rs:546:11:546:39 | [post] ... .unwrap() [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:546:11:546:39 | [post] ... .unwrap() | -| main.rs:548:9:548:14 | &mut ... | file://:0:0:0:0 | &ref | main.rs:548:14:548:14 | v | -| main.rs:548:19:548:24 | [post] vs_mut [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:548:19:548:24 | [post] vs_mut [implicit deref 0 in state after deref] | -| main.rs:548:19:548:24 | [post] vs_mut [implicit deref 0 in state after borrow] | file://:0:0:0:0 | &ref | main.rs:548:19:548:24 | [post] vs_mut | -| main.rs:548:19:548:24 | vs_mut [implicit deref 0 in state before deref] | file://:0:0:0:0 | &ref | main.rs:548:19:548:24 | vs_mut [implicit deref 0 in state after deref] | -| main.rs:548:19:548:35 | vs_mut.iter_mut() | file://:0:0:0:0 | element | main.rs:548:9:548:14 | &mut ... | -| main.rs:562:10:562:15 | * ... [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:562:10:562:15 | * ... | -| main.rs:562:11:562:15 | [post] c_ref [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:562:11:562:15 | [post] c_ref | +| main.rs:537:5:537:6 | [post] vs [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:537:5:537:6 | [post] vs [implicit deref 0 in state after deref] | +| main.rs:537:5:537:6 | [post] vs [implicit deref 0 in state after borrow] | file://:0:0:0:0 | &ref | main.rs:537:5:537:6 | [post] vs | +| main.rs:537:5:537:6 | vs [implicit deref 0 in state before deref] | file://:0:0:0:0 | &ref | main.rs:537:5:537:6 | vs [implicit deref 0 in state after deref] | +| main.rs:537:28:537:29 | * ... [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:537:28:537:29 | * ... | +| main.rs:537:29:537:29 | [post] x [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:537:29:537:29 | [post] x | +| main.rs:538:5:538:6 | [post] vs [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:538:5:538:6 | [post] vs [implicit deref 0 in state after deref] | +| main.rs:538:5:538:6 | [post] vs [implicit deref 0 in state after borrow] | file://:0:0:0:0 | &ref | main.rs:538:5:538:6 | [post] vs | +| main.rs:538:5:538:6 | vs [implicit deref 0 in state before deref] | file://:0:0:0:0 | &ref | main.rs:538:5:538:6 | vs [implicit deref 0 in state after deref] | +| main.rs:538:24:541:5 | [post] \|...\| ... | main.rs:535:9:535:16 | captured captured | main.rs:538:24:541:5 | [post] captured | +| main.rs:539:14:539:15 | * ... [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:539:14:539:15 | * ... | +| main.rs:539:15:539:15 | [post] x [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:539:15:539:15 | [post] x | +| main.rs:540:14:540:21 | this | main.rs:535:9:535:16 | captured captured | main.rs:540:14:540:21 | captured | +| main.rs:543:14:543:27 | vs.into_iter() | file://:0:0:0:0 | element | main.rs:543:9:543:9 | v | +| main.rs:549:10:549:15 | [post] vs_mut [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:549:10:549:15 | [post] vs_mut | +| main.rs:549:10:549:18 | vs_mut[0] [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:549:10:549:18 | vs_mut[0] | +| main.rs:550:10:550:39 | * ... [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:550:10:550:39 | * ... | +| main.rs:550:11:550:16 | [post] vs_mut [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:550:11:550:16 | [post] vs_mut [implicit deref 0 in state after deref] | +| main.rs:550:11:550:16 | [post] vs_mut [implicit deref 0 in state after borrow] | file://:0:0:0:0 | &ref | main.rs:550:11:550:16 | [post] vs_mut | +| main.rs:550:11:550:16 | vs_mut [implicit deref 0 in state before deref] | file://:0:0:0:0 | &ref | main.rs:550:11:550:16 | vs_mut [implicit deref 0 in state after deref] | +| main.rs:550:11:550:23 | [post] vs_mut.iter() [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:550:11:550:23 | [post] vs_mut.iter() | +| main.rs:550:11:550:39 | [post] ... .unwrap() [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:550:11:550:39 | [post] ... .unwrap() | +| main.rs:551:10:551:39 | * ... [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:551:10:551:39 | * ... | +| main.rs:551:11:551:16 | [post] vs_mut [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:551:11:551:16 | [post] vs_mut [implicit deref 0 in state after deref] | +| main.rs:551:11:551:16 | [post] vs_mut [implicit deref 0 in state after borrow] | file://:0:0:0:0 | &ref | main.rs:551:11:551:16 | [post] vs_mut | +| main.rs:551:11:551:16 | vs_mut [implicit deref 0 in state before deref] | file://:0:0:0:0 | &ref | main.rs:551:11:551:16 | vs_mut [implicit deref 0 in state after deref] | +| main.rs:551:11:551:23 | [post] vs_mut.iter() [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:551:11:551:23 | [post] vs_mut.iter() | +| main.rs:551:11:551:39 | [post] ... .unwrap() [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:551:11:551:39 | [post] ... .unwrap() | +| main.rs:553:9:553:14 | &mut ... | file://:0:0:0:0 | &ref | main.rs:553:14:553:14 | v | +| main.rs:553:19:553:24 | [post] vs_mut [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:553:19:553:24 | [post] vs_mut [implicit deref 0 in state after deref] | +| main.rs:553:19:553:24 | [post] vs_mut [implicit deref 0 in state after borrow] | file://:0:0:0:0 | &ref | main.rs:553:19:553:24 | [post] vs_mut | +| main.rs:553:19:553:24 | vs_mut [implicit deref 0 in state before deref] | file://:0:0:0:0 | &ref | main.rs:553:19:553:24 | vs_mut [implicit deref 0 in state after deref] | +| main.rs:553:19:553:35 | vs_mut.iter_mut() | file://:0:0:0:0 | element | main.rs:553:9:553:14 | &mut ... | +| main.rs:567:10:567:15 | * ... [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:567:10:567:15 | * ... | +| main.rs:567:11:567:15 | [post] c_ref [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:567:11:567:15 | [post] c_ref | storeStep | main.rs:116:11:116:11 | i | file://:0:0:0:0 | &ref | main.rs:116:11:116:11 | i [implicit borrow] | | main.rs:123:14:123:22 | source(...) | file://:0:0:0:0 | tuple.0 | main.rs:123:13:123:26 | TupleExpr | @@ -1113,28 +1121,29 @@ storeStep | main.rs:526:15:526:16 | vs [implicit deref 0 in state after deref] | file://:0:0:0:0 | &ref | main.rs:526:15:526:16 | vs [implicit borrow] | | main.rs:530:26:530:27 | vs | file://:0:0:0:0 | &ref | main.rs:530:26:530:27 | vs [implicit deref 0 in state after borrow] | | main.rs:530:26:530:27 | vs [implicit deref 0 in state after deref] | file://:0:0:0:0 | &ref | main.rs:530:26:530:27 | vs [implicit borrow] | -| main.rs:535:5:535:6 | vs | file://:0:0:0:0 | &ref | main.rs:535:5:535:6 | vs [implicit deref 0 in state after borrow] | -| main.rs:535:5:535:6 | vs [implicit deref 0 in state after deref] | file://:0:0:0:0 | &ref | main.rs:535:5:535:6 | vs [implicit borrow] | -| main.rs:535:29:535:29 | x | file://:0:0:0:0 | &ref | main.rs:535:29:535:29 | x [implicit borrow] | -| main.rs:536:5:536:6 | vs | file://:0:0:0:0 | &ref | main.rs:536:5:536:6 | vs [implicit deref 0 in state after borrow] | -| main.rs:536:5:536:6 | vs [implicit deref 0 in state after deref] | file://:0:0:0:0 | &ref | main.rs:536:5:536:6 | vs [implicit borrow] | -| main.rs:536:34:536:34 | x | file://:0:0:0:0 | &ref | main.rs:536:34:536:34 | x [implicit borrow] | -| main.rs:542:23:542:32 | source(...) | file://:0:0:0:0 | element | main.rs:542:22:542:42 | [...] | -| main.rs:542:35:542:35 | 2 | file://:0:0:0:0 | element | main.rs:542:22:542:42 | [...] | -| main.rs:542:38:542:38 | 3 | file://:0:0:0:0 | element | main.rs:542:22:542:42 | [...] | -| main.rs:542:41:542:41 | 4 | file://:0:0:0:0 | element | main.rs:542:22:542:42 | [...] | -| main.rs:544:10:544:15 | vs_mut | file://:0:0:0:0 | &ref | main.rs:544:10:544:15 | vs_mut [implicit borrow] | -| main.rs:545:11:545:16 | vs_mut | file://:0:0:0:0 | &ref | main.rs:545:11:545:16 | vs_mut [implicit deref 0 in state after borrow] | -| main.rs:545:11:545:16 | vs_mut [implicit deref 0 in state after deref] | file://:0:0:0:0 | &ref | main.rs:545:11:545:16 | vs_mut [implicit borrow] | -| main.rs:545:11:545:23 | vs_mut.iter() | file://:0:0:0:0 | &ref | main.rs:545:11:545:23 | vs_mut.iter() [implicit borrow] | -| main.rs:545:11:545:39 | ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:545:11:545:39 | ... .unwrap() [implicit borrow] | -| main.rs:546:11:546:16 | vs_mut | file://:0:0:0:0 | &ref | main.rs:546:11:546:16 | vs_mut [implicit deref 0 in state after borrow] | -| main.rs:546:11:546:16 | vs_mut [implicit deref 0 in state after deref] | file://:0:0:0:0 | &ref | main.rs:546:11:546:16 | vs_mut [implicit borrow] | -| main.rs:546:11:546:23 | vs_mut.iter() | file://:0:0:0:0 | &ref | main.rs:546:11:546:23 | vs_mut.iter() [implicit borrow] | -| main.rs:546:11:546:39 | ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:546:11:546:39 | ... .unwrap() [implicit borrow] | -| main.rs:548:19:548:24 | vs_mut | file://:0:0:0:0 | &ref | main.rs:548:19:548:24 | vs_mut [implicit deref 0 in state after borrow] | -| main.rs:548:19:548:24 | vs_mut [implicit deref 0 in state after deref] | file://:0:0:0:0 | &ref | main.rs:548:19:548:24 | vs_mut [implicit borrow] | -| main.rs:557:18:557:18 | c | file://:0:0:0:0 | &ref | main.rs:557:17:557:18 | &c | -| main.rs:560:15:560:15 | b | file://:0:0:0:0 | &ref | main.rs:560:14:560:15 | &b | -| main.rs:562:11:562:15 | c_ref | file://:0:0:0:0 | &ref | main.rs:562:11:562:15 | c_ref [implicit borrow] | -| main.rs:583:27:583:27 | 0 | {EXTERNAL LOCATION} | Some | main.rs:583:22:583:28 | Some(...) | +| main.rs:537:5:537:6 | vs | file://:0:0:0:0 | &ref | main.rs:537:5:537:6 | vs [implicit deref 0 in state after borrow] | +| main.rs:537:5:537:6 | vs [implicit deref 0 in state after deref] | file://:0:0:0:0 | &ref | main.rs:537:5:537:6 | vs [implicit borrow] | +| main.rs:537:29:537:29 | x | file://:0:0:0:0 | &ref | main.rs:537:29:537:29 | x [implicit borrow] | +| main.rs:538:5:538:6 | vs | file://:0:0:0:0 | &ref | main.rs:538:5:538:6 | vs [implicit deref 0 in state after borrow] | +| main.rs:538:5:538:6 | vs [implicit deref 0 in state after deref] | file://:0:0:0:0 | &ref | main.rs:538:5:538:6 | vs [implicit borrow] | +| main.rs:538:24:541:5 | captured | main.rs:535:9:535:16 | captured captured | main.rs:538:24:541:5 | \|...\| ... | +| main.rs:539:15:539:15 | x | file://:0:0:0:0 | &ref | main.rs:539:15:539:15 | x [implicit borrow] | +| main.rs:547:23:547:32 | source(...) | file://:0:0:0:0 | element | main.rs:547:22:547:42 | [...] | +| main.rs:547:35:547:35 | 2 | file://:0:0:0:0 | element | main.rs:547:22:547:42 | [...] | +| main.rs:547:38:547:38 | 3 | file://:0:0:0:0 | element | main.rs:547:22:547:42 | [...] | +| main.rs:547:41:547:41 | 4 | file://:0:0:0:0 | element | main.rs:547:22:547:42 | [...] | +| main.rs:549:10:549:15 | vs_mut | file://:0:0:0:0 | &ref | main.rs:549:10:549:15 | vs_mut [implicit borrow] | +| main.rs:550:11:550:16 | vs_mut | file://:0:0:0:0 | &ref | main.rs:550:11:550:16 | vs_mut [implicit deref 0 in state after borrow] | +| main.rs:550:11:550:16 | vs_mut [implicit deref 0 in state after deref] | file://:0:0:0:0 | &ref | main.rs:550:11:550:16 | vs_mut [implicit borrow] | +| main.rs:550:11:550:23 | vs_mut.iter() | file://:0:0:0:0 | &ref | main.rs:550:11:550:23 | vs_mut.iter() [implicit borrow] | +| main.rs:550:11:550:39 | ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:550:11:550:39 | ... .unwrap() [implicit borrow] | +| main.rs:551:11:551:16 | vs_mut | file://:0:0:0:0 | &ref | main.rs:551:11:551:16 | vs_mut [implicit deref 0 in state after borrow] | +| main.rs:551:11:551:16 | vs_mut [implicit deref 0 in state after deref] | file://:0:0:0:0 | &ref | main.rs:551:11:551:16 | vs_mut [implicit borrow] | +| main.rs:551:11:551:23 | vs_mut.iter() | file://:0:0:0:0 | &ref | main.rs:551:11:551:23 | vs_mut.iter() [implicit borrow] | +| main.rs:551:11:551:39 | ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:551:11:551:39 | ... .unwrap() [implicit borrow] | +| main.rs:553:19:553:24 | vs_mut | file://:0:0:0:0 | &ref | main.rs:553:19:553:24 | vs_mut [implicit deref 0 in state after borrow] | +| main.rs:553:19:553:24 | vs_mut [implicit deref 0 in state after deref] | file://:0:0:0:0 | &ref | main.rs:553:19:553:24 | vs_mut [implicit borrow] | +| main.rs:562:18:562:18 | c | file://:0:0:0:0 | &ref | main.rs:562:17:562:18 | &c | +| main.rs:565:15:565:15 | b | file://:0:0:0:0 | &ref | main.rs:565:14:565:15 | &b | +| main.rs:567:11:567:15 | c_ref | file://:0:0:0:0 | &ref | main.rs:567:11:567:15 | c_ref [implicit borrow] | +| main.rs:588:27:588:27 | 0 | {EXTERNAL LOCATION} | Some | main.rs:588:22:588:28 | Some(...) | diff --git a/rust/ql/test/library-tests/dataflow/local/inline-flow.expected b/rust/ql/test/library-tests/dataflow/local/inline-flow.expected index 0ffebef2f4b2..c6b952101685 100644 --- a/rust/ql/test/library-tests/dataflow/local/inline-flow.expected +++ b/rust/ql/test/library-tests/dataflow/local/inline-flow.expected @@ -9,20 +9,21 @@ models | 8 | Summary: ::into; Argument[self].Reference.Element; ReturnValue.Element; taint | | 9 | Summary: ::from; Argument[0]; ReturnValue; taint | | 10 | Summary: ::collect; Argument[self].Element; ReturnValue.Element; value | -| 11 | Summary: ::map; Argument[self].Element; Argument[0].Parameter[0]; value | -| 12 | Summary: ::next; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | -| 13 | Summary: ::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | -| 14 | Summary: ::index; Argument[self].Reference.Element; ReturnValue.Reference; value | -| 15 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 16 | Summary: ::unwrap_or; Argument[0]; ReturnValue; value | -| 17 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 18 | Summary: ::unwrap_or_else; Argument[0].ReturnValue; ReturnValue; value | -| 19 | Summary: ::unwrap_or_else; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 20 | Summary: ::err; Argument[self].Field[core::result::Result::Err(0)]; ReturnValue.Field[core::option::Option::Some(0)]; value | -| 21 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 22 | Summary: ::expect_err; Argument[self].Field[core::result::Result::Err(0)]; ReturnValue; value | -| 23 | Summary: ::ok; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue.Field[core::option::Option::Some(0)]; value | -| 24 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 11 | Summary: ::for_each; Argument[self].Element; Argument[0].Parameter[0]; value | +| 12 | Summary: ::map; Argument[self].Element; Argument[0].Parameter[0]; value | +| 13 | Summary: ::next; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 14 | Summary: ::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 15 | Summary: ::index; Argument[self].Reference.Element; ReturnValue.Reference; value | +| 16 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 17 | Summary: ::unwrap_or; Argument[0]; ReturnValue; value | +| 18 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 19 | Summary: ::unwrap_or_else; Argument[0].ReturnValue; ReturnValue; value | +| 20 | Summary: ::unwrap_or_else; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 21 | Summary: ::err; Argument[self].Field[core::result::Result::Err(0)]; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 22 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 23 | Summary: ::expect_err; Argument[self].Field[core::result::Result::Err(0)]; ReturnValue; value | +| 24 | Summary: ::ok; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 25 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | edges | main.rs:23:9:23:9 | s | main.rs:24:10:24:10 | s | provenance | | | main.rs:23:9:23:9 | s | main.rs:26:12:26:12 | x | provenance | | @@ -76,7 +77,7 @@ edges | main.rs:148:13:148:18 | TupleExpr [tuple.0, tuple.1] | main.rs:148:9:148:9 | b [tuple.0, tuple.1] | provenance | | | main.rs:148:14:148:14 | a [tuple.1] | main.rs:148:13:148:18 | TupleExpr [tuple.0, tuple.1] | provenance | | | main.rs:150:10:150:10 | b [tuple.0, tuple.1] | main.rs:150:10:150:12 | b.0 [tuple.1] | provenance | | -| main.rs:150:10:150:12 | b.0 [tuple.1] | main.rs:150:10:150:15 | ... .1 | provenance | | +| main.rs:150:10:150:12 | b.0 [tuple.1] | main.rs:150:10:150:14 | ... .1 | provenance | | | main.rs:163:9:163:9 | p [Point.x] | main.rs:164:10:164:10 | p [Point.x] | provenance | | | main.rs:163:13:163:40 | Point {...} [Point.x] | main.rs:163:9:163:9 | p [Point.x] | provenance | | | main.rs:163:24:163:32 | source(...) | main.rs:163:13:163:40 | Point {...} [Point.x] | provenance | | @@ -134,17 +135,17 @@ edges | main.rs:278:9:278:10 | s1 [Some] | main.rs:279:10:279:11 | s1 [Some] | provenance | | | main.rs:278:14:278:29 | Some(...) [Some] | main.rs:278:9:278:10 | s1 [Some] | provenance | | | main.rs:278:19:278:28 | source(...) | main.rs:278:14:278:29 | Some(...) [Some] | provenance | | -| main.rs:279:10:279:11 | s1 [Some] | main.rs:279:10:279:20 | s1.unwrap() | provenance | MaD:15 | +| main.rs:279:10:279:11 | s1 [Some] | main.rs:279:10:279:20 | s1.unwrap() | provenance | MaD:16 | | main.rs:283:9:283:10 | s1 [Some] | main.rs:284:10:284:11 | s1 [Some] | provenance | | | main.rs:283:14:283:29 | Some(...) [Some] | main.rs:283:9:283:10 | s1 [Some] | provenance | | | main.rs:283:19:283:28 | source(...) | main.rs:283:14:283:29 | Some(...) [Some] | provenance | | -| main.rs:284:10:284:11 | s1 [Some] | main.rs:284:10:284:24 | s1.unwrap_or(...) | provenance | MaD:17 | -| main.rs:287:23:287:32 | source(...) | main.rs:287:10:287:33 | s2.unwrap_or(...) | provenance | MaD:16 | +| main.rs:284:10:284:11 | s1 [Some] | main.rs:284:10:284:24 | s1.unwrap_or(...) | provenance | MaD:18 | +| main.rs:287:23:287:32 | source(...) | main.rs:287:10:287:33 | s2.unwrap_or(...) | provenance | MaD:17 | | main.rs:291:9:291:10 | s1 [Some] | main.rs:292:10:292:11 | s1 [Some] | provenance | | | main.rs:291:14:291:29 | Some(...) [Some] | main.rs:291:9:291:10 | s1 [Some] | provenance | | | main.rs:291:19:291:28 | source(...) | main.rs:291:14:291:29 | Some(...) [Some] | provenance | | -| main.rs:292:10:292:11 | s1 [Some] | main.rs:292:10:292:32 | s1.unwrap_or_else(...) | provenance | MaD:19 | -| main.rs:295:31:295:40 | source(...) | main.rs:295:10:295:41 | s2.unwrap_or_else(...) | provenance | MaD:18 | +| main.rs:292:10:292:11 | s1 [Some] | main.rs:292:10:292:32 | s1.unwrap_or_else(...) | provenance | MaD:20 | +| main.rs:295:31:295:40 | source(...) | main.rs:295:10:295:41 | s2.unwrap_or_else(...) | provenance | MaD:19 | | main.rs:299:9:299:10 | s1 [Some] | main.rs:301:14:301:15 | s1 [Some] | provenance | | | main.rs:299:14:299:29 | Some(...) [Some] | main.rs:299:9:299:10 | s1 [Some] | provenance | | | main.rs:299:19:299:28 | source(...) | main.rs:299:14:299:29 | Some(...) [Some] | provenance | | @@ -155,16 +156,16 @@ edges | main.rs:308:32:308:45 | Ok(...) [Ok] | main.rs:308:9:308:10 | r1 [Ok] | provenance | | | main.rs:308:35:308:44 | source(...) | main.rs:308:32:308:45 | Ok(...) [Ok] | provenance | | | main.rs:309:9:309:11 | o1a [Some] | main.rs:311:10:311:12 | o1a [Some] | provenance | | -| main.rs:309:28:309:29 | r1 [Ok] | main.rs:309:28:309:34 | r1.ok() [Some] | provenance | MaD:23 | +| main.rs:309:28:309:29 | r1 [Ok] | main.rs:309:28:309:34 | r1.ok() [Some] | provenance | MaD:24 | | main.rs:309:28:309:34 | r1.ok() [Some] | main.rs:309:9:309:11 | o1a [Some] | provenance | | -| main.rs:311:10:311:12 | o1a [Some] | main.rs:311:10:311:21 | o1a.unwrap() | provenance | MaD:15 | +| main.rs:311:10:311:12 | o1a [Some] | main.rs:311:10:311:21 | o1a.unwrap() | provenance | MaD:16 | | main.rs:314:9:314:10 | r2 [Err] | main.rs:316:28:316:29 | r2 [Err] | provenance | | | main.rs:314:32:314:46 | Err(...) [Err] | main.rs:314:9:314:10 | r2 [Err] | provenance | | | main.rs:314:36:314:45 | source(...) | main.rs:314:32:314:46 | Err(...) [Err] | provenance | | | main.rs:316:9:316:11 | o2b [Some] | main.rs:318:10:318:12 | o2b [Some] | provenance | | -| main.rs:316:28:316:29 | r2 [Err] | main.rs:316:28:316:35 | r2.err() [Some] | provenance | MaD:20 | +| main.rs:316:28:316:29 | r2 [Err] | main.rs:316:28:316:35 | r2.err() [Some] | provenance | MaD:21 | | main.rs:316:28:316:35 | r2.err() [Some] | main.rs:316:9:316:11 | o2b [Some] | provenance | | -| main.rs:318:10:318:12 | o2b [Some] | main.rs:318:10:318:21 | o2b.unwrap() | provenance | MaD:15 | +| main.rs:318:10:318:12 | o2b [Some] | main.rs:318:10:318:21 | o2b.unwrap() | provenance | MaD:16 | | main.rs:322:9:322:10 | s1 [Ok] | main.rs:325:14:325:15 | s1 [Ok] | provenance | | | main.rs:322:32:322:45 | Ok(...) [Ok] | main.rs:322:9:322:10 | s1 [Ok] | provenance | | | main.rs:322:35:322:44 | source(...) | main.rs:322:32:322:45 | Ok(...) [Ok] | provenance | | @@ -174,11 +175,11 @@ edges | main.rs:335:9:335:10 | s1 [Ok] | main.rs:336:10:336:11 | s1 [Ok] | provenance | | | main.rs:335:32:335:45 | Ok(...) [Ok] | main.rs:335:9:335:10 | s1 [Ok] | provenance | | | main.rs:335:35:335:44 | source(...) | main.rs:335:32:335:45 | Ok(...) [Ok] | provenance | | -| main.rs:336:10:336:11 | s1 [Ok] | main.rs:336:10:336:22 | s1.expect(...) | provenance | MaD:21 | +| main.rs:336:10:336:11 | s1 [Ok] | main.rs:336:10:336:22 | s1.expect(...) | provenance | MaD:22 | | main.rs:339:9:339:10 | s2 [Err] | main.rs:341:10:341:11 | s2 [Err] | provenance | | | main.rs:339:32:339:46 | Err(...) [Err] | main.rs:339:9:339:10 | s2 [Err] | provenance | | | main.rs:339:36:339:45 | source(...) | main.rs:339:32:339:46 | Err(...) [Err] | provenance | | -| main.rs:341:10:341:11 | s2 [Err] | main.rs:341:10:341:26 | s2.expect_err(...) | provenance | MaD:22 | +| main.rs:341:10:341:11 | s2 [Err] | main.rs:341:10:341:26 | s2.expect_err(...) | provenance | MaD:23 | | main.rs:350:9:350:10 | s1 [A] | main.rs:352:11:352:12 | s1 [A] | provenance | | | main.rs:350:14:350:39 | ...::A(...) [A] | main.rs:350:9:350:10 | s1 [A] | provenance | | | main.rs:350:29:350:38 | source(...) | main.rs:350:14:350:39 | ...::A(...) [A] | provenance | | @@ -227,13 +228,13 @@ edges | main.rs:430:16:430:33 | [...] [element] | main.rs:430:9:430:12 | arr1 [element] | provenance | | | main.rs:430:23:430:32 | source(...) | main.rs:430:16:430:33 | [...] [element] | provenance | | | main.rs:431:9:431:10 | n1 | main.rs:432:10:432:11 | n1 | provenance | | -| main.rs:431:14:431:17 | arr1 [element] | main.rs:431:14:431:20 | arr1[2] | provenance | MaD:14 | +| main.rs:431:14:431:17 | arr1 [element] | main.rs:431:14:431:20 | arr1[2] | provenance | MaD:15 | | main.rs:431:14:431:20 | arr1[2] | main.rs:431:9:431:10 | n1 | provenance | | | main.rs:434:9:434:12 | arr2 [element] | main.rs:435:14:435:17 | arr2 [element] | provenance | | | main.rs:434:16:434:31 | [...; 10] [element] | main.rs:434:9:434:12 | arr2 [element] | provenance | | | main.rs:434:17:434:26 | source(...) | main.rs:434:16:434:31 | [...; 10] [element] | provenance | | | main.rs:435:9:435:10 | n2 | main.rs:436:10:436:11 | n2 | provenance | | -| main.rs:435:14:435:17 | arr2 [element] | main.rs:435:14:435:20 | arr2[4] | provenance | MaD:14 | +| main.rs:435:14:435:17 | arr2 [element] | main.rs:435:14:435:20 | arr2[4] | provenance | MaD:15 | | main.rs:435:14:435:20 | arr2[4] | main.rs:435:9:435:10 | n2 | provenance | | | main.rs:444:9:444:12 | arr1 [element] | main.rs:445:15:445:18 | arr1 [element] | provenance | | | main.rs:444:16:444:33 | [...] [element] | main.rs:444:9:444:12 | arr1 [element] | provenance | | @@ -254,9 +255,9 @@ edges | main.rs:470:5:470:11 | [post] mut_arr [element] | main.rs:473:10:473:16 | mut_arr [element] | provenance | | | main.rs:470:18:470:27 | source(...) | main.rs:470:5:470:11 | [post] mut_arr [element] | provenance | | | main.rs:471:9:471:9 | d | main.rs:472:10:472:10 | d | provenance | | -| main.rs:471:13:471:19 | mut_arr [element] | main.rs:471:13:471:22 | mut_arr[1] | provenance | MaD:14 | +| main.rs:471:13:471:19 | mut_arr [element] | main.rs:471:13:471:22 | mut_arr[1] | provenance | MaD:15 | | main.rs:471:13:471:22 | mut_arr[1] | main.rs:471:9:471:9 | d | provenance | | -| main.rs:473:10:473:16 | mut_arr [element] | main.rs:473:10:473:19 | mut_arr[0] | provenance | MaD:14 | +| main.rs:473:10:473:16 | mut_arr [element] | main.rs:473:10:473:19 | mut_arr[0] | provenance | MaD:15 | | main.rs:496:9:496:9 | s | main.rs:497:10:497:10 | s | provenance | | | main.rs:496:25:496:26 | source(...) | main.rs:496:9:496:9 | s | provenance | | | main.rs:505:9:505:9 | a | main.rs:506:13:506:13 | a | provenance | | @@ -269,11 +270,11 @@ edges | main.rs:506:13:506:25 | a.to_string() | main.rs:506:9:506:9 | b | provenance | | | main.rs:507:9:507:9 | c | main.rs:512:10:512:10 | c | provenance | | | main.rs:507:13:507:13 | b | main.rs:507:13:507:28 | b.parse() [Ok] | provenance | MaD:5 | -| main.rs:507:13:507:28 | b.parse() [Ok] | main.rs:507:13:507:37 | ... .unwrap() | provenance | MaD:24 | +| main.rs:507:13:507:28 | b.parse() [Ok] | main.rs:507:13:507:37 | ... .unwrap() | provenance | MaD:25 | | main.rs:507:13:507:37 | ... .unwrap() | main.rs:507:9:507:9 | c | provenance | | | main.rs:508:9:508:9 | d | main.rs:513:10:513:10 | d | provenance | | | main.rs:508:18:508:18 | b | main.rs:508:18:508:26 | b.parse() [Ok] | provenance | MaD:5 | -| main.rs:508:18:508:26 | b.parse() [Ok] | main.rs:508:18:508:35 | ... .unwrap() | provenance | MaD:24 | +| main.rs:508:18:508:26 | b.parse() [Ok] | main.rs:508:18:508:35 | ... .unwrap() | provenance | MaD:25 | | main.rs:508:18:508:35 | ... .unwrap() | main.rs:508:9:508:9 | d | provenance | | | main.rs:517:9:517:10 | vs [element] | main.rs:519:10:519:11 | vs [element] | provenance | | | main.rs:517:9:517:10 | vs [element] | main.rs:520:11:520:12 | vs [element] | provenance | | @@ -281,17 +282,18 @@ edges | main.rs:517:9:517:10 | vs [element] | main.rs:523:14:523:15 | vs [element] | provenance | | | main.rs:517:9:517:10 | vs [element] | main.rs:526:15:526:16 | vs [element] | provenance | | | main.rs:517:9:517:10 | vs [element] | main.rs:530:26:530:27 | vs [element] | provenance | | -| main.rs:517:9:517:10 | vs [element] | main.rs:535:5:535:6 | vs [element] | provenance | | +| main.rs:517:9:517:10 | vs [element] | main.rs:537:5:537:6 | vs [element] | provenance | | +| main.rs:517:9:517:10 | vs [element] | main.rs:538:5:538:6 | vs [element] | provenance | | | main.rs:517:14:517:34 | [...] [element] | main.rs:517:9:517:10 | vs [element] | provenance | | | main.rs:517:15:517:24 | source(...) | main.rs:517:14:517:34 | [...] [element] | provenance | | -| main.rs:519:10:519:11 | vs [element] | main.rs:519:10:519:14 | vs[0] | provenance | MaD:14 | +| main.rs:519:10:519:11 | vs [element] | main.rs:519:10:519:14 | vs[0] | provenance | MaD:15 | | main.rs:520:11:520:12 | vs [element] | main.rs:520:11:520:19 | vs.iter() [element, &ref] | provenance | MaD:2 | -| main.rs:520:11:520:19 | vs.iter() [element, &ref] | main.rs:520:11:520:26 | ... .next() [Some, &ref] | provenance | MaD:12 | -| main.rs:520:11:520:26 | ... .next() [Some, &ref] | main.rs:520:11:520:35 | ... .unwrap() [&ref] | provenance | MaD:15 | +| main.rs:520:11:520:19 | vs.iter() [element, &ref] | main.rs:520:11:520:26 | ... .next() [Some, &ref] | provenance | MaD:13 | +| main.rs:520:11:520:26 | ... .next() [Some, &ref] | main.rs:520:11:520:35 | ... .unwrap() [&ref] | provenance | MaD:16 | | main.rs:520:11:520:35 | ... .unwrap() [&ref] | main.rs:520:10:520:35 | * ... | provenance | MaD:1 | | main.rs:521:11:521:12 | vs [element] | main.rs:521:11:521:19 | vs.iter() [element, &ref] | provenance | MaD:2 | -| main.rs:521:11:521:19 | vs.iter() [element, &ref] | main.rs:521:11:521:26 | ... .nth(...) [Some, &ref] | provenance | MaD:13 | -| main.rs:521:11:521:26 | ... .nth(...) [Some, &ref] | main.rs:521:11:521:35 | ... .unwrap() [&ref] | provenance | MaD:15 | +| main.rs:521:11:521:19 | vs.iter() [element, &ref] | main.rs:521:11:521:26 | ... .nth(...) [Some, &ref] | provenance | MaD:14 | +| main.rs:521:11:521:26 | ... .nth(...) [Some, &ref] | main.rs:521:11:521:35 | ... .unwrap() [&ref] | provenance | MaD:16 | | main.rs:521:11:521:35 | ... .unwrap() [&ref] | main.rs:521:10:521:35 | * ... | provenance | MaD:1 | | main.rs:523:9:523:9 | v | main.rs:524:14:524:14 | v | provenance | | | main.rs:523:14:523:15 | vs [element] | main.rs:523:9:523:9 | v | provenance | | @@ -306,55 +308,63 @@ edges | main.rs:531:9:531:10 | &... [&ref] | main.rs:531:10:531:10 | v | provenance | | | main.rs:531:10:531:10 | v | main.rs:532:14:532:14 | v | provenance | | | main.rs:531:15:531:17 | vs2 [element, &ref] | main.rs:531:9:531:10 | &... [&ref] | provenance | | -| main.rs:535:5:535:6 | vs [element] | main.rs:535:5:535:13 | vs.iter() [element, &ref] | provenance | MaD:2 | -| main.rs:535:5:535:13 | vs.iter() [element, &ref] | main.rs:535:20:535:20 | ... [&ref] | provenance | MaD:11 | -| main.rs:535:20:535:20 | ... [&ref] | main.rs:535:29:535:29 | x [&ref] | provenance | | -| main.rs:535:29:535:29 | x [&ref] | main.rs:535:28:535:29 | * ... | provenance | MaD:1 | -| main.rs:542:9:542:18 | mut vs_mut [element] | main.rs:544:10:544:15 | vs_mut [element] | provenance | | -| main.rs:542:9:542:18 | mut vs_mut [element] | main.rs:545:11:545:16 | vs_mut [element] | provenance | | -| main.rs:542:9:542:18 | mut vs_mut [element] | main.rs:546:11:546:16 | vs_mut [element] | provenance | | -| main.rs:542:9:542:18 | mut vs_mut [element] | main.rs:548:19:548:24 | vs_mut [element] | provenance | | -| main.rs:542:22:542:42 | [...] [element] | main.rs:542:9:542:18 | mut vs_mut [element] | provenance | | -| main.rs:542:23:542:32 | source(...) | main.rs:542:22:542:42 | [...] [element] | provenance | | -| main.rs:544:10:544:15 | vs_mut [element] | main.rs:544:10:544:18 | vs_mut[0] | provenance | MaD:14 | -| main.rs:545:11:545:16 | vs_mut [element] | main.rs:545:11:545:23 | vs_mut.iter() [element, &ref] | provenance | MaD:2 | -| main.rs:545:11:545:23 | vs_mut.iter() [element, &ref] | main.rs:545:11:545:30 | ... .next() [Some, &ref] | provenance | MaD:12 | -| main.rs:545:11:545:30 | ... .next() [Some, &ref] | main.rs:545:11:545:39 | ... .unwrap() [&ref] | provenance | MaD:15 | -| main.rs:545:11:545:39 | ... .unwrap() [&ref] | main.rs:545:10:545:39 | * ... | provenance | MaD:1 | -| main.rs:546:11:546:16 | vs_mut [element] | main.rs:546:11:546:23 | vs_mut.iter() [element, &ref] | provenance | MaD:2 | -| main.rs:546:11:546:23 | vs_mut.iter() [element, &ref] | main.rs:546:11:546:30 | ... .nth(...) [Some, &ref] | provenance | MaD:13 | -| main.rs:546:11:546:30 | ... .nth(...) [Some, &ref] | main.rs:546:11:546:39 | ... .unwrap() [&ref] | provenance | MaD:15 | -| main.rs:546:11:546:39 | ... .unwrap() [&ref] | main.rs:546:10:546:39 | * ... | provenance | MaD:1 | -| main.rs:548:9:548:14 | &mut ... [&ref] | main.rs:548:14:548:14 | v | provenance | | -| main.rs:548:14:548:14 | v | main.rs:549:14:549:14 | v | provenance | | -| main.rs:548:19:548:24 | vs_mut [element] | main.rs:548:19:548:35 | vs_mut.iter_mut() [element, &ref] | provenance | MaD:2 | -| main.rs:548:19:548:35 | vs_mut.iter_mut() [element, &ref] | main.rs:548:9:548:14 | &mut ... [&ref] | provenance | | -| main.rs:554:9:554:9 | a | main.rs:559:10:559:10 | a | provenance | | -| main.rs:554:13:554:22 | source(...) | main.rs:554:9:554:9 | a | provenance | | -| main.rs:555:9:555:9 | b | main.rs:560:15:560:15 | b | provenance | | -| main.rs:555:13:555:22 | source(...) | main.rs:555:9:555:9 | b | provenance | | -| main.rs:556:9:556:9 | c | main.rs:557:18:557:18 | c | provenance | | -| main.rs:556:13:556:22 | source(...) | main.rs:556:9:556:9 | c | provenance | | -| main.rs:557:9:557:13 | c_ref [&ref] | main.rs:561:14:561:18 | c_ref | provenance | | -| main.rs:557:9:557:13 | c_ref [&ref] | main.rs:562:11:562:15 | c_ref [&ref] | provenance | | -| main.rs:557:17:557:18 | &c [&ref] | main.rs:557:9:557:13 | c_ref [&ref] | provenance | | -| main.rs:557:18:557:18 | c | main.rs:557:17:557:18 | &c [&ref] | provenance | | -| main.rs:560:15:560:15 | b | main.rs:560:14:560:15 | &b | provenance | | -| main.rs:562:11:562:15 | c_ref [&ref] | main.rs:562:10:562:15 | * ... | provenance | MaD:1 | -| main.rs:566:9:566:9 | a | main.rs:568:10:568:17 | a as i64 | provenance | | -| main.rs:566:9:566:9 | a | main.rs:569:10:569:10 | a | provenance | | -| main.rs:566:9:566:9 | a | main.rs:570:20:570:20 | a | provenance | | -| main.rs:566:18:566:27 | source(...) | main.rs:566:9:566:9 | a | provenance | | -| main.rs:569:10:569:10 | a | main.rs:569:10:569:17 | a.into() | provenance | MaD:7 | -| main.rs:569:10:569:10 | a | main.rs:569:10:569:17 | a.into() | provenance | MaD:8 | -| main.rs:570:20:570:20 | a | main.rs:570:10:570:21 | ...::from(...) | provenance | ReflexiveFrom | -| main.rs:572:9:572:9 | b | main.rs:574:10:574:17 | b as i64 | provenance | | -| main.rs:572:9:572:9 | b | main.rs:575:10:575:10 | b | provenance | | -| main.rs:572:9:572:9 | b | main.rs:576:20:576:20 | b | provenance | | -| main.rs:572:18:572:27 | source(...) | main.rs:572:9:572:9 | b | provenance | | -| main.rs:575:10:575:10 | b | main.rs:575:10:575:17 | b.into() | provenance | MaD:7 | -| main.rs:575:10:575:10 | b | main.rs:575:10:575:17 | b.into() | provenance | MaD:8 | -| main.rs:576:20:576:20 | b | main.rs:576:10:576:21 | ...::from(...) | provenance | MaD:9 | +| main.rs:535:9:535:16 | captured | main.rs:538:24:541:5 | \|...\| ... : ... => .. [captured captured] | provenance | | +| main.rs:535:20:535:29 | source(...) | main.rs:535:9:535:16 | captured | provenance | | +| main.rs:537:5:537:6 | vs [element] | main.rs:537:5:537:13 | vs.iter() [element, &ref] | provenance | MaD:2 | +| main.rs:537:5:537:13 | vs.iter() [element, &ref] | main.rs:537:20:537:20 | ... [&ref] | provenance | MaD:12 | +| main.rs:537:20:537:20 | ... [&ref] | main.rs:537:29:537:29 | x [&ref] | provenance | | +| main.rs:537:29:537:29 | x [&ref] | main.rs:537:28:537:29 | * ... | provenance | MaD:1 | +| main.rs:538:5:538:6 | vs [element] | main.rs:538:5:538:13 | vs.iter() [element, &ref] | provenance | MaD:2 | +| main.rs:538:5:538:13 | vs.iter() [element, &ref] | main.rs:538:25:538:25 | ... [&ref] | provenance | MaD:11 | +| main.rs:538:24:541:5 | \|...\| ... : ... => .. [captured captured] | main.rs:540:14:540:21 | captured | provenance | MaD:11 | +| main.rs:538:24:541:5 | \|...\| ... : ... => .. [captured captured] | main.rs:540:14:540:21 | captured | provenance | heuristic-callback | +| main.rs:538:25:538:25 | ... [&ref] | main.rs:539:15:539:15 | x [&ref] | provenance | | +| main.rs:539:15:539:15 | x [&ref] | main.rs:539:14:539:15 | * ... | provenance | MaD:1 | +| main.rs:547:9:547:18 | mut vs_mut [element] | main.rs:549:10:549:15 | vs_mut [element] | provenance | | +| main.rs:547:9:547:18 | mut vs_mut [element] | main.rs:550:11:550:16 | vs_mut [element] | provenance | | +| main.rs:547:9:547:18 | mut vs_mut [element] | main.rs:551:11:551:16 | vs_mut [element] | provenance | | +| main.rs:547:9:547:18 | mut vs_mut [element] | main.rs:553:19:553:24 | vs_mut [element] | provenance | | +| main.rs:547:22:547:42 | [...] [element] | main.rs:547:9:547:18 | mut vs_mut [element] | provenance | | +| main.rs:547:23:547:32 | source(...) | main.rs:547:22:547:42 | [...] [element] | provenance | | +| main.rs:549:10:549:15 | vs_mut [element] | main.rs:549:10:549:18 | vs_mut[0] | provenance | MaD:15 | +| main.rs:550:11:550:16 | vs_mut [element] | main.rs:550:11:550:23 | vs_mut.iter() [element, &ref] | provenance | MaD:2 | +| main.rs:550:11:550:23 | vs_mut.iter() [element, &ref] | main.rs:550:11:550:30 | ... .next() [Some, &ref] | provenance | MaD:13 | +| main.rs:550:11:550:30 | ... .next() [Some, &ref] | main.rs:550:11:550:39 | ... .unwrap() [&ref] | provenance | MaD:16 | +| main.rs:550:11:550:39 | ... .unwrap() [&ref] | main.rs:550:10:550:39 | * ... | provenance | MaD:1 | +| main.rs:551:11:551:16 | vs_mut [element] | main.rs:551:11:551:23 | vs_mut.iter() [element, &ref] | provenance | MaD:2 | +| main.rs:551:11:551:23 | vs_mut.iter() [element, &ref] | main.rs:551:11:551:30 | ... .nth(...) [Some, &ref] | provenance | MaD:14 | +| main.rs:551:11:551:30 | ... .nth(...) [Some, &ref] | main.rs:551:11:551:39 | ... .unwrap() [&ref] | provenance | MaD:16 | +| main.rs:551:11:551:39 | ... .unwrap() [&ref] | main.rs:551:10:551:39 | * ... | provenance | MaD:1 | +| main.rs:553:9:553:14 | &mut ... [&ref] | main.rs:553:14:553:14 | v | provenance | | +| main.rs:553:14:553:14 | v | main.rs:554:14:554:14 | v | provenance | | +| main.rs:553:19:553:24 | vs_mut [element] | main.rs:553:19:553:35 | vs_mut.iter_mut() [element, &ref] | provenance | MaD:2 | +| main.rs:553:19:553:35 | vs_mut.iter_mut() [element, &ref] | main.rs:553:9:553:14 | &mut ... [&ref] | provenance | | +| main.rs:559:9:559:9 | a | main.rs:564:10:564:10 | a | provenance | | +| main.rs:559:13:559:22 | source(...) | main.rs:559:9:559:9 | a | provenance | | +| main.rs:560:9:560:9 | b | main.rs:565:15:565:15 | b | provenance | | +| main.rs:560:13:560:22 | source(...) | main.rs:560:9:560:9 | b | provenance | | +| main.rs:561:9:561:9 | c | main.rs:562:18:562:18 | c | provenance | | +| main.rs:561:13:561:22 | source(...) | main.rs:561:9:561:9 | c | provenance | | +| main.rs:562:9:562:13 | c_ref [&ref] | main.rs:566:14:566:18 | c_ref | provenance | | +| main.rs:562:9:562:13 | c_ref [&ref] | main.rs:567:11:567:15 | c_ref [&ref] | provenance | | +| main.rs:562:17:562:18 | &c [&ref] | main.rs:562:9:562:13 | c_ref [&ref] | provenance | | +| main.rs:562:18:562:18 | c | main.rs:562:17:562:18 | &c [&ref] | provenance | | +| main.rs:565:15:565:15 | b | main.rs:565:14:565:15 | &b | provenance | | +| main.rs:567:11:567:15 | c_ref [&ref] | main.rs:567:10:567:15 | * ... | provenance | MaD:1 | +| main.rs:571:9:571:9 | a | main.rs:573:10:573:17 | a as i64 | provenance | | +| main.rs:571:9:571:9 | a | main.rs:574:10:574:10 | a | provenance | | +| main.rs:571:9:571:9 | a | main.rs:575:20:575:20 | a | provenance | | +| main.rs:571:18:571:27 | source(...) | main.rs:571:9:571:9 | a | provenance | | +| main.rs:574:10:574:10 | a | main.rs:574:10:574:17 | a.into() | provenance | MaD:7 | +| main.rs:574:10:574:10 | a | main.rs:574:10:574:17 | a.into() | provenance | MaD:8 | +| main.rs:575:20:575:20 | a | main.rs:575:10:575:21 | ...::from(...) | provenance | ReflexiveFrom | +| main.rs:577:9:577:9 | b | main.rs:579:10:579:17 | b as i64 | provenance | | +| main.rs:577:9:577:9 | b | main.rs:580:10:580:10 | b | provenance | | +| main.rs:577:9:577:9 | b | main.rs:581:20:581:20 | b | provenance | | +| main.rs:577:18:577:27 | source(...) | main.rs:577:9:577:9 | b | provenance | | +| main.rs:580:10:580:10 | b | main.rs:580:10:580:17 | b.into() | provenance | MaD:7 | +| main.rs:580:10:580:10 | b | main.rs:580:10:580:17 | b.into() | provenance | MaD:8 | +| main.rs:581:20:581:20 | b | main.rs:581:10:581:21 | ...::from(...) | provenance | MaD:9 | nodes | main.rs:19:10:19:18 | source(...) | semmle.label | source(...) | | main.rs:23:9:23:9 | s | semmle.label | s | @@ -422,7 +432,7 @@ nodes | main.rs:148:14:148:14 | a [tuple.1] | semmle.label | a [tuple.1] | | main.rs:150:10:150:10 | b [tuple.0, tuple.1] | semmle.label | b [tuple.0, tuple.1] | | main.rs:150:10:150:12 | b.0 [tuple.1] | semmle.label | b.0 [tuple.1] | -| main.rs:150:10:150:15 | ... .1 | semmle.label | ... .1 | +| main.rs:150:10:150:14 | ... .1 | semmle.label | ... .1 | | main.rs:163:9:163:9 | p [Point.x] | semmle.label | p [Point.x] | | main.rs:163:13:163:40 | Point {...} [Point.x] | semmle.label | Point {...} [Point.x] | | main.rs:163:24:163:32 | source(...) | semmle.label | source(...) | @@ -683,60 +693,69 @@ nodes | main.rs:531:10:531:10 | v | semmle.label | v | | main.rs:531:15:531:17 | vs2 [element, &ref] | semmle.label | vs2 [element, &ref] | | main.rs:532:14:532:14 | v | semmle.label | v | -| main.rs:535:5:535:6 | vs [element] | semmle.label | vs [element] | -| main.rs:535:5:535:13 | vs.iter() [element, &ref] | semmle.label | vs.iter() [element, &ref] | -| main.rs:535:20:535:20 | ... [&ref] | semmle.label | ... [&ref] | -| main.rs:535:28:535:29 | * ... | semmle.label | * ... | -| main.rs:535:29:535:29 | x [&ref] | semmle.label | x [&ref] | -| main.rs:542:9:542:18 | mut vs_mut [element] | semmle.label | mut vs_mut [element] | -| main.rs:542:22:542:42 | [...] [element] | semmle.label | [...] [element] | -| main.rs:542:23:542:32 | source(...) | semmle.label | source(...) | -| main.rs:544:10:544:15 | vs_mut [element] | semmle.label | vs_mut [element] | -| main.rs:544:10:544:18 | vs_mut[0] | semmle.label | vs_mut[0] | -| main.rs:545:10:545:39 | * ... | semmle.label | * ... | -| main.rs:545:11:545:16 | vs_mut [element] | semmle.label | vs_mut [element] | -| main.rs:545:11:545:23 | vs_mut.iter() [element, &ref] | semmle.label | vs_mut.iter() [element, &ref] | -| main.rs:545:11:545:30 | ... .next() [Some, &ref] | semmle.label | ... .next() [Some, &ref] | -| main.rs:545:11:545:39 | ... .unwrap() [&ref] | semmle.label | ... .unwrap() [&ref] | -| main.rs:546:10:546:39 | * ... | semmle.label | * ... | -| main.rs:546:11:546:16 | vs_mut [element] | semmle.label | vs_mut [element] | -| main.rs:546:11:546:23 | vs_mut.iter() [element, &ref] | semmle.label | vs_mut.iter() [element, &ref] | -| main.rs:546:11:546:30 | ... .nth(...) [Some, &ref] | semmle.label | ... .nth(...) [Some, &ref] | -| main.rs:546:11:546:39 | ... .unwrap() [&ref] | semmle.label | ... .unwrap() [&ref] | -| main.rs:548:9:548:14 | &mut ... [&ref] | semmle.label | &mut ... [&ref] | -| main.rs:548:14:548:14 | v | semmle.label | v | -| main.rs:548:19:548:24 | vs_mut [element] | semmle.label | vs_mut [element] | -| main.rs:548:19:548:35 | vs_mut.iter_mut() [element, &ref] | semmle.label | vs_mut.iter_mut() [element, &ref] | -| main.rs:549:14:549:14 | v | semmle.label | v | -| main.rs:554:9:554:9 | a | semmle.label | a | -| main.rs:554:13:554:22 | source(...) | semmle.label | source(...) | -| main.rs:555:9:555:9 | b | semmle.label | b | -| main.rs:555:13:555:22 | source(...) | semmle.label | source(...) | -| main.rs:556:9:556:9 | c | semmle.label | c | -| main.rs:556:13:556:22 | source(...) | semmle.label | source(...) | -| main.rs:557:9:557:13 | c_ref [&ref] | semmle.label | c_ref [&ref] | -| main.rs:557:17:557:18 | &c [&ref] | semmle.label | &c [&ref] | -| main.rs:557:18:557:18 | c | semmle.label | c | -| main.rs:559:10:559:10 | a | semmle.label | a | -| main.rs:560:14:560:15 | &b | semmle.label | &b | -| main.rs:560:15:560:15 | b | semmle.label | b | -| main.rs:561:14:561:18 | c_ref | semmle.label | c_ref | -| main.rs:562:10:562:15 | * ... | semmle.label | * ... | -| main.rs:562:11:562:15 | c_ref [&ref] | semmle.label | c_ref [&ref] | -| main.rs:566:9:566:9 | a | semmle.label | a | -| main.rs:566:18:566:27 | source(...) | semmle.label | source(...) | -| main.rs:568:10:568:17 | a as i64 | semmle.label | a as i64 | -| main.rs:569:10:569:10 | a | semmle.label | a | -| main.rs:569:10:569:17 | a.into() | semmle.label | a.into() | -| main.rs:570:10:570:21 | ...::from(...) | semmle.label | ...::from(...) | -| main.rs:570:20:570:20 | a | semmle.label | a | -| main.rs:572:9:572:9 | b | semmle.label | b | -| main.rs:572:18:572:27 | source(...) | semmle.label | source(...) | -| main.rs:574:10:574:17 | b as i64 | semmle.label | b as i64 | -| main.rs:575:10:575:10 | b | semmle.label | b | -| main.rs:575:10:575:17 | b.into() | semmle.label | b.into() | -| main.rs:576:10:576:21 | ...::from(...) | semmle.label | ...::from(...) | -| main.rs:576:20:576:20 | b | semmle.label | b | +| main.rs:535:9:535:16 | captured | semmle.label | captured | +| main.rs:535:20:535:29 | source(...) | semmle.label | source(...) | +| main.rs:537:5:537:6 | vs [element] | semmle.label | vs [element] | +| main.rs:537:5:537:13 | vs.iter() [element, &ref] | semmle.label | vs.iter() [element, &ref] | +| main.rs:537:20:537:20 | ... [&ref] | semmle.label | ... [&ref] | +| main.rs:537:28:537:29 | * ... | semmle.label | * ... | +| main.rs:537:29:537:29 | x [&ref] | semmle.label | x [&ref] | +| main.rs:538:5:538:6 | vs [element] | semmle.label | vs [element] | +| main.rs:538:5:538:13 | vs.iter() [element, &ref] | semmle.label | vs.iter() [element, &ref] | +| main.rs:538:24:541:5 | \|...\| ... : ... => .. [captured captured] | semmle.label | \|...\| ... : ... => .. [captured captured] | +| main.rs:538:25:538:25 | ... [&ref] | semmle.label | ... [&ref] | +| main.rs:539:14:539:15 | * ... | semmle.label | * ... | +| main.rs:539:15:539:15 | x [&ref] | semmle.label | x [&ref] | +| main.rs:540:14:540:21 | captured | semmle.label | captured | +| main.rs:547:9:547:18 | mut vs_mut [element] | semmle.label | mut vs_mut [element] | +| main.rs:547:22:547:42 | [...] [element] | semmle.label | [...] [element] | +| main.rs:547:23:547:32 | source(...) | semmle.label | source(...) | +| main.rs:549:10:549:15 | vs_mut [element] | semmle.label | vs_mut [element] | +| main.rs:549:10:549:18 | vs_mut[0] | semmle.label | vs_mut[0] | +| main.rs:550:10:550:39 | * ... | semmle.label | * ... | +| main.rs:550:11:550:16 | vs_mut [element] | semmle.label | vs_mut [element] | +| main.rs:550:11:550:23 | vs_mut.iter() [element, &ref] | semmle.label | vs_mut.iter() [element, &ref] | +| main.rs:550:11:550:30 | ... .next() [Some, &ref] | semmle.label | ... .next() [Some, &ref] | +| main.rs:550:11:550:39 | ... .unwrap() [&ref] | semmle.label | ... .unwrap() [&ref] | +| main.rs:551:10:551:39 | * ... | semmle.label | * ... | +| main.rs:551:11:551:16 | vs_mut [element] | semmle.label | vs_mut [element] | +| main.rs:551:11:551:23 | vs_mut.iter() [element, &ref] | semmle.label | vs_mut.iter() [element, &ref] | +| main.rs:551:11:551:30 | ... .nth(...) [Some, &ref] | semmle.label | ... .nth(...) [Some, &ref] | +| main.rs:551:11:551:39 | ... .unwrap() [&ref] | semmle.label | ... .unwrap() [&ref] | +| main.rs:553:9:553:14 | &mut ... [&ref] | semmle.label | &mut ... [&ref] | +| main.rs:553:14:553:14 | v | semmle.label | v | +| main.rs:553:19:553:24 | vs_mut [element] | semmle.label | vs_mut [element] | +| main.rs:553:19:553:35 | vs_mut.iter_mut() [element, &ref] | semmle.label | vs_mut.iter_mut() [element, &ref] | +| main.rs:554:14:554:14 | v | semmle.label | v | +| main.rs:559:9:559:9 | a | semmle.label | a | +| main.rs:559:13:559:22 | source(...) | semmle.label | source(...) | +| main.rs:560:9:560:9 | b | semmle.label | b | +| main.rs:560:13:560:22 | source(...) | semmle.label | source(...) | +| main.rs:561:9:561:9 | c | semmle.label | c | +| main.rs:561:13:561:22 | source(...) | semmle.label | source(...) | +| main.rs:562:9:562:13 | c_ref [&ref] | semmle.label | c_ref [&ref] | +| main.rs:562:17:562:18 | &c [&ref] | semmle.label | &c [&ref] | +| main.rs:562:18:562:18 | c | semmle.label | c | +| main.rs:564:10:564:10 | a | semmle.label | a | +| main.rs:565:14:565:15 | &b | semmle.label | &b | +| main.rs:565:15:565:15 | b | semmle.label | b | +| main.rs:566:14:566:18 | c_ref | semmle.label | c_ref | +| main.rs:567:10:567:15 | * ... | semmle.label | * ... | +| main.rs:567:11:567:15 | c_ref [&ref] | semmle.label | c_ref [&ref] | +| main.rs:571:9:571:9 | a | semmle.label | a | +| main.rs:571:18:571:27 | source(...) | semmle.label | source(...) | +| main.rs:573:10:573:17 | a as i64 | semmle.label | a as i64 | +| main.rs:574:10:574:10 | a | semmle.label | a | +| main.rs:574:10:574:17 | a.into() | semmle.label | a.into() | +| main.rs:575:10:575:21 | ...::from(...) | semmle.label | ...::from(...) | +| main.rs:575:20:575:20 | a | semmle.label | a | +| main.rs:577:9:577:9 | b | semmle.label | b | +| main.rs:577:18:577:27 | source(...) | semmle.label | source(...) | +| main.rs:579:10:579:17 | b as i64 | semmle.label | b as i64 | +| main.rs:580:10:580:10 | b | semmle.label | b | +| main.rs:580:10:580:17 | b.into() | semmle.label | b.into() | +| main.rs:581:10:581:21 | ...::from(...) | semmle.label | ...::from(...) | +| main.rs:581:20:581:20 | b | semmle.label | b | subpaths testFailures #select @@ -757,7 +776,7 @@ testFailures | main.rs:132:10:132:11 | a1 | main.rs:129:17:129:26 | source(...) | main.rs:132:10:132:11 | a1 | $@ | main.rs:129:17:129:26 | source(...) | source(...) | | main.rs:139:10:139:12 | a.1 | main.rs:137:21:137:30 | source(...) | main.rs:139:10:139:12 | a.1 | $@ | main.rs:137:21:137:30 | source(...) | source(...) | | main.rs:142:10:142:12 | a.0 | main.rs:140:11:140:20 | source(...) | main.rs:142:10:142:12 | a.0 | $@ | main.rs:140:11:140:20 | source(...) | source(...) | -| main.rs:150:10:150:15 | ... .1 | main.rs:147:17:147:26 | source(...) | main.rs:150:10:150:15 | ... .1 | $@ | main.rs:147:17:147:26 | source(...) | source(...) | +| main.rs:150:10:150:14 | ... .1 | main.rs:147:17:147:26 | source(...) | main.rs:150:10:150:14 | ... .1 | $@ | main.rs:147:17:147:26 | source(...) | source(...) | | main.rs:164:10:164:12 | p.x | main.rs:163:24:163:32 | source(...) | main.rs:164:10:164:12 | p.x | $@ | main.rs:163:24:163:32 | source(...) | source(...) | | main.rs:172:10:172:12 | p.y | main.rs:171:11:171:20 | source(...) | main.rs:172:10:172:12 | p.y | $@ | main.rs:171:11:171:20 | source(...) | source(...) | | main.rs:181:10:181:10 | a | main.rs:177:12:177:21 | source(...) | main.rs:181:10:181:10 | a | $@ | main.rs:177:12:177:21 | source(...) | source(...) | @@ -807,18 +826,20 @@ testFailures | main.rs:524:14:524:14 | v | main.rs:517:15:517:24 | source(...) | main.rs:524:14:524:14 | v | $@ | main.rs:517:15:517:24 | source(...) | source(...) | | main.rs:527:14:527:14 | v | main.rs:517:15:517:24 | source(...) | main.rs:527:14:527:14 | v | $@ | main.rs:517:15:517:24 | source(...) | source(...) | | main.rs:532:14:532:14 | v | main.rs:517:15:517:24 | source(...) | main.rs:532:14:532:14 | v | $@ | main.rs:517:15:517:24 | source(...) | source(...) | -| main.rs:535:28:535:29 | * ... | main.rs:517:15:517:24 | source(...) | main.rs:535:28:535:29 | * ... | $@ | main.rs:517:15:517:24 | source(...) | source(...) | -| 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(...) | -| main.rs:545:10:545:39 | * ... | main.rs:542:23:542:32 | source(...) | main.rs:545:10:545:39 | * ... | $@ | main.rs:542:23:542:32 | source(...) | source(...) | -| main.rs:546:10:546:39 | * ... | main.rs:542:23:542:32 | source(...) | main.rs:546:10:546:39 | * ... | $@ | main.rs:542:23:542:32 | source(...) | source(...) | -| main.rs:549:14:549:14 | v | main.rs:542:23:542:32 | source(...) | main.rs:549:14:549:14 | v | $@ | main.rs:542:23:542:32 | source(...) | source(...) | -| 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(...) | -| main.rs:560:14:560:15 | &b | main.rs:555:13:555:22 | source(...) | main.rs:560:14:560:15 | &b | $@ | main.rs:555:13:555:22 | source(...) | source(...) | -| main.rs:561:14:561:18 | c_ref | main.rs:556:13:556:22 | source(...) | main.rs:561:14:561:18 | c_ref | $@ | main.rs:556:13:556:22 | source(...) | source(...) | -| 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(...) | -| main.rs:568:10:568:17 | a as i64 | main.rs:566:18:566:27 | source(...) | main.rs:568:10:568:17 | a as i64 | $@ | main.rs:566:18:566:27 | source(...) | source(...) | -| main.rs:569:10:569:17 | a.into() | main.rs:566:18:566:27 | source(...) | main.rs:569:10:569:17 | a.into() | $@ | main.rs:566:18:566:27 | source(...) | source(...) | -| main.rs:570:10:570:21 | ...::from(...) | main.rs:566:18:566:27 | source(...) | main.rs:570:10:570:21 | ...::from(...) | $@ | main.rs:566:18:566:27 | source(...) | source(...) | -| main.rs:574:10:574:17 | b as i64 | main.rs:572:18:572:27 | source(...) | main.rs:574:10:574:17 | b as i64 | $@ | main.rs:572:18:572:27 | source(...) | source(...) | -| main.rs:575:10:575:17 | b.into() | main.rs:572:18:572:27 | source(...) | main.rs:575:10:575:17 | b.into() | $@ | main.rs:572:18:572:27 | source(...) | source(...) | -| main.rs:576:10:576:21 | ...::from(...) | main.rs:572:18:572:27 | source(...) | main.rs:576:10:576:21 | ...::from(...) | $@ | main.rs:572:18:572:27 | source(...) | source(...) | +| main.rs:537:28:537:29 | * ... | main.rs:517:15:517:24 | source(...) | main.rs:537:28:537:29 | * ... | $@ | main.rs:517:15:517:24 | source(...) | source(...) | +| main.rs:539:14:539:15 | * ... | main.rs:517:15:517:24 | source(...) | main.rs:539:14:539:15 | * ... | $@ | main.rs:517:15:517:24 | source(...) | source(...) | +| main.rs:540:14:540:21 | captured | main.rs:535:20:535:29 | source(...) | main.rs:540:14:540:21 | captured | $@ | main.rs:535:20:535:29 | source(...) | source(...) | +| main.rs:549:10:549:18 | vs_mut[0] | main.rs:547:23:547:32 | source(...) | main.rs:549:10:549:18 | vs_mut[0] | $@ | main.rs:547:23:547:32 | source(...) | source(...) | +| main.rs:550:10:550:39 | * ... | main.rs:547:23:547:32 | source(...) | main.rs:550:10:550:39 | * ... | $@ | main.rs:547:23:547:32 | source(...) | source(...) | +| main.rs:551:10:551:39 | * ... | main.rs:547:23:547:32 | source(...) | main.rs:551:10:551:39 | * ... | $@ | main.rs:547:23:547:32 | source(...) | source(...) | +| main.rs:554:14:554:14 | v | main.rs:547:23:547:32 | source(...) | main.rs:554:14:554:14 | v | $@ | main.rs:547:23:547:32 | source(...) | source(...) | +| main.rs:564:10:564:10 | a | main.rs:559:13:559:22 | source(...) | main.rs:564:10:564:10 | a | $@ | main.rs:559:13:559:22 | source(...) | source(...) | +| main.rs:565:14:565:15 | &b | main.rs:560:13:560:22 | source(...) | main.rs:565:14:565:15 | &b | $@ | main.rs:560:13:560:22 | source(...) | source(...) | +| main.rs:566:14:566:18 | c_ref | main.rs:561:13:561:22 | source(...) | main.rs:566:14:566:18 | c_ref | $@ | main.rs:561:13:561:22 | source(...) | source(...) | +| main.rs:567:10:567:15 | * ... | main.rs:561:13:561:22 | source(...) | main.rs:567:10:567:15 | * ... | $@ | main.rs:561:13:561:22 | source(...) | source(...) | +| main.rs:573:10:573:17 | a as i64 | main.rs:571:18:571:27 | source(...) | main.rs:573:10:573:17 | a as i64 | $@ | main.rs:571:18:571:27 | source(...) | source(...) | +| main.rs:574:10:574:17 | a.into() | main.rs:571:18:571:27 | source(...) | main.rs:574:10:574:17 | a.into() | $@ | main.rs:571:18:571:27 | source(...) | source(...) | +| main.rs:575:10:575:21 | ...::from(...) | main.rs:571:18:571:27 | source(...) | main.rs:575:10:575:21 | ...::from(...) | $@ | main.rs:571:18:571:27 | source(...) | source(...) | +| main.rs:579:10:579:17 | b as i64 | main.rs:577:18:577:27 | source(...) | main.rs:579:10:579:17 | b as i64 | $@ | main.rs:577:18:577:27 | source(...) | source(...) | +| main.rs:580:10:580:17 | b.into() | main.rs:577:18:577:27 | source(...) | main.rs:580:10:580:17 | b.into() | $@ | main.rs:577:18:577:27 | source(...) | source(...) | +| main.rs:581:10:581:21 | ...::from(...) | main.rs:577:18:577:27 | source(...) | main.rs:581:10:581:21 | ...::from(...) | $@ | main.rs:577:18:577:27 | source(...) | source(...) | diff --git a/rust/ql/test/library-tests/dataflow/local/main.rs b/rust/ql/test/library-tests/dataflow/local/main.rs index 0a4dbaceee9b..22ed381d2b17 100644 --- a/rust/ql/test/library-tests/dataflow/local/main.rs +++ b/rust/ql/test/library-tests/dataflow/local/main.rs @@ -146,8 +146,8 @@ fn tuple_mutation() { fn tuple_nested() { let a = (3, source(59)); let b = (a, 3); - sink(b.0 .0); - sink(b.0 .1); // $ hasValueFlow=59 + sink(b.0.0); + sink(b.0.1); // $ hasValueFlow=59 sink(b.1); } @@ -532,8 +532,13 @@ fn iterators() { sink(v); // $ hasValueFlow=91 } + let captured = source(92); + vs.iter().map(|x| sink(*x)); // $ hasValueFlow=91 - vs.iter().for_each(|x| sink(*x)); // $ MISSING: hasValueFlow=91 + vs.iter().for_each(|x| { + sink(*x); // $ hasValueFlow=91 + sink(captured) // $ hasValueFlow=92 + }); for v in vs.into_iter() { sink(v); // $ MISSING: hasValueFlow=91