mirror of
https://github.com/github/codeql.git
synced 2025-12-17 01:03:14 +01:00
Merge pull request #14384 from MathiasVP/handle-instructions-in-reverse-flow
This commit is contained in:
@@ -1696,16 +1696,7 @@ private module Cached {
|
|||||||
// Reverse flow: data that flows from the definition node back into the indirection returned
|
// Reverse flow: data that flows from the definition node back into the indirection returned
|
||||||
// by a function. This allows data to flow 'in' through references returned by a modeled
|
// by a function. This allows data to flow 'in' through references returned by a modeled
|
||||||
// function such as `operator[]`.
|
// function such as `operator[]`.
|
||||||
exists(Operand address, int indirectionIndex |
|
reverseFlow(nodeFrom, nodeTo)
|
||||||
nodeHasOperand(nodeTo.(IndirectReturnOutNode), address, indirectionIndex)
|
|
||||||
|
|
|
||||||
exists(StoreInstruction store |
|
|
||||||
nodeHasInstruction(nodeFrom, store, indirectionIndex - 1) and
|
|
||||||
store.getDestinationAddressOperand() = address
|
|
||||||
)
|
|
||||||
or
|
|
||||||
Ssa::outNodeHasAddressAndIndex(nodeFrom, address, indirectionIndex)
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private predicate simpleInstructionLocalFlowStep(Operand opFrom, Instruction iTo) {
|
private predicate simpleInstructionLocalFlowStep(Operand opFrom, Instruction iTo) {
|
||||||
@@ -1736,6 +1727,39 @@ private module Cached {
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private predicate reverseFlow(Node nodeFrom, Node nodeTo) {
|
||||||
|
reverseFlowOperand(nodeFrom, nodeTo)
|
||||||
|
or
|
||||||
|
reverseFlowInstruction(nodeFrom, nodeTo)
|
||||||
|
}
|
||||||
|
|
||||||
|
private predicate reverseFlowOperand(Node nodeFrom, IndirectReturnOutNode nodeTo) {
|
||||||
|
exists(Operand address, int indirectionIndex |
|
||||||
|
nodeHasOperand(nodeTo, address, indirectionIndex)
|
||||||
|
|
|
||||||
|
exists(StoreInstruction store |
|
||||||
|
nodeHasInstruction(nodeFrom, store, indirectionIndex - 1) and
|
||||||
|
store.getDestinationAddressOperand() = address
|
||||||
|
)
|
||||||
|
or
|
||||||
|
// We also want a write coming out of an `OutNode` to flow `nodeTo`.
|
||||||
|
// This is different from `reverseFlowInstruction` since `nodeFrom` can never
|
||||||
|
// be an `OutNode` when it's defined by an instruction.
|
||||||
|
Ssa::outNodeHasAddressAndIndex(nodeFrom, address, indirectionIndex)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
private predicate reverseFlowInstruction(Node nodeFrom, IndirectReturnOutNode nodeTo) {
|
||||||
|
exists(Instruction address, int indirectionIndex |
|
||||||
|
nodeHasInstruction(nodeTo, address, indirectionIndex)
|
||||||
|
|
|
||||||
|
exists(StoreInstruction store |
|
||||||
|
nodeHasInstruction(nodeFrom, store, indirectionIndex - 1) and
|
||||||
|
store.getDestinationAddress() = address
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
import Cached
|
import Cached
|
||||||
|
|||||||
Reference in New Issue
Block a user