Skip to content

Commit cd5509a

Browse files
committed
Java: locations for range analysis
1 parent c8c15a0 commit cd5509a

File tree

5 files changed

+23
-19
lines changed

5 files changed

+23
-19
lines changed

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ private import semmle.code.java.Maps
7575
import Bound
7676
private import codeql.rangeanalysis.RangeAnalysis
7777

78-
module Sem implements Semantic {
78+
module Sem implements Semantic<Location> {
7979
private import java as J
8080
private import SSA as SSA
8181
private import RangeUtils as RU
@@ -264,7 +264,7 @@ module Sem implements Semantic {
264264
predicate conversionCannotOverflow = safeCast/2;
265265
}
266266

267-
module SignInp implements SignAnalysisSig<Sem> {
267+
module SignInp implements SignAnalysisSig<Location, Sem> {
268268
private import SignAnalysis
269269
private import internal.rangeanalysis.Sign
270270

@@ -281,7 +281,7 @@ module SignInp implements SignAnalysisSig<Sem> {
281281
predicate semMayBeNegative(Sem::Expr e) { exprSign(e) = TNeg() }
282282
}
283283

284-
module Modulus implements ModulusAnalysisSig<Sem> {
284+
module Modulus implements ModulusAnalysisSig<Location, Sem> {
285285
class ModBound = Bound;
286286

287287
private import codeql.rangeanalysis.ModulusAnalysis as Mod
@@ -307,7 +307,7 @@ module IntDelta implements DeltaSig {
307307
Delta fromFloat(float f) { result = f }
308308
}
309309

310-
module JavaLangImpl implements LangSig<Sem, IntDelta> {
310+
module JavaLangImpl implements LangSig<Location, Sem, IntDelta> {
311311
/**
312312
* Holds if `e >= bound` (if `upper = false`) or `e <= bound` (if `upper = true`).
313313
*/
@@ -379,7 +379,7 @@ module Bounds implements BoundSig<Location, Sem, IntDelta> {
379379
}
380380
}
381381

382-
module Overflow implements OverflowSig<Sem, IntDelta> {
382+
module Overflow implements OverflowSig<Location, Sem, IntDelta> {
383383
predicate semExprDoesNotOverflow(boolean positively, Sem::Expr expr) {
384384
positively = [true, false] and exists(expr)
385385
}

java/ql/lib/semmle/code/java/dataflow/RangeUtils.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ private import semmle.code.java.Constants
99
private import semmle.code.java.dataflow.RangeAnalysis
1010
private import codeql.rangeanalysis.internal.RangeUtils
1111

12-
private module U = MakeUtils<Sem, IntDelta>;
12+
private module U = MakeUtils<Location, Sem, IntDelta>;
1313

1414
private predicate backEdge = U::backEdge/3;
1515

shared/rangeanalysis/codeql/rangeanalysis/ModulusAnalysis.qll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ private import codeql.util.Location
1414
private import RangeAnalysis
1515

1616
module ModulusAnalysis<
17-
LocationSig Location, Semantic Sem, DeltaSig D, BoundSig<Location, Sem, D> Bounds>
17+
LocationSig Location, Semantic<Location> Sem, DeltaSig D, BoundSig<Location, Sem, D> Bounds>
1818
{
19-
private import internal.RangeUtils::MakeUtils<Sem, D>
19+
private import internal.RangeUtils::MakeUtils<Location, Sem, D>
2020

2121
bindingset[pos, v]
2222
pragma[inline_late]

shared/rangeanalysis/codeql/rangeanalysis/RangeAnalysis.qll

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,13 @@
6565

6666
private import codeql.util.Location
6767

68-
signature module Semantic {
68+
signature module Semantic<LocationSig Location> {
6969
class Expr {
7070
string toString();
7171

7272
BasicBlock getBasicBlock();
73+
74+
Location getLocation();
7375
}
7476

7577
class ConstantIntegerExpr extends Expr {
@@ -294,7 +296,7 @@ signature module Semantic {
294296
predicate conversionCannotOverflow(Type fromType, Type toType);
295297
}
296298

297-
signature module SignAnalysisSig<Semantic Sem> {
299+
signature module SignAnalysisSig<LocationSig Location, Semantic<Location> Sem> {
298300
/** Holds if `e` can be positive and cannot be negative. */
299301
predicate semPositive(Sem::Expr e);
300302

@@ -320,7 +322,7 @@ signature module SignAnalysisSig<Semantic Sem> {
320322
predicate semMayBeNegative(Sem::Expr e);
321323
}
322324

323-
signature module ModulusAnalysisSig<Semantic Sem> {
325+
signature module ModulusAnalysisSig<LocationSig Location, Semantic<Location> Sem> {
324326
class ModBound;
325327

326328
predicate exprModulus(Sem::Expr e, ModBound b, int val, int mod);
@@ -346,7 +348,7 @@ signature module DeltaSig {
346348
Delta fromFloat(float f);
347349
}
348350

349-
signature module LangSig<Semantic Sem, DeltaSig D> {
351+
signature module LangSig<LocationSig Location, Semantic<Location> Sem, DeltaSig D> {
350352
/**
351353
* Holds if `e >= bound` (if `upper = false`) or `e <= bound` (if `upper = true`).
352354
*/
@@ -372,7 +374,7 @@ signature module LangSig<Semantic Sem, DeltaSig D> {
372374
default predicate includeRelativeBounds() { any() }
373375
}
374376

375-
signature module BoundSig<LocationSig Location, Semantic Sem, DeltaSig D> {
377+
signature module BoundSig<LocationSig Location, Semantic<Location> Sem, DeltaSig D> {
376378
/**
377379
* A bound that the range analysis can infer for a variable. This includes
378380
* constant bounds represented by the abstract value zero, SSA bounds for when
@@ -409,22 +411,23 @@ signature module BoundSig<LocationSig Location, Semantic Sem, DeltaSig D> {
409411
}
410412
}
411413

412-
signature module OverflowSig<Semantic Sem, DeltaSig D> {
414+
signature module OverflowSig<LocationSig Location, Semantic<Location> Sem, DeltaSig D> {
413415
predicate semExprDoesNotOverflow(boolean positively, Sem::Expr expr);
414416
}
415417

416418
module RangeStage<
417-
LocationSig Location, Semantic Sem, DeltaSig D, BoundSig<Location, Sem, D> Bounds,
418-
OverflowSig<Sem, D> OverflowParam, LangSig<Sem, D> LangParam, SignAnalysisSig<Sem> SignAnalysis,
419-
ModulusAnalysisSig<Sem> ModulusAnalysisParam>
419+
LocationSig Location, Semantic<Location> Sem, DeltaSig D, BoundSig<Location, Sem, D> Bounds,
420+
OverflowSig<Location, Sem, D> OverflowParam, LangSig<Location, Sem, D> LangParam,
421+
SignAnalysisSig<Location, Sem> SignAnalysis,
422+
ModulusAnalysisSig<Location, Sem> ModulusAnalysisParam>
420423
{
421424
private import Bounds
422425
private import LangParam
423426
private import D
424427
private import OverflowParam
425428
private import SignAnalysis
426429
private import ModulusAnalysisParam
427-
private import internal.RangeUtils::MakeUtils<Sem, D>
430+
private import internal.RangeUtils::MakeUtils<Location, Sem, D>
428431

429432
/**
430433
* An expression that does conversion, boxing, or unboxing

shared/rangeanalysis/codeql/rangeanalysis/internal/RangeUtils.qll

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
private import codeql.rangeanalysis.RangeAnalysis
2+
private import codeql.util.Location
23

3-
module MakeUtils<Semantic Lang, DeltaSig D> {
4+
module MakeUtils<LocationSig Location, Semantic<Location> Lang, DeltaSig D> {
45
private import Lang
56

67
/**

0 commit comments

Comments
 (0)