@@ -1520,6 +1520,25 @@ private module Cached {
1520
1520
)
1521
1521
}
1522
1522
1523
+ /**
1524
+ * Holds if `operand.getDef() = instr`, but there exists a `StoreInstruction` that
1525
+ * writes to an address that is equivalent to the value computed by `instr` in
1526
+ * between `instr` and `operand`, and therefore there should not be flow from `*instr`
1527
+ * to `*operand`.
1528
+ */
1529
+ pragma [ nomagic]
1530
+ private predicate isStoredToBetween ( Instruction instr , Operand operand ) {
1531
+ simpleOperandLocalFlowStep ( pragma [ only_bind_into ] ( instr ) , pragma [ only_bind_into ] ( operand ) ) and
1532
+ exists ( StoreInstruction store , IRBlock block , int storeIndex , int instrIndex , int operandIndex |
1533
+ store .getDestinationAddress ( ) = instr and
1534
+ block .getInstruction ( storeIndex ) = store and
1535
+ block .getInstruction ( instrIndex ) = instr and
1536
+ block .getInstruction ( operandIndex ) = operand .getUse ( ) and
1537
+ instrIndex < storeIndex and
1538
+ storeIndex < operandIndex
1539
+ )
1540
+ }
1541
+
1523
1542
private predicate indirectionInstructionFlow (
1524
1543
RawIndirectInstruction nodeFrom , IndirectOperand nodeTo
1525
1544
) {
@@ -1529,7 +1548,8 @@ private module Cached {
1529
1548
simpleOperandLocalFlowStep ( pragma [ only_bind_into ] ( instr ) , pragma [ only_bind_into ] ( operand ) )
1530
1549
|
1531
1550
hasOperandAndIndex ( nodeTo , operand , pragma [ only_bind_into ] ( indirectionIndex ) ) and
1532
- hasInstructionAndIndex ( nodeFrom , instr , pragma [ only_bind_into ] ( indirectionIndex ) )
1551
+ hasInstructionAndIndex ( nodeFrom , instr , pragma [ only_bind_into ] ( indirectionIndex ) ) and
1552
+ not isStoredToBetween ( instr , operand )
1533
1553
)
1534
1554
}
1535
1555
0 commit comments