diff --git a/cpp/ql/test/experimental/library-tests/rangeanalysis/extensibility/extensibility.c b/cpp/ql/test/experimental/library-tests/rangeanalysis/extensibility/extensibility.c index 42f7574996c..afdde0b615c 100644 --- a/cpp/ql/test/experimental/library-tests/rangeanalysis/extensibility/extensibility.c +++ b/cpp/ql/test/experimental/library-tests/rangeanalysis/extensibility/extensibility.c @@ -7,3 +7,8 @@ int test_extensibility_add(int x) { return result; // 90 .. 110 } } + +int test_overridability_sub(int x) { + int result = x - x; // Returns 0 due to custom modeling in QL + return result; // 0 +} \ No newline at end of file diff --git a/cpp/ql/test/experimental/library-tests/rangeanalysis/extensibility/extensibility.expected b/cpp/ql/test/experimental/library-tests/rangeanalysis/extensibility/extensibility.expected index 463ac9ea06c..ad97d9b2df5 100644 --- a/cpp/ql/test/experimental/library-tests/rangeanalysis/extensibility/extensibility.expected +++ b/cpp/ql/test/experimental/library-tests/rangeanalysis/extensibility/extensibility.expected @@ -2,3 +2,6 @@ | extensibility.c:5:19:5:19 | x | -10.0 | 2.147483647E9 | | extensibility.c:6:38:6:38 | x | -10.0 | 10.0 | | extensibility.c:7:12:7:17 | result | 90.0 | 110.0 | +| extensibility.c:12:16:12:16 | x | -2.147483648E9 | 2.147483647E9 | +| extensibility.c:12:20:12:20 | x | -2.147483648E9 | 2.147483647E9 | +| extensibility.c:13:10:13:15 | result | 0.0 | 0.0 | diff --git a/cpp/ql/test/experimental/library-tests/rangeanalysis/extensibility/extensibility.ql b/cpp/ql/test/experimental/library-tests/rangeanalysis/extensibility/extensibility.ql index 710a89ad7fa..a007a5d4dab 100644 --- a/cpp/ql/test/experimental/library-tests/rangeanalysis/extensibility/extensibility.ql +++ b/cpp/ql/test/experimental/library-tests/rangeanalysis/extensibility/extensibility.ql @@ -25,6 +25,18 @@ class CustomAddFunctionCall extends SimpleRangeAnalysisExpr, FunctionCall { override predicate dependsOnChild(Expr child) { child = this.getAnArgument() } } +class SelfSub extends SimpleRangeAnalysisExpr, SubExpr { + SelfSub() { + getLeftOperand().(VariableAccess).getTarget() = getRightOperand().(VariableAccess).getTarget() + } + + override float getLowerBounds() { result = 0 } + + override float getUpperBounds() { result = 0 } + + override predicate dependsOnChild(Expr child) { child = this.getAnOperand() } +} + from VariableAccess expr, float lower, float upper where lower = lowerBound(expr) and