Skip to content

Commit e1cc7dc

Browse files
committed
C++: Tweak join orders.
1 parent 3f01a21 commit e1cc7dc

File tree

1 file changed

+32
-9
lines changed

1 file changed

+32
-9
lines changed

cpp/ql/lib/experimental/semmle/code/cpp/dataflow/ProductFlow.qll

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -340,19 +340,42 @@ module ProductFlow {
340340
fwdIsSuccessor(_, _, node1, node2)
341341
}
342342

343+
pragma[nomagic]
344+
private predicate fwdIsSuccessorExit(
345+
Flow1::PathNode mid1, Flow2::PathNode mid2, Flow1::PathNode succ1, Flow2::PathNode succ2
346+
) {
347+
isSinkPair(mid1, mid2) and
348+
succ1 = mid1 and
349+
succ2 = mid2
350+
or
351+
interprocEdgePair(mid1, mid2, succ1, succ2)
352+
}
353+
354+
private predicate fwdIsSuccessor1(
355+
Flow1::PathNode pred1, Flow2::PathNode pred2, Flow1::PathNode mid1, Flow2::PathNode mid2,
356+
Flow1::PathNode succ1, Flow2::PathNode succ2
357+
) {
358+
fwdReachableInterprocEntry(pred1, pred2) and
359+
localPathStep1*(pred1, mid1) and
360+
fwdIsSuccessorExit(pragma[only_bind_into](mid1), pragma[only_bind_into](mid2), succ1, succ2)
361+
}
362+
363+
private predicate fwdIsSuccessor2(
364+
Flow1::PathNode pred1, Flow2::PathNode pred2, Flow1::PathNode mid1, Flow2::PathNode mid2,
365+
Flow1::PathNode succ1, Flow2::PathNode succ2
366+
) {
367+
fwdReachableInterprocEntry(pred1, pred2) and
368+
localPathStep2*(pred2, mid2) and
369+
fwdIsSuccessorExit(pragma[only_bind_into](mid1), pragma[only_bind_into](mid2), succ1, succ2)
370+
}
371+
372+
pragma[assume_small_delta]
343373
private predicate fwdIsSuccessor(
344374
Flow1::PathNode pred1, Flow2::PathNode pred2, Flow1::PathNode succ1, Flow2::PathNode succ2
345375
) {
346-
fwdReachableInterprocEntry(pred1, pred2) and
347376
exists(Flow1::PathNode mid1, Flow2::PathNode mid2 |
348-
localPathStep1*(pred1, mid1) and
349-
localPathStep2*(pred2, mid2)
350-
|
351-
isSinkPair(mid1, mid2) and
352-
succ1 = mid1 and
353-
succ2 = mid2
354-
or
355-
interprocEdgePair(mid1, mid2, succ1, succ2)
377+
fwdIsSuccessor1(pred1, pred2, mid1, mid2, succ1, succ2) and
378+
fwdIsSuccessor2(pred1, pred2, mid1, mid2, succ1, succ2)
356379
)
357380
}
358381

0 commit comments

Comments
 (0)