Skip to content

Commit 780a07e

Browse files
authored
Merge pull request #4332 from jbj/ExtendedRangeAnalysis-stub
C++: ExtendedRangeAnalysis stub implementation
2 parents 7970fef + b7d0939 commit 780a07e

File tree

7 files changed

+43
-2
lines changed

7 files changed

+43
-2
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import semmle.code.cpp.rangeanalysis.SimpleRangeAnalysis
2+
//
3+
// Import each extension we want to enable
4+
import extensions.SubtractSelf
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import experimental.semmle.code.cpp.models.interfaces.SimpleRangeAnalysisExpr
2+
3+
private class SelfSub extends SimpleRangeAnalysisExpr, SubExpr {
4+
SelfSub() {
5+
// Match `x - x` but not `myInt - (unsigned char)myInt`.
6+
getLeftOperand().getExplicitlyConverted().(VariableAccess).getTarget() =
7+
getRightOperand().getExplicitlyConverted().(VariableAccess).getTarget()
8+
}
9+
10+
override float getLowerBounds() { result = 0 }
11+
12+
override float getUpperBounds() { result = 0 }
13+
14+
override predicate dependsOnChild(Expr child) { none() }
15+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
2+
3+
void test_overridability_sub(int x) {
4+
int zero = x - x;
5+
zero; // 0
6+
7+
int nonzero = x - (unsigned char)x;
8+
nonzero; // full range
9+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
| extended.cpp:4:14:4:14 | x | -2.147483648E9 | 2.147483647E9 |
2+
| extended.cpp:4:18:4:18 | x | -2.147483648E9 | 2.147483647E9 |
3+
| extended.cpp:5:3:5:6 | zero | 0.0 | 0.0 |
4+
| extended.cpp:7:17:7:17 | x | -2.147483648E9 | 2.147483647E9 |
5+
| extended.cpp:7:36:7:36 | x | -2.147483648E9 | 2.147483647E9 |
6+
| extended.cpp:8:3:8:9 | nonzero | -2.147483648E9 | 2.147483647E9 |
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import experimental.semmle.code.cpp.rangeanalysis.ExtendedRangeAnalysis
2+
3+
from VariableAccess expr, float lower, float upper
4+
where
5+
lower = lowerBound(expr) and
6+
upper = upperBound(expr)
7+
select expr, lower, upper

cpp/ql/test/experimental/library-tests/rangeanalysis/extensibility/extensibility.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,6 @@ int test_extensibility_add(int x) {
99
}
1010

1111
int test_overridability_sub(int x) {
12-
int result = x - x; // Returns 0 due to custom modeling in QL
12+
int result = x - (unsigned char)x; // Returns 0 due to custom modeling for this test being deliberately wrong
1313
return result; // 0
1414
}

cpp/ql/test/experimental/library-tests/rangeanalysis/extensibility/extensibility.expected

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33
| extensibility.c:6:38:6:38 | x | -10.0 | 10.0 |
44
| extensibility.c:7:12:7:17 | result | 90.0 | 110.0 |
55
| extensibility.c:12:16:12:16 | x | -2.147483648E9 | 2.147483647E9 |
6-
| extensibility.c:12:20:12:20 | x | -2.147483648E9 | 2.147483647E9 |
6+
| extensibility.c:12:35:12:35 | x | -2.147483648E9 | 2.147483647E9 |
77
| extensibility.c:13:10:13:15 | result | 0.0 | 0.0 |

0 commit comments

Comments
 (0)