Skip to content

Commit cac4514

Browse files
committed
Rust: Add basic data flow through arrays
1 parent 3346b64 commit cac4514

File tree

7 files changed

+162
-20
lines changed

7 files changed

+162
-20
lines changed

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

Lines changed: 43 additions & 1 deletion
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+
* Content stored at an element in an array.
628+
*/
629+
final private class ArrayElementContent extends VariantContent, 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
*
@@ -884,6 +893,24 @@ module RustDataFlow implements InputSig<Location> {
884893
node1.asExpr() = access.getExpr() and
885894
node2.asExpr() = access
886895
)
896+
or
897+
exists(IndexExprCfgNode arr |
898+
c instanceof ArrayElementContent and
899+
node1.asExpr() = arr.getBase() and
900+
node2.asExpr() = arr
901+
)
902+
or
903+
exists(ForExprCfgNode for |
904+
c instanceof ArrayElementContent and
905+
node1.asExpr() = for.getIterable() and
906+
node2.asPat() = for.getPat()
907+
)
908+
or
909+
exists(SlicePatCfgNode pat |
910+
c instanceof ArrayElementContent and
911+
node1.asPat() = pat and
912+
node2.asPat() = pat.getAPat()
913+
)
887914
)
888915
or
889916
FlowSummaryImpl::Private::Steps::summaryReadStep(node1.(Node::FlowSummaryNode).getSummaryNode(),
@@ -950,7 +977,20 @@ module RustDataFlow implements InputSig<Location> {
950977
node2.asExpr() = tuple
951978
)
952979
or
980+
exists(ArrayExprCfgNode arr |
981+
c instanceof ArrayElementContent and
982+
node1.asExpr() = arr.getAnExpr() and
983+
node2.asExpr() = arr
984+
)
985+
or
953986
tupleAssignment(node1, node2.(PostUpdateNode).getPreUpdateNode(), c)
987+
or
988+
exists(AssignmentExprCfgNode assignment, IndexExprCfgNode index |
989+
c instanceof ArrayElementContent and
990+
assignment.getLhs() = index and
991+
node1.asExpr() = assignment.getRhs() and
992+
node2.(PostUpdateNode).getPreUpdateNode().asExpr() = index.getBase()
993+
)
954994
)
955995
or
956996
FlowSummaryImpl::Private::Steps::summaryStoreStep(node1.(Node::FlowSummaryNode).getSummaryNode(),
@@ -1050,7 +1090,8 @@ private module Cached {
10501090
TSourceParameterNode(ParamBaseCfgNode p) or
10511091
TPatNode(PatCfgNode p) or
10521092
TExprPostUpdateNode(ExprCfgNode e) {
1053-
isArgumentForCall(e, _, _) or e = any(FieldExprCfgNode access).getExpr()
1093+
isArgumentForCall(e, _, _) or
1094+
e = [any(IndexExprCfgNode i).getBase(), any(FieldExprCfgNode access).getExpr()]
10541095
} or
10551096
TSsaNode(SsaImpl::DataFlowIntegration::SsaNode node) or
10561097
TFlowSummaryNode(FlowSummaryImpl::Private::SummaryNode sn)
@@ -1135,6 +1176,7 @@ private module Cached {
11351176
TVariantFieldContent(VariantCanonicalPath v, string field) {
11361177
field = v.getVariant().getFieldList().(RecordFieldList).getAField().getName().getText()
11371178
} or
1179+
TArrayElement() or
11381180
TTuplePositionContent(int pos) {
11391181
pos in [0 .. max([
11401182
any(TuplePat pat).getNumberOfFields(),

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: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -388,11 +388,14 @@ localStep
388388
| main.rs:351:9:351:19 | [SSA] mut_arr | main.rs:352:10:352:16 | mut_arr |
389389
| main.rs:351:9:351:19 | mut_arr | main.rs:351:9:351:19 | [SSA] mut_arr |
390390
| main.rs:351:23:351:31 | [...] | main.rs:351:9:351:19 | mut_arr |
391-
| main.rs:354:5:354:11 | [SSA] mut_arr | main.rs:355:13:355:19 | mut_arr |
392-
| main.rs:354:5:354:11 | mut_arr | main.rs:354:5:354:11 | [SSA] mut_arr |
391+
| main.rs:352:10:352:16 | [post] mut_arr | main.rs:354:5:354:11 | mut_arr |
392+
| main.rs:352:10:352:16 | mut_arr | main.rs:354:5:354:11 | mut_arr |
393+
| main.rs:354:5:354:11 | [post] mut_arr | main.rs:355:13:355:19 | mut_arr |
394+
| main.rs:354:5:354:11 | mut_arr | main.rs:355:13:355:19 | mut_arr |
393395
| main.rs:354:18:354:27 | source(...) | main.rs:354:5:354:14 | mut_arr[1] |
394396
| main.rs:355:9:355:9 | [SSA] d | main.rs:356:10:356:10 | d |
395397
| main.rs:355:9:355:9 | d | main.rs:355:9:355:9 | [SSA] d |
398+
| main.rs:355:13:355:19 | [post] mut_arr | main.rs:357:10:357:16 | mut_arr |
396399
| main.rs:355:13:355:19 | mut_arr | main.rs:357:10:357:16 | mut_arr |
397400
| main.rs:355:13:355:22 | mut_arr[1] | main.rs:355:9:355:9 | d |
398401
storeStep
@@ -436,6 +439,27 @@ storeStep
436439
| main.rs:276:41:276:41 | 2 | D | main.rs:276:14:276:43 | ...::D {...} |
437440
| main.rs:294:18:294:27 | source(...) | C | main.rs:293:14:295:5 | C {...} |
438441
| main.rs:296:27:296:27 | 2 | D | main.rs:296:14:296:29 | D {...} |
442+
| main.rs:314:17:314:17 | 1 | array[] | main.rs:314:16:314:33 | [...] |
443+
| main.rs:314:20:314:20 | 2 | array[] | main.rs:314:16:314:33 | [...] |
444+
| main.rs:314:23:314:32 | source(...) | array[] | main.rs:314:16:314:33 | [...] |
445+
| main.rs:318:17:318:26 | source(...) | array[] | main.rs:318:16:318:31 | [...] |
446+
| main.rs:318:29:318:30 | 10 | array[] | main.rs:318:16:318:31 | [...] |
447+
| main.rs:322:17:322:17 | 1 | array[] | main.rs:322:16:322:24 | [...] |
448+
| main.rs:322:20:322:20 | 2 | array[] | main.rs:322:16:322:24 | [...] |
449+
| main.rs:322:23:322:23 | 3 | array[] | main.rs:322:16:322:24 | [...] |
450+
| main.rs:328:17:328:17 | 1 | array[] | main.rs:328:16:328:33 | [...] |
451+
| main.rs:328:20:328:20 | 2 | array[] | main.rs:328:16:328:33 | [...] |
452+
| main.rs:328:23:328:32 | source(...) | array[] | main.rs:328:16:328:33 | [...] |
453+
| main.rs:333:17:333:17 | 1 | array[] | main.rs:333:16:333:24 | [...] |
454+
| main.rs:333:20:333:20 | 2 | array[] | main.rs:333:16:333:24 | [...] |
455+
| main.rs:333:23:333:23 | 3 | array[] | main.rs:333:16:333:24 | [...] |
456+
| main.rs:340:17:340:17 | 1 | array[] | main.rs:340:16:340:33 | [...] |
457+
| main.rs:340:20:340:20 | 2 | array[] | main.rs:340:16:340:33 | [...] |
458+
| main.rs:340:23:340:32 | source(...) | array[] | main.rs:340:16:340:33 | [...] |
459+
| main.rs:351:24:351:24 | 1 | array[] | main.rs:351:23:351:31 | [...] |
460+
| main.rs:351:27:351:27 | 2 | array[] | main.rs:351:23:351:31 | [...] |
461+
| main.rs:351:30:351:30 | 3 | array[] | main.rs:351:23:351:31 | [...] |
462+
| main.rs:354:18:354:27 | source(...) | array[] | main.rs:354:5:354:11 | [post] mut_arr |
439463
| main.rs:364:27:364:27 | 0 | Some | main.rs:364:22:364:28 | Some(...) |
440464
readStep
441465
| 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 |
@@ -484,3 +508,15 @@ readStep
484508
| main.rs:302:28:302:43 | D {...} | D | main.rs:302:41:302:41 | n |
485509
| main.rs:305:9:305:24 | C {...} | C | main.rs:305:22:305:22 | n |
486510
| main.rs:306:9:306:24 | D {...} | D | main.rs:306:22:306:22 | n |
511+
| main.rs:315:14:315:17 | arr1 | array[] | main.rs:315:14:315:20 | arr1[2] |
512+
| main.rs:319:14:319:17 | arr2 | array[] | main.rs:319:14:319:20 | arr2[4] |
513+
| main.rs:323:14:323:17 | arr3 | array[] | main.rs:323:14:323:20 | arr3[2] |
514+
| main.rs:329:15:329:18 | arr1 | array[] | main.rs:329:9:329:10 | n1 |
515+
| main.rs:334:15:334:18 | arr2 | array[] | main.rs:334:9:334:10 | n2 |
516+
| main.rs:342:9:342:17 | SlicePat | array[] | main.rs:342:10:342:10 | a |
517+
| main.rs:342:9:342:17 | SlicePat | array[] | main.rs:342:13:342:13 | b |
518+
| main.rs:342:9:342:17 | SlicePat | array[] | main.rs:342:16:342:16 | c |
519+
| main.rs:352:10:352:16 | mut_arr | array[] | main.rs:352:10:352:19 | mut_arr[1] |
520+
| main.rs:354:5:354:11 | mut_arr | array[] | main.rs:354:5:354:14 | mut_arr[1] |
521+
| main.rs:355:13:355:19 | mut_arr | array[] | main.rs:355:13:355:22 | mut_arr[1] |
522+
| main.rs:357:10:357:16 | mut_arr | array[] | main.rs:357:10:357:19 | mut_arr[0] |

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

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,32 @@ edges
6464
| main.rs:298:22:298:22 | n | main.rs:298:34:298:34 | n | provenance | |
6565
| main.rs:302:9:302:24 | C {...} [C] | main.rs:302:22:302:22 | n | provenance | |
6666
| main.rs:302:22:302:22 | n | main.rs:302:53:302:53 | n | provenance | |
67+
| main.rs:314:16:314:33 | [...] [array[]] | main.rs:315:14:315:17 | arr1 [array[]] | provenance | |
68+
| main.rs:314:23:314:32 | source(...) | main.rs:314:16:314:33 | [...] [array[]] | provenance | |
69+
| main.rs:315:14:315:17 | arr1 [array[]] | main.rs:315:14:315:20 | arr1[2] | provenance | |
70+
| main.rs:315:14:315:20 | arr1[2] | main.rs:316:10:316:11 | n1 | provenance | |
71+
| main.rs:318:16:318:31 | [...] [array[]] | main.rs:319:14:319:17 | arr2 [array[]] | provenance | |
72+
| main.rs:318:17:318:26 | source(...) | main.rs:318:16:318:31 | [...] [array[]] | provenance | |
73+
| main.rs:319:14:319:17 | arr2 [array[]] | main.rs:319:14:319:20 | arr2[4] | provenance | |
74+
| main.rs:319:14:319:20 | arr2[4] | main.rs:320:10:320:11 | n2 | provenance | |
75+
| main.rs:328:16:328:33 | [...] [array[]] | main.rs:329:15:329:18 | arr1 [array[]] | provenance | |
76+
| main.rs:328:23:328:32 | source(...) | main.rs:328:16:328:33 | [...] [array[]] | provenance | |
77+
| main.rs:329:9:329:10 | n1 | main.rs:330:14:330:15 | n1 | provenance | |
78+
| main.rs:329:15:329:18 | arr1 [array[]] | main.rs:329:9:329:10 | n1 | provenance | |
79+
| main.rs:340:16:340:33 | [...] [array[]] | main.rs:342:9:342:17 | SlicePat [array[]] | provenance | |
80+
| main.rs:340:23:340:32 | source(...) | main.rs:340:16:340:33 | [...] [array[]] | provenance | |
81+
| main.rs:342:9:342:17 | SlicePat [array[]] | main.rs:342:10:342:10 | a | provenance | |
82+
| main.rs:342:9:342:17 | SlicePat [array[]] | main.rs:342:13:342:13 | b | provenance | |
83+
| main.rs:342:9:342:17 | SlicePat [array[]] | main.rs:342:16:342:16 | c | provenance | |
84+
| main.rs:342:10:342:10 | a | main.rs:343:18:343:18 | a | provenance | |
85+
| main.rs:342:13:342:13 | b | main.rs:344:18:344:18 | b | provenance | |
86+
| main.rs:342:16:342:16 | c | main.rs:345:18:345:18 | c | provenance | |
87+
| main.rs:354:5:354:11 | [post] mut_arr [array[]] | main.rs:355:13:355:19 | mut_arr [array[]] | provenance | |
88+
| main.rs:354:5:354:11 | [post] mut_arr [array[]] | main.rs:357:10:357:16 | mut_arr [array[]] | provenance | |
89+
| main.rs:354:18:354:27 | source(...) | main.rs:354:5:354:11 | [post] mut_arr [array[]] | provenance | |
90+
| main.rs:355:13:355:19 | mut_arr [array[]] | main.rs:355:13:355:22 | mut_arr[1] | provenance | |
91+
| main.rs:355:13:355:22 | mut_arr[1] | main.rs:356:10:356:10 | d | provenance | |
92+
| main.rs:357:10:357:16 | mut_arr [array[]] | main.rs:357:10:357:19 | mut_arr[0] | provenance | |
6793
nodes
6894
| main.rs:15:10:15:18 | source(...) | semmle.label | source(...) |
6995
| main.rs:19:13:19:21 | source(...) | semmle.label | source(...) |
@@ -147,6 +173,37 @@ nodes
147173
| main.rs:302:9:302:24 | C {...} [C] | semmle.label | C {...} [C] |
148174
| main.rs:302:22:302:22 | n | semmle.label | n |
149175
| main.rs:302:53:302:53 | n | semmle.label | n |
176+
| main.rs:314:16:314:33 | [...] [array[]] | semmle.label | [...] [array[]] |
177+
| main.rs:314:23:314:32 | source(...) | semmle.label | source(...) |
178+
| main.rs:315:14:315:17 | arr1 [array[]] | semmle.label | arr1 [array[]] |
179+
| main.rs:315:14:315:20 | arr1[2] | semmle.label | arr1[2] |
180+
| main.rs:316:10:316:11 | n1 | semmle.label | n1 |
181+
| main.rs:318:16:318:31 | [...] [array[]] | semmle.label | [...] [array[]] |
182+
| main.rs:318:17:318:26 | source(...) | semmle.label | source(...) |
183+
| main.rs:319:14:319:17 | arr2 [array[]] | semmle.label | arr2 [array[]] |
184+
| main.rs:319:14:319:20 | arr2[4] | semmle.label | arr2[4] |
185+
| main.rs:320:10:320:11 | n2 | semmle.label | n2 |
186+
| main.rs:328:16:328:33 | [...] [array[]] | semmle.label | [...] [array[]] |
187+
| main.rs:328:23:328:32 | source(...) | semmle.label | source(...) |
188+
| main.rs:329:9:329:10 | n1 | semmle.label | n1 |
189+
| main.rs:329:15:329:18 | arr1 [array[]] | semmle.label | arr1 [array[]] |
190+
| main.rs:330:14:330:15 | n1 | semmle.label | n1 |
191+
| main.rs:340:16:340:33 | [...] [array[]] | semmle.label | [...] [array[]] |
192+
| main.rs:340:23:340:32 | source(...) | semmle.label | source(...) |
193+
| main.rs:342:9:342:17 | SlicePat [array[]] | semmle.label | SlicePat [array[]] |
194+
| main.rs:342:10:342:10 | a | semmle.label | a |
195+
| main.rs:342:13:342:13 | b | semmle.label | b |
196+
| main.rs:342:16:342:16 | c | semmle.label | c |
197+
| main.rs:343:18:343:18 | a | semmle.label | a |
198+
| main.rs:344:18:344:18 | b | semmle.label | b |
199+
| main.rs:345:18:345:18 | c | semmle.label | c |
200+
| main.rs:354:5:354:11 | [post] mut_arr [array[]] | semmle.label | [post] mut_arr [array[]] |
201+
| main.rs:354:18:354:27 | source(...) | semmle.label | source(...) |
202+
| main.rs:355:13:355:19 | mut_arr [array[]] | semmle.label | mut_arr [array[]] |
203+
| main.rs:355:13:355:22 | mut_arr[1] | semmle.label | mut_arr[1] |
204+
| main.rs:356:10:356:10 | d | semmle.label | d |
205+
| main.rs:357:10:357:16 | mut_arr [array[]] | semmle.label | mut_arr [array[]] |
206+
| main.rs:357:10:357:19 | mut_arr[0] | semmle.label | mut_arr[0] |
150207
subpaths
151208
testFailures
152209
#select
@@ -172,3 +229,11 @@ testFailures
172229
| main.rs:282:81:282:81 | n | main.rs:274:18:274:27 | source(...) | main.rs:282:81:282:81 | n | $@ | main.rs:274:18:274:27 | source(...) | source(...) |
173230
| main.rs:298:34:298:34 | n | main.rs:294:18:294:27 | source(...) | main.rs:298:34:298:34 | n | $@ | main.rs:294:18:294:27 | source(...) | source(...) |
174231
| main.rs:302:53:302:53 | n | main.rs:294:18:294:27 | source(...) | main.rs:302:53:302:53 | n | $@ | main.rs:294:18:294:27 | source(...) | source(...) |
232+
| main.rs:316:10:316:11 | n1 | main.rs:314:23:314:32 | source(...) | main.rs:316:10:316:11 | n1 | $@ | main.rs:314:23:314:32 | source(...) | source(...) |
233+
| main.rs:320:10:320:11 | n2 | main.rs:318:17:318:26 | source(...) | main.rs:320:10:320:11 | n2 | $@ | main.rs:318:17:318:26 | source(...) | source(...) |
234+
| main.rs:330:14:330:15 | n1 | main.rs:328:23:328:32 | source(...) | main.rs:330:14:330:15 | n1 | $@ | main.rs:328:23:328:32 | source(...) | source(...) |
235+
| main.rs:343:18:343:18 | a | main.rs:340:23:340:32 | source(...) | main.rs:343:18:343:18 | a | $@ | main.rs:340:23:340:32 | source(...) | source(...) |
236+
| main.rs:344:18:344:18 | b | main.rs:340:23:340:32 | source(...) | main.rs:344:18:344:18 | b | $@ | main.rs:340:23:340:32 | source(...) | source(...) |
237+
| main.rs:345:18:345:18 | c | main.rs:340:23:340:32 | source(...) | main.rs:345:18:345:18 | c | $@ | main.rs:340:23:340:32 | source(...) | source(...) |
238+
| main.rs:356:10:356:10 | d | main.rs:354:18:354:27 | source(...) | main.rs:356:10:356:10 | d | $@ | main.rs:354:18:354:27 | source(...) | source(...) |
239+
| main.rs:357:10:357:19 | mut_arr[0] | main.rs:354:18:354:27 | source(...) | main.rs:357:10:357:19 | mut_arr[0] | $@ | main.rs:354:18:354:27 | source(...) | source(...) |

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -313,11 +313,11 @@ fn custom_record_enum_pattern_match_unqualified() {
313313
fn array_lookup() {
314314
let arr1 = [1, 2, source(94)];
315315
let n1 = arr1[2];
316-
sink(n1); // $ MISSING: hasValueFlow=94
316+
sink(n1); // $ hasValueFlow=94
317317

318318
let arr2 = [source(20); 10];
319319
let n2 = arr2[4];
320-
sink(n2); // $ MISSING: hasValueFlow=20
320+
sink(n2); // $ hasValueFlow=20
321321

322322
let arr3 = [1, 2, 3];
323323
let n3 = arr3[2];
@@ -327,7 +327,7 @@ fn array_lookup() {
327327
fn array_for_loop() {
328328
let arr1 = [1, 2, source(43)];
329329
for n1 in arr1 {
330-
sink(n1); // $ MISSING: hasValueFlow=43
330+
sink(n1); // $ hasValueFlow=43
331331
}
332332

333333
let arr2 = [1, 2, 3];
@@ -340,9 +340,9 @@ fn array_slice_pattern() {
340340
let arr1 = [1, 2, source(43)];
341341
match arr1 {
342342
[a, b, c] => {
343-
sink(a);
344-
sink(b);
345-
sink(c); // $ MISSING: hasValueFlow=43
343+
sink(a); // $ SPURIOUS: hasValueFlow=43
344+
sink(b); // $ SPURIOUS: hasValueFlow=43
345+
sink(c); // $ hasValueFlow=43
346346
}
347347
}
348348
}
@@ -353,8 +353,8 @@ fn array_assignment() {
353353

354354
mut_arr[1] = source(55);
355355
let d = mut_arr[1];
356-
sink(d); // $ MISSING: hasValueFlow=55
357-
sink(mut_arr[0]);
356+
sink(d); // $ hasValueFlow=55
357+
sink(mut_arr[0]); // $ SPURIOUS: hasValueFlow=55
358358
}
359359

360360
fn main() {

rust/ql/test/library-tests/variables/Ssa.expected

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,6 @@ definition
137137
| variables.rs:482:15:482:23 | SelfParam | variables.rs:482:20:482:23 | self |
138138
| variables.rs:486:11:486:14 | SelfParam | variables.rs:486:11:486:14 | self |
139139
| variables.rs:501:9:501:13 | a | variables.rs:501:13:501:13 | a |
140-
| variables.rs:503:5:503:5 | a | variables.rs:501:13:501:13 | a |
141140
| variables.rs:505:5:505:5 | a | variables.rs:501:13:501:13 | a |
142141
| variables.rs:510:9:510:9 | x | variables.rs:510:9:510:9 | x |
143142
| variables.rs:514:9:514:9 | z | variables.rs:514:9:514:9 | z |
@@ -266,7 +265,8 @@ read
266265
| variables.rs:482:15:482:23 | SelfParam | variables.rs:482:20:482:23 | self | variables.rs:483:16:483:19 | self |
267266
| variables.rs:486:11:486:14 | SelfParam | variables.rs:486:11:486:14 | self | variables.rs:487:9:487:12 | self |
268267
| variables.rs:501:9:501:13 | a | variables.rs:501:13:501:13 | a | variables.rs:502:15:502:15 | a |
269-
| variables.rs:503:5:503:5 | a | variables.rs:501:13:501:13 | a | variables.rs:504:15:504:15 | a |
268+
| variables.rs:501:9:501:13 | a | variables.rs:501:13:501:13 | a | variables.rs:503:5:503:5 | a |
269+
| variables.rs:501:9:501:13 | a | variables.rs:501:13:501:13 | a | variables.rs:504:15:504:15 | a |
270270
| variables.rs:505:5:505:5 | a | variables.rs:501:13:501:13 | a | variables.rs:506:15:506:15 | a |
271271
| variables.rs:510:9:510:9 | x | variables.rs:510:9:510:9 | x | variables.rs:512:15:512:15 | x |
272272
| variables.rs:523:10:523:18 | SelfParam | variables.rs:523:15:523:18 | self | variables.rs:524:6:524:9 | self |
@@ -371,7 +371,6 @@ firstRead
371371
| variables.rs:482:15:482:23 | SelfParam | variables.rs:482:20:482:23 | self | variables.rs:483:16:483:19 | self |
372372
| variables.rs:486:11:486:14 | SelfParam | variables.rs:486:11:486:14 | self | variables.rs:487:9:487:12 | self |
373373
| variables.rs:501:9:501:13 | a | variables.rs:501:13:501:13 | a | variables.rs:502:15:502:15 | a |
374-
| variables.rs:503:5:503:5 | a | variables.rs:501:13:501:13 | a | variables.rs:504:15:504:15 | a |
375374
| variables.rs:505:5:505:5 | a | variables.rs:501:13:501:13 | a | variables.rs:506:15:506:15 | a |
376375
| variables.rs:510:9:510:9 | x | variables.rs:510:9:510:9 | x | variables.rs:512:15:512:15 | x |
377376
| variables.rs:523:10:523:18 | SelfParam | variables.rs:523:15:523:18 | self | variables.rs:524:6:524:9 | self |
@@ -476,8 +475,7 @@ lastRead
476475
| variables.rs:462:9:462:9 | x | variables.rs:462:9:462:9 | x | variables.rs:472:19:472:19 | x |
477476
| variables.rs:482:15:482:23 | SelfParam | variables.rs:482:20:482:23 | self | variables.rs:483:16:483:19 | self |
478477
| variables.rs:486:11:486:14 | SelfParam | variables.rs:486:11:486:14 | self | variables.rs:487:9:487:12 | self |
479-
| variables.rs:501:9:501:13 | a | variables.rs:501:13:501:13 | a | variables.rs:502:15:502:15 | a |
480-
| variables.rs:503:5:503:5 | a | variables.rs:501:13:501:13 | a | variables.rs:504:15:504:15 | a |
478+
| variables.rs:501:9:501:13 | a | variables.rs:501:13:501:13 | a | variables.rs:504:15:504:15 | a |
481479
| variables.rs:505:5:505:5 | a | variables.rs:501:13:501:13 | a | variables.rs:506:15:506:15 | a |
482480
| variables.rs:510:9:510:9 | x | variables.rs:510:9:510:9 | x | variables.rs:512:15:512:15 | x |
483481
| variables.rs:523:10:523:18 | SelfParam | variables.rs:523:15:523:18 | self | variables.rs:524:6:524:9 | self |
@@ -508,6 +506,8 @@ adjacentReads
508506
| variables.rs:462:9:462:9 | x | variables.rs:462:9:462:9 | x | variables.rs:464:19:464:19 | x | variables.rs:472:19:472:19 | x |
509507
| variables.rs:462:9:462:9 | x | variables.rs:462:9:462:9 | x | variables.rs:466:19:466:19 | x | variables.rs:470:19:470:19 | x |
510508
| variables.rs:462:9:462:9 | x | variables.rs:462:9:462:9 | x | variables.rs:466:19:466:19 | x | variables.rs:472:19:472:19 | x |
509+
| variables.rs:501:9:501:13 | a | variables.rs:501:13:501:13 | a | variables.rs:502:15:502:15 | a | variables.rs:503:5:503:5 | a |
510+
| variables.rs:501:9:501:13 | a | variables.rs:501:13:501:13 | a | variables.rs:503:5:503:5 | a | variables.rs:504:15:504:15 | a |
511511
phi
512512
| variables.rs:191:9:191:44 | [match(true)] phi | variables.rs:191:9:191:44 | a3 | variables.rs:191:22:191:23 | a3 |
513513
| variables.rs:191:9:191:44 | [match(true)] phi | variables.rs:191:9:191:44 | a3 | variables.rs:191:42:191:43 | a3 |

0 commit comments

Comments
 (0)