Skip to content

Commit 734a91d

Browse files
authored
Merge pull request #14237 from MathiasVP/range-analysis-perf
C++: Fix order of non-linear join in range analysis
2 parents b08e410 + 46b15fa commit 734a91d

File tree

1 file changed

+35
-14
lines changed

1 file changed

+35
-14
lines changed

cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/RangeAnalysisStage.qll

Lines changed: 35 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -917,25 +917,46 @@ module RangeStage<
917917
bounded(cast.getOperand(), b, delta, upper, fromBackEdge, origdelta, reason)
918918
}
919919

920+
pragma[nomagic]
921+
private predicate initialBoundedUpper(SemExpr e) {
922+
exists(D::Delta d |
923+
initialBounded(e, _, d, false, _, _, _) and
924+
D::toFloat(d) >= 0
925+
)
926+
}
927+
928+
private predicate noOverflow0(SemExpr e, boolean upper) {
929+
exists(boolean lower | lower = upper.booleanNot() |
930+
semExprDoesNotOverflow(lower, e)
931+
or
932+
upper = [true, false] and
933+
not potentiallyOverflowingExpr(lower, e)
934+
)
935+
}
936+
937+
pragma[nomagic]
938+
private predicate initialBoundedLower(SemExpr e) {
939+
exists(D::Delta d |
940+
initialBounded(e, _, d, true, _, _, _) and
941+
D::toFloat(d) <= 0
942+
)
943+
}
944+
945+
pragma[nomagic]
946+
private predicate noOverflow(SemExpr e, boolean upper) {
947+
noOverflow0(e, upper)
948+
or
949+
upper = true and initialBoundedUpper(e)
950+
or
951+
upper = false and initialBoundedLower(e)
952+
}
953+
920954
predicate bounded(
921955
SemExpr e, SemBound b, D::Delta delta, boolean upper, boolean fromBackEdge, D::Delta origdelta,
922956
SemReason reason
923957
) {
924958
initialBounded(e, b, delta, upper, fromBackEdge, origdelta, reason) and
925-
(
926-
semExprDoesNotOverflow(upper.booleanNot(), e)
927-
or
928-
not potentiallyOverflowingExpr(upper.booleanNot(), e)
929-
or
930-
exists(D::Delta otherDelta |
931-
initialBounded(e, _, otherDelta, upper.booleanNot(), _, _, _) and
932-
(
933-
upper = true and D::toFloat(otherDelta) >= 0
934-
or
935-
upper = false and D::toFloat(otherDelta) <= 0
936-
)
937-
)
938-
)
959+
noOverflow(e, upper)
939960
}
940961

941962
predicate potentiallyOverflowingExpr(boolean positively, SemExpr expr) {

0 commit comments

Comments
 (0)