mirror of
https://github.com/github/codeql.git
synced 2025-12-16 16:53:25 +01:00
C++: Add range analysis examples that explode
This commit is contained in:
@@ -413,6 +413,208 @@ double test_ternary_nested_of_literals(double m, double n, double o, double p, d
|
||||
return output;
|
||||
}
|
||||
|
||||
unsigned int conditional_nested_guards(unsigned int ip) {
|
||||
// This tests a combinatorial explosion that can happen from a large number of
|
||||
// nested linear guards.
|
||||
unsigned int special_number =
|
||||
(14 * ip > (2 * ip + 1) * 17 + (2 * ip + 1 + 1) * 17
|
||||
? 14 * ip
|
||||
: (2 * ip + 1) * 14 + (2 * ip + 1 + 1) * 17) >
|
||||
(2 * (ip * 14 + 32) +
|
||||
(4 * (ip * 14 + 32) +
|
||||
(2 * ip * 14 + 32) +
|
||||
2 * (ip * 14 + 64) +
|
||||
((2 * ip + 1) * 14 > (17 * (2 * ip) > 17 * ip ? 17 * (2 * ip) : 17 * ip)
|
||||
? (2 * ip + 1) * 14
|
||||
: 14 * (2 * ip) > 17 * ip
|
||||
? 14 * (2 * ip)
|
||||
: 14 * ip) >
|
||||
2 * ip * 14 + (2 * ip + 1) * 17
|
||||
? 4 * (ip * 14 + 32) +
|
||||
(2 * ip * 14 + 32) +
|
||||
2 * (ip * 14 + 64) +
|
||||
((2 * ip + 1) * 14 >
|
||||
(14 * (2 * ip) > 17 * ip ? 17 * (2 * ip) : 17 * ip)
|
||||
? (2 * ip + 1) * 14
|
||||
: 14 * (2 * ip) > 17 * ip
|
||||
? 14 * (2 * ip)
|
||||
: 14 * ip)
|
||||
: 2 * ip * 14 + (2 * ip + 1) * 17) >
|
||||
(4 * (ip * 14 + 32) +
|
||||
(2 * ip * 14 + 32) +
|
||||
2 * (ip * 14 + 64) +
|
||||
((2 * ip + 1) * 14 > (17 * (2 * ip) > 17 * ip ? 17 * (2 * ip) : 17 * ip)
|
||||
? (2 * ip + 1) * 14
|
||||
: 14 * (2 * ip) > 17 * ip
|
||||
? 14 * (2 * ip)
|
||||
: 14 * ip) >
|
||||
(14 * ip > (ip + 1) * 17 ? 17 * ip : (ip + 1) * 17)
|
||||
? 4 * (ip * 14 + 32) +
|
||||
(2 * ip * 14 + 32) +
|
||||
2 * (ip * 14 + 64) +
|
||||
((2 * ip + 1) * 14 > (17 * (2 * ip) > 17 * ip ? 17 * (2 * ip) : 17 * ip)
|
||||
? (2 * ip + 1) * 14
|
||||
: 14 * (2 * ip) > 17 * ip
|
||||
? 14 * (2 * ip)
|
||||
: 14 * ip)
|
||||
: 14 * ip > (ip + 1) * 17
|
||||
? 14 * ip
|
||||
: (ip + 1) * 14)
|
||||
? 2 * (ip * 14 + 32) +
|
||||
(4 * (ip * 14 + 32) +
|
||||
(2 * ip * 14 + 32) +
|
||||
2 * (ip * 14 + 64) +
|
||||
((2 * ip + 1) * 14 >
|
||||
(14 * (2 * ip) > 17 * ip ? 17 * (2 * ip) : 17 * ip)
|
||||
? (2 * ip + 1) * 14
|
||||
: 14 * (2 * ip) > 17 * ip
|
||||
? 14 * (2 * ip)
|
||||
: 14 * ip) >
|
||||
2 * ip * 14 + (2 * ip + 1) * 17
|
||||
? 4 * (ip * 14 + 32) +
|
||||
(2 * ip * 14 + 32) +
|
||||
2 * (ip * 14 + 64) +
|
||||
((2 * ip + 1) * 14 >
|
||||
(14 * (2 * ip) > 17 * ip ? 17 * (2 * ip) : 17 * ip)
|
||||
? (2 * ip + 1) * 14
|
||||
: 14 * (2 * ip) > 17 * ip
|
||||
? 14 * (2 * ip)
|
||||
: 14 * ip)
|
||||
: 2 * ip * 14 + (2 * ip + 1) * 17)
|
||||
: 4 * (ip * 14 + 32) +
|
||||
(2 * ip * 14 + 32) +
|
||||
2 * (ip * 14 + 64) +
|
||||
((2 * ip + 1) * 14 >
|
||||
(14 * (2 * ip) > 17 * ip ? 17 * (2 * ip) : 17 * ip)
|
||||
? (2 * ip + 1) * 14
|
||||
: 14 * (2 * ip) > 17 * ip
|
||||
? 14 * (2 * ip)
|
||||
: 14 * ip) >
|
||||
(14 * ip > (ip + 1) * 17 ? 17 * ip : (ip + 1) * 17)
|
||||
? 4 * (ip * 14 + 32) +
|
||||
(2 * ip * 14 + 32) +
|
||||
2 * (ip * 14 + 64) +
|
||||
((2 * ip + 1) * 14 >
|
||||
(14 * (2 * ip) > 17 * ip ? 17 * (2 * ip) : 17 * ip)
|
||||
? (2 * ip + 1) * 14
|
||||
: 14 * (2 * ip) > 17 * ip
|
||||
? 14 * (2 * ip)
|
||||
: 14 * ip)
|
||||
: 14 * ip > (ip + 1) * 17
|
||||
? 14 * ip
|
||||
: (ip + 1) * 14)
|
||||
? 14 * ip > (2 * ip + 1) * 17 + (2 * ip + 1 + 1) * 17
|
||||
? 14 * ip
|
||||
: (2 * ip + 1) * 14 + (2 * ip + 1 + 1) * 17
|
||||
: 2 * (ip * 14 + 32) +
|
||||
(4 * (ip * 14 + 32) +
|
||||
(2 * ip * 14 + 32) +
|
||||
2 * (ip * 14 + 64) +
|
||||
((2 * ip + 1) * 14 >
|
||||
(14 * (2 * ip) > 17 * ip ? 17 * (2 * ip) : 17 * ip)
|
||||
? (2 * ip + 1) * 14
|
||||
: 14 * (2 * ip) > 17 * ip
|
||||
? 14 * (2 * ip)
|
||||
: 14 * ip) >
|
||||
2 * ip * 14 + (2 * ip + 1) * 17
|
||||
? 4 * (ip * 14 + 32) +
|
||||
(2 * ip * 14 + 32) +
|
||||
2 * (ip * 14 + 64) +
|
||||
((2 * ip + 1) * 14 >
|
||||
(14 * (2 * ip) > 17 * ip ? 17 * (2 * ip) : 17 * ip)
|
||||
? (2 * ip + 1) * 14
|
||||
: 14 * (2 * ip) > 17 * ip
|
||||
? 14 * (2 * ip)
|
||||
: 14 * ip)
|
||||
: 2 * ip * 14 + (2 * ip + 1) * 17) >
|
||||
(4 * (ip * 14 + 32) +
|
||||
(2 * ip * 14 + 32) +
|
||||
2 * (ip * 14 + 64) +
|
||||
((2 * ip + 1) * 14 >
|
||||
(14 * (2 * ip) > 17 * ip ? 17 * (2 * ip) : 17 * ip)
|
||||
? (2 * ip + 1) * 14
|
||||
: 14 * (2 * ip) > 17 * ip
|
||||
? 14 * (2 * ip)
|
||||
: 14 * ip) >
|
||||
(14 * ip > (ip + 1) * 17 ? 17 * ip : (ip + 1) * 17)
|
||||
? 4 * (ip * 14 + 32) +
|
||||
(2 * ip * 14 + 32) +
|
||||
2 * (ip * 14 + 64) +
|
||||
((2 * ip + 1) * 14 >
|
||||
(14 * (2 * ip) > 17 * ip ? 17 * (2 * ip) : 17 * ip)
|
||||
? (2 * ip + 1) * 14
|
||||
: 14 * (2 * ip) > 17 * ip
|
||||
? 14 * (2 * ip)
|
||||
: 14 * ip)
|
||||
: 14 * ip > (ip + 1) * 17
|
||||
? 14 * ip
|
||||
: (ip + 1) * 14)
|
||||
? 2 * (ip * 14 + 32) +
|
||||
(4 * (ip * 14 + 32) +
|
||||
(2 * ip * 14 + 32) +
|
||||
2 * (ip * 14 + 64) +
|
||||
((2 * ip + 1) * 14 >
|
||||
(14 * (2 * ip) > 17 * ip ? 17 * (2 * ip) : 17 * ip)
|
||||
? (2 * ip + 1) * 14
|
||||
: 14 * (2 * ip) > 17 * ip
|
||||
? 14 * (2 * ip)
|
||||
: 14 * ip) >
|
||||
2 * ip * 14 + (2 * ip + 1) * 17
|
||||
? 4 * (ip * 14 + 32) +
|
||||
(2 * ip * 14 + 32) +
|
||||
2 * (ip * 14 + 64) +
|
||||
((2 * ip + 1) * 14 >
|
||||
(14 * (2 * ip) > 17 * ip ? 17 * (2 * ip) : 17 * ip)
|
||||
? (2 * ip + 1) * 14
|
||||
: 14 * (2 * ip) > 17 * ip
|
||||
? 14 * (2 * ip)
|
||||
: 14 * ip)
|
||||
: 2 * ip * 14 + (2 * ip + 1) * 17)
|
||||
: 4 * (ip * 14 + 32) +
|
||||
(2 * ip * 14 + 32) +
|
||||
2 * (ip * 14 + 64) +
|
||||
((2 * ip + 1) * 14 >
|
||||
(14 * (2 * ip) > 17 * ip ? 17 * (2 * ip) : 17 * ip)
|
||||
? (2 * ip + 1) * 14
|
||||
: 14 * (2 * ip) > 17 * ip
|
||||
? 14 * (2 * ip)
|
||||
: 14 * ip) >
|
||||
(14 * ip > (ip + 1) * 17 ? 17 * ip : (ip + 1) * 17)
|
||||
? 4 * (ip * 14 + 32) +
|
||||
(2 * ip * 14 + 32) +
|
||||
2 * (ip * 14 + 64) +
|
||||
((2 * ip + 1) * 14 >
|
||||
(14 * (2 * ip) > 17 * ip ? 17 * (2 * ip) : 17 * ip)
|
||||
? (2 * ip + 1) * 14
|
||||
: 14 * (2 * ip) > 17 * ip
|
||||
? 14 * (2 * ip)
|
||||
: 14 * ip)
|
||||
: 14 * ip > (ip + 1) * 17
|
||||
? 14 * ip
|
||||
: (ip + 1) * 14;
|
||||
return special_number;
|
||||
}
|
||||
|
||||
int many_conditional_assignments(int c1, int c2, int c3, int c4, int c5) {
|
||||
// This tests a combinatorial explosion that can happen from many conditional
|
||||
// assignments, since each conditional assignment doubles the number of
|
||||
// bounds.
|
||||
int x = 0;
|
||||
if (c1) { x += 748596; }
|
||||
if (c2) { x += 84652395; }
|
||||
if (c3) { x += 3675895; }
|
||||
if (c4) { x += 98634; }
|
||||
if (c5) { x += 7834985; }
|
||||
if (c1 && c2) { x += 938457398; }
|
||||
if (c1 && c3) { x += 73895648; }
|
||||
if (c1 && c4) { x += 12345432; }
|
||||
if (c1 && c5) { x += 38847; }
|
||||
if (c2 && c3) { x += 234; }
|
||||
// x now has 2^10 bounds, the 10 additions below give (2^10)^10 bounds
|
||||
int y = x + x + x + x + x + x + x + x + x + x + x + x;
|
||||
return y;
|
||||
}
|
||||
|
||||
// Test the comma expression.
|
||||
unsigned int test_comma01(unsigned int x) {
|
||||
unsigned int y = x < 100 ? x : 100;
|
||||
|
||||
Reference in New Issue
Block a user