Skip to content

Commit 79a0a56

Browse files
authored
Merge pull request #1890 from aschackmull/java/best-bound-rangeanalysis
Java: Restrict the output of Range Analysis to the best bounds.
2 parents d2336dc + 6b85fe0 commit 79a0a56

File tree

1 file changed

+13
-1
lines changed

1 file changed

+13
-1
lines changed

java/ql/src/semmle/code/java/dataflow/RangeAnalysis.qll

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,8 @@ private module RangeAnalysisCache {
8989
*/
9090
cached
9191
predicate bounded(Expr e, Bound b, int delta, boolean upper, Reason reason) {
92-
bounded(e, b, delta, upper, _, _, reason)
92+
bounded(e, b, delta, upper, _, _, reason) and
93+
bestBound(e, b, delta, upper)
9394
}
9495
}
9596

@@ -105,6 +106,17 @@ private module RangeAnalysisCache {
105106
private import RangeAnalysisCache
106107
import RangeAnalysisPublic
107108

109+
/**
110+
* Holds if `b + delta` is a valid bound for `e` and this is the best such delta.
111+
* - `upper = true` : `e <= b + delta`
112+
* - `upper = false` : `e >= b + delta`
113+
*/
114+
private predicate bestBound(Expr e, Bound b, int delta, boolean upper) {
115+
delta = min(int d | bounded(e, b, d, upper, _, _, _)) and upper = true
116+
or
117+
delta = max(int d | bounded(e, b, d, upper, _, _, _)) and upper = false
118+
}
119+
108120
/**
109121
* Holds if `comp` corresponds to:
110122
* - `upper = true` : `v <= e + delta` or `v < e + delta`

0 commit comments

Comments
 (0)