2020-05-14 22:07:54 +08:00
|
|
|
// RUN: %clang_analyze_cc1 -verify %s \
|
|
|
|
// RUN: -analyzer-checker core,debug.ExprInspection
|
2018-06-01 01:22:38 +08:00
|
|
|
|
|
|
|
// Stuff that used to hang.
|
|
|
|
|
2020-05-14 22:07:54 +08:00
|
|
|
extern void __assert_fail(__const char *__assertion, __const char *__file,
|
|
|
|
unsigned int __line, __const char *__function)
|
|
|
|
__attribute__((__noreturn__));
|
|
|
|
#define assert(expr) \
|
|
|
|
((expr) ? (void)(0) : __assert_fail(#expr, __FILE__, __LINE__, __func__))
|
|
|
|
|
|
|
|
void clang_analyzer_eval(int);
|
|
|
|
|
2018-06-01 01:22:38 +08:00
|
|
|
int g();
|
|
|
|
|
|
|
|
int f(int y) {
|
|
|
|
return y + g();
|
|
|
|
}
|
|
|
|
|
|
|
|
int produce_a_very_large_symbol(int x) {
|
|
|
|
return f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(
|
|
|
|
f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(x))))))))))))))))))))))))))))))));
|
|
|
|
}
|
|
|
|
|
|
|
|
void produce_an_exponentially_exploding_symbol(int x, int y) {
|
|
|
|
x += y; y += x + g();
|
|
|
|
x += y; y += x + g();
|
|
|
|
x += y; y += x + g();
|
|
|
|
x += y; y += x + g();
|
|
|
|
x += y; y += x + g();
|
|
|
|
x += y; y += x + g();
|
|
|
|
x += y; y += x + g();
|
|
|
|
x += y; y += x + g();
|
|
|
|
x += y; y += x + g();
|
|
|
|
x += y; y += x + g();
|
|
|
|
x += y; y += x + g();
|
|
|
|
}
|
2020-05-14 22:07:54 +08:00
|
|
|
|
|
|
|
void produce_an_exponentially_exploding_symbol_2(int x, int y) {
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
if (x > 1) {
|
|
|
|
if (x > 2) {
|
|
|
|
if (x > 3) {
|
|
|
|
if (x > 4) {
|
|
|
|
if (x > 5) {
|
|
|
|
if (x > 6) {
|
|
|
|
if (x > 7) {
|
|
|
|
if (x > 8) {
|
|
|
|
if (x > 9) {
|
|
|
|
if (x > 10) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void produce_an_exponentially_exploding_symbol_3(int x, int y) {
|
|
|
|
assert(0 < x && x < 10);
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
x &= y;
|
|
|
|
y &= x & g();
|
|
|
|
clang_analyzer_eval(0 < x && x < 10); // expected-warning{{TRUE}}
|
|
|
|
// expected-warning@-1{{FALSE}}
|
|
|
|
}
|