mirror of
https://github.com/github/codeql.git
synced 2026-04-30 19:26:02 +02:00
Python points-to: Make sure reachability can skip over if-statements.
This commit is contained in:
@@ -1077,6 +1077,22 @@ class BasicBlock extends @py_flow_node {
|
||||
not result.(ConditionBlock).controls(this, _)
|
||||
}
|
||||
|
||||
/** Holds if flow from this BasicBlock always reaches `succ`
|
||||
*/
|
||||
predicate alwaysReaches(BasicBlock succ) {
|
||||
succ = this
|
||||
or
|
||||
strictcount(this.getASuccessor()) = 1
|
||||
and succ = this.getASuccessor()
|
||||
or
|
||||
forex(BasicBlock immsucc |
|
||||
immsucc = this.getASuccessor()
|
||||
|
|
||||
immsucc.alwaysReaches(succ)
|
||||
)
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private predicate start_bb_likely_reachable(BasicBlock b) {
|
||||
|
||||
@@ -220,6 +220,11 @@ cached module PointsToInternal {
|
||||
)
|
||||
or
|
||||
reachableEdge(_, b, context)
|
||||
or
|
||||
exists(BasicBlock pred |
|
||||
reachableBlock(pred, context) and
|
||||
pred.alwaysReaches(b)
|
||||
)
|
||||
}
|
||||
|
||||
private predicate reachableEdge(BasicBlock pred, BasicBlock succ, PointsToContext context) {
|
||||
|
||||
@@ -1 +1 @@
|
||||
| 1304 |
|
||||
| 1284 |
|
||||
|
||||
Reference in New Issue
Block a user