Skip to content

Commit 43e3f84

Browse files
authored
Merge pull request github#18188 from paldepind/rust-df-array
Rust: Basic data flow through arrays
2 parents 80be95d + 3061d4a commit 43e3f84

File tree

13 files changed

+645
-265
lines changed

13 files changed

+645
-265
lines changed

rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -623,6 +623,15 @@ private class StructFieldContent extends Content, TStructFieldContent {
623623
override string toString() { result = s.toString() + "." + field_.toString() }
624624
}
625625

626+
/**
627+
* An element in an array.
628+
*/
629+
final class ArrayElementContent extends Content, TArrayElement {
630+
ArrayElementContent() { this = TArrayElement() }
631+
632+
override string toString() { result = "array[]" }
633+
}
634+
626635
/**
627636
* Content stored at a position in a tuple.
628637
*
@@ -656,7 +665,7 @@ abstract class ContentSet extends TContentSet {
656665
abstract Content getAReadContent();
657666
}
658667

659-
final private class SingletonContentSet extends ContentSet, TSingletonContentSet {
668+
final class SingletonContentSet extends ContentSet, TSingletonContentSet {
660669
private Content c;
661670

662671
SingletonContentSet() { this = TSingletonContentSet(c) }
@@ -879,6 +888,24 @@ module RustDataFlow implements InputSig<Location> {
879888
node2.asExpr() = access
880889
)
881890
or
891+
exists(IndexExprCfgNode arr |
892+
c instanceof ArrayElementContent and
893+
node1.asExpr() = arr.getBase() and
894+
node2.asExpr() = arr
895+
)
896+
or
897+
exists(ForExprCfgNode for |
898+
c instanceof ArrayElementContent and
899+
node1.asExpr() = for.getIterable() and
900+
node2.asPat() = for.getPat()
901+
)
902+
or
903+
exists(SlicePatCfgNode pat |
904+
c instanceof ArrayElementContent and
905+
node1.asPat() = pat and
906+
node2.asPat() = pat.getAPat()
907+
)
908+
or
882909
exists(TryExprCfgNode try |
883910
node1.asExpr() = try.getExpr() and
884911
node2.asExpr() = try and
@@ -951,7 +978,21 @@ module RustDataFlow implements InputSig<Location> {
951978
node2.asExpr() = tuple
952979
)
953980
or
981+
c instanceof ArrayElementContent and
982+
node1.asExpr() =
983+
[
984+
node2.asExpr().(ArrayRepeatExprCfgNode).getRepeatOperand(),
985+
node2.asExpr().(ArrayListExprCfgNode).getAnExpr()
986+
]
987+
or
954988
tupleAssignment(node1, node2.(PostUpdateNode).getPreUpdateNode(), c)
989+
or
990+
exists(AssignmentExprCfgNode assignment, IndexExprCfgNode index |
991+
c instanceof ArrayElementContent and
992+
assignment.getLhs() = index and
993+
node1.asExpr() = assignment.getRhs() and
994+
node2.(PostUpdateNode).getPreUpdateNode().asExpr() = index.getBase()
995+
)
955996
)
956997
or
957998
FlowSummaryImpl::Private::Steps::summaryStoreStep(node1.(Node::FlowSummaryNode).getSummaryNode(),
@@ -1067,7 +1108,11 @@ private module Cached {
10671108
TPatNode(PatCfgNode p) or
10681109
TExprPostUpdateNode(ExprCfgNode e) {
10691110
isArgumentForCall(e, _, _) or
1070-
e = [any(FieldExprCfgNode access).getExpr(), any(TryExprCfgNode try).getExpr()]
1111+
e =
1112+
[
1113+
any(IndexExprCfgNode i).getBase(), any(FieldExprCfgNode access).getExpr(),
1114+
any(TryExprCfgNode try).getExpr()
1115+
]
10711116
} or
10721117
TSsaNode(SsaImpl::DataFlowIntegration::SsaNode node) or
10731118
TFlowSummaryNode(FlowSummaryImpl::Private::SummaryNode sn)
@@ -1152,6 +1197,7 @@ private module Cached {
11521197
TVariantFieldContent(VariantCanonicalPath v, string field) {
11531198
field = v.getVariant().getFieldList().(RecordFieldList).getAField().getName().getText()
11541199
} or
1200+
TArrayElement() or
11551201
TTuplePositionContent(int pos) {
11561202
pos in [0 .. max([
11571203
any(TuplePat pat).getNumberOfFields(),

rust/ql/lib/codeql/rust/dataflow/internal/TaintTrackingImpl.qll

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
private import rust
22
private import codeql.dataflow.TaintTracking
33
private import codeql.rust.controlflow.CfgNodes
4-
private import DataFlowImpl
54
private import codeql.rust.dataflow.FlowSummary
6-
private import FlowSummaryImpl as FlowSummaryImpl
75
private import DataFlowImpl
6+
private import FlowSummaryImpl as FlowSummaryImpl
87

98
module RustTaintTracking implements InputSig<Location, RustDataFlow> {
109
predicate defaultTaintSanitizer(Node::Node node) { none() }
@@ -35,6 +34,15 @@ module RustTaintTracking implements InputSig<Location, RustDataFlow> {
3534
pred.asExpr() = index.getBase() and
3635
succ.asExpr() = index
3736
)
37+
or
38+
// Although data flow through collections is modeled using stores/reads,
39+
// we also allow taint to flow out of a tainted collection. This is
40+
// needed in order to support taint-tracking configurations where the
41+
// source is a collection.
42+
exists(SingletonContentSet cs |
43+
RustDataFlow::readStep(pred, cs, succ) and
44+
cs.getContent() instanceof ArrayElementContent
45+
)
3846
)
3947
or
4048
FlowSummaryImpl::Private::Steps::summaryLocalStep(pred.(Node::FlowSummaryNode).getSummaryNode(),
@@ -46,7 +54,10 @@ module RustTaintTracking implements InputSig<Location, RustDataFlow> {
4654
* and inputs to additional taint steps.
4755
*/
4856
bindingset[node]
49-
predicate defaultImplicitTaintRead(Node::Node node, ContentSet c) { none() }
57+
predicate defaultImplicitTaintRead(Node::Node node, ContentSet cs) {
58+
exists(node) and
59+
cs.(SingletonContentSet).getContent() instanceof ArrayElementContent
60+
}
5061

5162
/**
5263
* Holds if the additional step from `src` to `sink` should be considered in

rust/ql/lib/codeql/rust/elements/internal/VariableImpl.qll

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -467,7 +467,8 @@ module Impl {
467467
assignmentExprDescendant(mid) and
468468
getImmediateParent(e) = mid and
469469
not mid.(PrefixExpr).getOperatorName() = "*" and
470-
not mid instanceof FieldExpr
470+
not mid instanceof FieldExpr and
471+
not mid instanceof IndexExpr
471472
)
472473
}
473474

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

Lines changed: 132 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -373,51 +373,105 @@ localStep
373373
| main.rs:328:22:328:22 | [SSA] n | main.rs:328:34:328:34 | n |
374374
| main.rs:328:22:328:22 | n | main.rs:328:22:328:22 | [SSA] n |
375375
| main.rs:328:29:328:35 | sink(...) | main.rs:326:5:329:5 | match s2 { ... } |
376-
| main.rs:336:9:336:9 | [SSA] f | main.rs:337:10:337:10 | f |
377-
| main.rs:336:9:336:9 | f | main.rs:336:9:336:9 | [SSA] f |
378-
| main.rs:336:13:336:52 | \|...\| ... | main.rs:336:9:336:9 | f |
379-
| main.rs:336:14:336:17 | ... | main.rs:336:14:336:17 | cond |
380-
| main.rs:336:14:336:17 | [SSA] cond | main.rs:336:23:336:26 | cond |
381-
| main.rs:336:14:336:17 | cond | main.rs:336:14:336:17 | [SSA] cond |
382-
| main.rs:336:28:336:41 | { ... } | main.rs:336:20:336:52 | if cond {...} else {...} |
383-
| main.rs:336:30:336:39 | source(...) | main.rs:336:28:336:41 | { ... } |
384-
| main.rs:336:48:336:52 | { ... } | main.rs:336:20:336:52 | if cond {...} else {...} |
385-
| main.rs:336:50:336:50 | 0 | main.rs:336:48:336:52 | { ... } |
386-
| main.rs:341:9:341:9 | [SSA] f | main.rs:348:5:348:5 | f |
387-
| main.rs:341:9:341:9 | f | main.rs:341:9:341:9 | [SSA] f |
388-
| main.rs:341:13:346:9 | \|...\| ... | main.rs:341:9:341:9 | f |
389-
| main.rs:341:14:341:17 | ... | main.rs:341:14:341:17 | cond |
390-
| main.rs:341:14:341:17 | [SSA] cond | main.rs:342:12:342:15 | cond |
391-
| main.rs:341:14:341:17 | cond | main.rs:341:14:341:17 | [SSA] cond |
392-
| main.rs:341:20:341:23 | ... | main.rs:341:20:341:23 | data |
393-
| main.rs:341:20:341:23 | [SSA] data | main.rs:343:18:343:21 | data |
394-
| main.rs:341:20:341:23 | data | main.rs:341:20:341:23 | [SSA] data |
395-
| main.rs:342:17:344:9 | { ... } | main.rs:342:9:346:9 | if cond {...} else {...} |
396-
| main.rs:344:16:346:9 | { ... } | main.rs:342:9:346:9 | if cond {...} else {...} |
397-
| main.rs:345:13:345:19 | sink(...) | main.rs:344:16:346:9 | { ... } |
398-
| main.rs:347:9:347:9 | [SSA] a | main.rs:348:13:348:13 | a |
399-
| main.rs:347:9:347:9 | a | main.rs:347:9:347:9 | [SSA] a |
400-
| main.rs:347:13:347:22 | source(...) | main.rs:347:9:347:9 | a |
401-
| main.rs:352:9:352:9 | [SSA] f | main.rs:359:13:359:13 | f |
402-
| main.rs:352:9:352:9 | f | main.rs:352:9:352:9 | [SSA] f |
403-
| main.rs:352:13:357:9 | \|...\| ... | main.rs:352:9:352:9 | f |
404-
| main.rs:352:14:352:17 | ... | main.rs:352:14:352:17 | cond |
405-
| main.rs:352:14:352:17 | [SSA] cond | main.rs:353:12:353:15 | cond |
406-
| main.rs:352:14:352:17 | cond | main.rs:352:14:352:17 | [SSA] cond |
407-
| main.rs:352:20:352:23 | ... | main.rs:352:20:352:23 | data |
408-
| main.rs:352:20:352:23 | [SSA] data | main.rs:354:13:354:16 | data |
409-
| main.rs:352:20:352:23 | data | main.rs:352:20:352:23 | [SSA] data |
410-
| main.rs:353:17:355:9 | { ... } | main.rs:353:9:357:9 | if cond {...} else {...} |
411-
| main.rs:354:13:354:16 | data | main.rs:353:17:355:9 | { ... } |
412-
| main.rs:355:16:357:9 | { ... } | main.rs:353:9:357:9 | if cond {...} else {...} |
413-
| main.rs:356:13:356:13 | 0 | main.rs:355:16:357:9 | { ... } |
414-
| main.rs:358:9:358:9 | [SSA] a | main.rs:359:21:359:21 | a |
415-
| main.rs:358:9:358:9 | a | main.rs:358:9:358:9 | [SSA] a |
416-
| main.rs:358:13:358:22 | source(...) | main.rs:358:9:358:9 | a |
417-
| main.rs:359:9:359:9 | [SSA] b | main.rs:360:10:360:10 | b |
418-
| main.rs:359:9:359:9 | b | main.rs:359:9:359:9 | [SSA] b |
419-
| main.rs:359:13:359:22 | f(...) | main.rs:359:9:359:9 | b |
420-
| main.rs:384:13:384:33 | result_questionmark(...) | main.rs:384:9:384:9 | _ |
376+
| main.rs:336:9:336:12 | [SSA] arr1 | main.rs:337:14:337:17 | arr1 |
377+
| main.rs:336:9:336:12 | arr1 | main.rs:336:9:336:12 | [SSA] arr1 |
378+
| main.rs:336:16:336:33 | [...] | main.rs:336:9:336:12 | arr1 |
379+
| main.rs:337:9:337:10 | [SSA] n1 | main.rs:338:10:338:11 | n1 |
380+
| main.rs:337:9:337:10 | n1 | main.rs:337:9:337:10 | [SSA] n1 |
381+
| main.rs:337:14:337:20 | arr1[2] | main.rs:337:9:337:10 | n1 |
382+
| main.rs:340:9:340:12 | [SSA] arr2 | main.rs:341:14:341:17 | arr2 |
383+
| main.rs:340:9:340:12 | arr2 | main.rs:340:9:340:12 | [SSA] arr2 |
384+
| main.rs:340:16:340:31 | [...; 10] | main.rs:340:9:340:12 | arr2 |
385+
| main.rs:341:9:341:10 | [SSA] n2 | main.rs:342:10:342:11 | n2 |
386+
| main.rs:341:9:341:10 | n2 | main.rs:341:9:341:10 | [SSA] n2 |
387+
| main.rs:341:14:341:20 | arr2[4] | main.rs:341:9:341:10 | n2 |
388+
| main.rs:344:9:344:12 | [SSA] arr3 | main.rs:345:14:345:17 | arr3 |
389+
| main.rs:344:9:344:12 | arr3 | main.rs:344:9:344:12 | [SSA] arr3 |
390+
| main.rs:344:16:344:24 | [...] | main.rs:344:9:344:12 | arr3 |
391+
| main.rs:345:9:345:10 | [SSA] n3 | main.rs:346:10:346:11 | n3 |
392+
| main.rs:345:9:345:10 | n3 | main.rs:345:9:345:10 | [SSA] n3 |
393+
| main.rs:345:14:345:20 | arr3[2] | main.rs:345:9:345:10 | n3 |
394+
| main.rs:350:9:350:12 | [SSA] arr1 | main.rs:351:15:351:18 | arr1 |
395+
| main.rs:350:9:350:12 | arr1 | main.rs:350:9:350:12 | [SSA] arr1 |
396+
| main.rs:350:16:350:33 | [...] | main.rs:350:9:350:12 | arr1 |
397+
| main.rs:351:9:351:10 | [SSA] n1 | main.rs:352:14:352:15 | n1 |
398+
| main.rs:351:9:351:10 | n1 | main.rs:351:9:351:10 | [SSA] n1 |
399+
| main.rs:355:9:355:12 | [SSA] arr2 | main.rs:356:15:356:18 | arr2 |
400+
| main.rs:355:9:355:12 | arr2 | main.rs:355:9:355:12 | [SSA] arr2 |
401+
| main.rs:355:16:355:24 | [...] | main.rs:355:9:355:12 | arr2 |
402+
| main.rs:356:5:358:5 | for ... in ... { ... } | main.rs:349:21:359:1 | { ... } |
403+
| main.rs:356:9:356:10 | [SSA] n2 | main.rs:357:14:357:15 | n2 |
404+
| main.rs:356:9:356:10 | n2 | main.rs:356:9:356:10 | [SSA] n2 |
405+
| main.rs:362:9:362:12 | [SSA] arr1 | main.rs:363:11:363:14 | arr1 |
406+
| main.rs:362:9:362:12 | arr1 | main.rs:362:9:362:12 | [SSA] arr1 |
407+
| main.rs:362:16:362:33 | [...] | main.rs:362:9:362:12 | arr1 |
408+
| main.rs:363:5:369:5 | match arr1 { ... } | main.rs:361:26:370:1 | { ... } |
409+
| main.rs:363:11:363:14 | arr1 | main.rs:364:9:364:17 | SlicePat |
410+
| main.rs:364:10:364:10 | [SSA] a | main.rs:365:18:365:18 | a |
411+
| main.rs:364:10:364:10 | a | main.rs:364:10:364:10 | [SSA] a |
412+
| main.rs:364:13:364:13 | [SSA] b | main.rs:366:18:366:18 | b |
413+
| main.rs:364:13:364:13 | b | main.rs:364:13:364:13 | [SSA] b |
414+
| main.rs:364:16:364:16 | [SSA] c | main.rs:367:18:367:18 | c |
415+
| main.rs:364:16:364:16 | c | main.rs:364:16:364:16 | [SSA] c |
416+
| main.rs:364:22:368:9 | { ... } | main.rs:363:5:369:5 | match arr1 { ... } |
417+
| main.rs:373:9:373:19 | [SSA] mut_arr | main.rs:374:10:374:16 | mut_arr |
418+
| main.rs:373:9:373:19 | mut_arr | main.rs:373:9:373:19 | [SSA] mut_arr |
419+
| main.rs:373:23:373:31 | [...] | main.rs:373:9:373:19 | mut_arr |
420+
| main.rs:374:10:374:16 | [post] mut_arr | main.rs:376:5:376:11 | mut_arr |
421+
| main.rs:374:10:374:16 | mut_arr | main.rs:376:5:376:11 | mut_arr |
422+
| main.rs:376:5:376:11 | [post] mut_arr | main.rs:377:13:377:19 | mut_arr |
423+
| main.rs:376:5:376:11 | mut_arr | main.rs:377:13:377:19 | mut_arr |
424+
| main.rs:376:18:376:27 | source(...) | main.rs:376:5:376:14 | mut_arr[1] |
425+
| main.rs:377:9:377:9 | [SSA] d | main.rs:378:10:378:10 | d |
426+
| main.rs:377:9:377:9 | d | main.rs:377:9:377:9 | [SSA] d |
427+
| main.rs:377:13:377:19 | [post] mut_arr | main.rs:379:10:379:16 | mut_arr |
428+
| main.rs:377:13:377:19 | mut_arr | main.rs:379:10:379:16 | mut_arr |
429+
| main.rs:377:13:377:22 | mut_arr[1] | main.rs:377:9:377:9 | d |
430+
| main.rs:383:9:383:9 | [SSA] f | main.rs:384:10:384:10 | f |
431+
| main.rs:383:9:383:9 | f | main.rs:383:9:383:9 | [SSA] f |
432+
| main.rs:383:13:383:52 | \|...\| ... | main.rs:383:9:383:9 | f |
433+
| main.rs:383:14:383:17 | ... | main.rs:383:14:383:17 | cond |
434+
| main.rs:383:14:383:17 | [SSA] cond | main.rs:383:23:383:26 | cond |
435+
| main.rs:383:14:383:17 | cond | main.rs:383:14:383:17 | [SSA] cond |
436+
| main.rs:383:28:383:41 | { ... } | main.rs:383:20:383:52 | if cond {...} else {...} |
437+
| main.rs:383:30:383:39 | source(...) | main.rs:383:28:383:41 | { ... } |
438+
| main.rs:383:48:383:52 | { ... } | main.rs:383:20:383:52 | if cond {...} else {...} |
439+
| main.rs:383:50:383:50 | 0 | main.rs:383:48:383:52 | { ... } |
440+
| main.rs:388:9:388:9 | [SSA] f | main.rs:395:5:395:5 | f |
441+
| main.rs:388:9:388:9 | f | main.rs:388:9:388:9 | [SSA] f |
442+
| main.rs:388:13:393:9 | \|...\| ... | main.rs:388:9:388:9 | f |
443+
| main.rs:388:14:388:17 | ... | main.rs:388:14:388:17 | cond |
444+
| main.rs:388:14:388:17 | [SSA] cond | main.rs:389:12:389:15 | cond |
445+
| main.rs:388:14:388:17 | cond | main.rs:388:14:388:17 | [SSA] cond |
446+
| main.rs:388:20:388:23 | ... | main.rs:388:20:388:23 | data |
447+
| main.rs:388:20:388:23 | [SSA] data | main.rs:390:18:390:21 | data |
448+
| main.rs:388:20:388:23 | data | main.rs:388:20:388:23 | [SSA] data |
449+
| main.rs:389:17:391:9 | { ... } | main.rs:389:9:393:9 | if cond {...} else {...} |
450+
| main.rs:391:16:393:9 | { ... } | main.rs:389:9:393:9 | if cond {...} else {...} |
451+
| main.rs:392:13:392:19 | sink(...) | main.rs:391:16:393:9 | { ... } |
452+
| main.rs:394:9:394:9 | [SSA] a | main.rs:395:13:395:13 | a |
453+
| main.rs:394:9:394:9 | a | main.rs:394:9:394:9 | [SSA] a |
454+
| main.rs:394:13:394:22 | source(...) | main.rs:394:9:394:9 | a |
455+
| main.rs:399:9:399:9 | [SSA] f | main.rs:406:13:406:13 | f |
456+
| main.rs:399:9:399:9 | f | main.rs:399:9:399:9 | [SSA] f |
457+
| main.rs:399:13:404:9 | \|...\| ... | main.rs:399:9:399:9 | f |
458+
| main.rs:399:14:399:17 | ... | main.rs:399:14:399:17 | cond |
459+
| main.rs:399:14:399:17 | [SSA] cond | main.rs:400:12:400:15 | cond |
460+
| main.rs:399:14:399:17 | cond | main.rs:399:14:399:17 | [SSA] cond |
461+
| main.rs:399:20:399:23 | ... | main.rs:399:20:399:23 | data |
462+
| main.rs:399:20:399:23 | [SSA] data | main.rs:401:13:401:16 | data |
463+
| main.rs:399:20:399:23 | data | main.rs:399:20:399:23 | [SSA] data |
464+
| main.rs:400:17:402:9 | { ... } | main.rs:400:9:404:9 | if cond {...} else {...} |
465+
| main.rs:401:13:401:16 | data | main.rs:400:17:402:9 | { ... } |
466+
| main.rs:402:16:404:9 | { ... } | main.rs:400:9:404:9 | if cond {...} else {...} |
467+
| main.rs:403:13:403:13 | 0 | main.rs:402:16:404:9 | { ... } |
468+
| main.rs:405:9:405:9 | [SSA] a | main.rs:406:21:406:21 | a |
469+
| main.rs:405:9:405:9 | a | main.rs:405:9:405:9 | [SSA] a |
470+
| main.rs:405:13:405:22 | source(...) | main.rs:405:9:405:9 | a |
471+
| main.rs:406:9:406:9 | [SSA] b | main.rs:407:10:407:10 | b |
472+
| main.rs:406:9:406:9 | b | main.rs:406:9:406:9 | [SSA] b |
473+
| main.rs:406:13:406:22 | f(...) | main.rs:406:9:406:9 | b |
474+
| main.rs:431:13:431:33 | result_questionmark(...) | main.rs:431:9:431:9 | _ |
421475
storeStep
422476
| main.rs:94:14:94:22 | source(...) | tuple.0 | main.rs:94:13:94:26 | TupleExpr |
423477
| main.rs:94:25:94:25 | 2 | tuple.1 | main.rs:94:13:94:26 | TupleExpr |
@@ -466,7 +520,27 @@ storeStep
466520
| main.rs:298:41:298:41 | 2 | D | main.rs:298:14:298:43 | ...::D {...} |
467521
| main.rs:316:18:316:27 | source(...) | C | main.rs:315:14:317:5 | C {...} |
468522
| main.rs:318:27:318:27 | 2 | D | main.rs:318:14:318:29 | D {...} |
469-
| main.rs:367:27:367:27 | 0 | Some | main.rs:367:22:367:28 | Some(...) |
523+
| main.rs:336:17:336:17 | 1 | array[] | main.rs:336:16:336:33 | [...] |
524+
| main.rs:336:20:336:20 | 2 | array[] | main.rs:336:16:336:33 | [...] |
525+
| main.rs:336:23:336:32 | source(...) | array[] | main.rs:336:16:336:33 | [...] |
526+
| main.rs:340:17:340:26 | source(...) | array[] | main.rs:340:16:340:31 | [...; 10] |
527+
| main.rs:344:17:344:17 | 1 | array[] | main.rs:344:16:344:24 | [...] |
528+
| main.rs:344:20:344:20 | 2 | array[] | main.rs:344:16:344:24 | [...] |
529+
| main.rs:344:23:344:23 | 3 | array[] | main.rs:344:16:344:24 | [...] |
530+
| main.rs:350:17:350:17 | 1 | array[] | main.rs:350:16:350:33 | [...] |
531+
| main.rs:350:20:350:20 | 2 | array[] | main.rs:350:16:350:33 | [...] |
532+
| main.rs:350:23:350:32 | source(...) | array[] | main.rs:350:16:350:33 | [...] |
533+
| main.rs:355:17:355:17 | 1 | array[] | main.rs:355:16:355:24 | [...] |
534+
| main.rs:355:20:355:20 | 2 | array[] | main.rs:355:16:355:24 | [...] |
535+
| main.rs:355:23:355:23 | 3 | array[] | main.rs:355:16:355:24 | [...] |
536+
| main.rs:362:17:362:17 | 1 | array[] | main.rs:362:16:362:33 | [...] |
537+
| main.rs:362:20:362:20 | 2 | array[] | main.rs:362:16:362:33 | [...] |
538+
| main.rs:362:23:362:32 | source(...) | array[] | main.rs:362:16:362:33 | [...] |
539+
| main.rs:373:24:373:24 | 1 | array[] | main.rs:373:23:373:31 | [...] |
540+
| main.rs:373:27:373:27 | 2 | array[] | main.rs:373:23:373:31 | [...] |
541+
| main.rs:373:30:373:30 | 3 | array[] | main.rs:373:23:373:31 | [...] |
542+
| main.rs:376:18:376:27 | source(...) | array[] | main.rs:376:5:376:11 | [post] mut_arr |
543+
| main.rs:414:27:414:27 | 0 | Some | main.rs:414:22:414:28 | Some(...) |
470544
readStep
471545
| 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 |
472546
| main.rs:33:9:33:15 | Some(...) | Some | main.rs:33:14:33:14 | _ |
@@ -524,3 +598,15 @@ readStep
524598
| main.rs:324:28:324:43 | D {...} | D | main.rs:324:41:324:41 | n |
525599
| main.rs:327:9:327:24 | C {...} | C | main.rs:327:22:327:22 | n |
526600
| main.rs:328:9:328:24 | D {...} | D | main.rs:328:22:328:22 | n |
601+
| main.rs:337:14:337:17 | arr1 | array[] | main.rs:337:14:337:20 | arr1[2] |
602+
| main.rs:341:14:341:17 | arr2 | array[] | main.rs:341:14:341:20 | arr2[4] |
603+
| main.rs:345:14:345:17 | arr3 | array[] | main.rs:345:14:345:20 | arr3[2] |
604+
| main.rs:351:15:351:18 | arr1 | array[] | main.rs:351:9:351:10 | n1 |
605+
| main.rs:356:15:356:18 | arr2 | array[] | main.rs:356:9:356:10 | n2 |
606+
| main.rs:364:9:364:17 | SlicePat | array[] | main.rs:364:10:364:10 | a |
607+
| main.rs:364:9:364:17 | SlicePat | array[] | main.rs:364:13:364:13 | b |
608+
| main.rs:364:9:364:17 | SlicePat | array[] | main.rs:364:16:364:16 | c |
609+
| main.rs:374:10:374:16 | mut_arr | array[] | main.rs:374:10:374:19 | mut_arr[1] |
610+
| main.rs:376:5:376:11 | mut_arr | array[] | main.rs:376:5:376:14 | mut_arr[1] |
611+
| main.rs:377:13:377:19 | mut_arr | array[] | main.rs:377:13:377:22 | mut_arr[1] |
612+
| main.rs:379:10:379:16 | mut_arr | array[] | main.rs:379:10:379:19 | mut_arr[0] |

0 commit comments

Comments
 (0)