@@ -419,20 +419,31 @@ class Content extends TContent {
419
419
420
420
newtype TContentSet =
421
421
TSingletonContent(Content c) or
422
+ TKnownOrUnknownArrayElementContent(TKnownArrayElementContent c) or
422
423
TAnyArrayElementContent()
423
424
424
425
class ContentSet extends TContentSet {
425
426
Content getAStoreContent() {
426
427
this = TSingletonContent(result)
427
428
or
428
429
// for reverse stores
430
+ this = TKnownOrUnknownArrayElementContent(result)
431
+ or
432
+ // for reverse stores
429
433
this = TAnyArrayElementContent() and
430
434
result = TUnknownArrayElementContent()
431
435
}
432
436
433
437
Content getAReadContent() {
434
438
this = TSingletonContent(result)
435
439
or
440
+ exists(TKnownArrayElementContent c |
441
+ this = TKnownOrUnknownArrayElementContent(c) |
442
+ result = c
443
+ or
444
+ result = TUnknownArrayElementContent()
445
+ )
446
+ or
436
447
this = TAnyArrayElementContent() and
437
448
(result = TUnknownArrayElementContent() or result = TKnownArrayElementContent(_))
438
449
}
@@ -447,12 +458,10 @@ a[0] = tainted
447
458
# storeStep(not_tainted, TSingletonContent(TKnownArrayElementContent(1)), [post update] a)
448
459
a[1 ] = not_tainted
449
460
450
- # readStep(a, TSingletonContent(TKnownArrayElementContent(0)), a[0])
451
- # readStep(a, TSingletonContent(TUnknownArrayElementContent()), a[0])
461
+ # readStep(a, TKnownOrUnknownArrayElementContent(TKnownArrayElementContent(0)), a[0])
452
462
sink(a[0 ]) # bad
453
463
454
- # readStep(a, TSingletonContent(TKnownArrayElementContent(1)), a[1])
455
- # readStep(a, TSingletonContent(TUnknownArrayElementContent()), a[1])
464
+ # readStep(a, TKnownOrUnknownArrayElementContent(TKnownArrayElementContent(1)), a[1])
456
465
sink(a[1 ]) # good
457
466
458
467
# readStep(a, TAnyArrayElementContent(), a[unknown])
@@ -461,26 +470,24 @@ sink(a[unknown]) # bad; unknown may be 0
461
470
# storeStep(tainted, TSingletonContent(TUnknownArrayElementContent()), [post update] b)
462
471
b[unknown] = tainted
463
472
464
- # readStep(b, TSingletonContent(TKnownArrayElementContent(0)), b[0])
465
- # readStep(b, TSingletonContent(TUnknownArrayElementContent()), b[0])
473
+ # readStep(b, TKnownOrUnknownArrayElementContent(TKnownArrayElementContent(0)), b[0])
466
474
sink(b[0 ]) # bad; unknown may be 0
467
475
468
- # storeStep(tainted, TSingletonContent(TKnownArrayElementContent(0)), [post update] c[unknown])
469
- # storeStep(not_tainted, TSingletonContent(TKnownArrayElementContent(1)), [post update] c[unknown])
470
- # readStep(c, TAnyArrayElementContent(), c[unknown])
471
- # storeStep([post update] c[unknown], TAnyArrayElementContent(), [post update] c) # auto-generated reverse store (see Example 2)
472
- c[unknown][0 ] = tainted
473
- c[unknown][1 ] = not_tainted
474
-
475
-
476
- # readStep(c[0], TSingletonContent(TKnownArrayElementContent(0)), c[0][0])
477
- # readStep(c[0], TSingletonContent(TUnknownArrayElementContent()), c[0][0])
478
- # readStep(c[0], TSingletonContent(TKnownArrayElementContent(1)), c[0][1])
479
- # readStep(c[0], TSingletonContent(TUnknownArrayElementContent()), c[0][1])
480
- # readStep(c, TSingletonContent(TKnownArrayElementContent(0)), c[0])
481
- # readStep(c, TSingletonContent(TUnknownArrayElementContent()), c[0])
476
+ # storeStep(tainted, TSingletonContent(TUnknownArrayElementContent()), [post update] c[0])
477
+ # storeStep(not_tainted, TSingletonContent(TUnknownArrayElementContent()), [post update] c[1])
478
+ # readStep(c, TKnownOrUnknownArrayElementContent(TKnownArrayElementContent(0)), c[0])
479
+ # readStep(c, TKnownOrUnknownArrayElementContent(TKnownArrayElementContent(1)), c[1])
480
+ # storeStep([post update] c[0], TSingletonContent(TKnownArrayElementContent(0)), [post update] c) # auto-generated reverse store (see Example 2)
481
+ # storeStep([post update] c[1], TSingletonContent(TKnownArrayElementContent(1)), [post update] c) # auto-generated reverse store (see Example 2)
482
+ c[0 ][unknown] = tainted
483
+ c[1 ][unknown] = not_tainted
484
+
485
+ # readStep(c[0], TKnownOrUnknownArrayElementContent(TKnownArrayElementContent(0)), c[0][0])
486
+ # readStep(c[1], TKnownOrUnknownArrayElementContent(TKnownArrayElementContent(0)), c[1][0])
487
+ # readStep(c, TKnownOrUnknownArrayElementContent(TKnownArrayElementContent(0)), c[0])
488
+ # readStep(c, TKnownOrUnknownArrayElementContent(TKnownArrayElementContent(1)), c[1])
482
489
sink(c[0 ][0 ]) # bad; unknown may be 0
483
- sink(c[0 ][ 1 ]) # good
490
+ sink(c[1 ][ 0 ]) # good
484
491
```
485
492
486
493
### Field flow barriers
0 commit comments