| // RUN: %clang_analyze_cc1 -triple x86_64-apple-darwin10 -analyzer-checker=core,debug.ExprInspection -verify %s |
| |
| void clang_analyzer_eval(int); |
| |
| #include "Inputs/system-header-simulator.h" |
| |
| void use(int); |
| id foo(int x) { |
| if (x) |
| return 0; |
| static id p = foo(1); |
| clang_analyzer_eval(p == 0); // expected-warning{{TRUE}} |
| return p; |
| } |
| |
| const int &globalIntRef = 42; |
| |
| void testGlobalRef() { |
| // FIXME: Should be TRUE, but should at least not crash. |
| clang_analyzer_eval(globalIntRef == 42); // expected-warning{{UNKNOWN}} |
| } |
| |
| extern int globalInt; |
| struct IntWrapper { |
| int value; |
| }; |
| extern struct IntWrapper globalStruct; |
| extern void invalidateGlobals(); |
| |
| void testGlobalInvalidation() { |
| clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}} |
| clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}} |
| |
| if (globalInt != 42) |
| return; |
| if (globalStruct.value != 43) |
| return; |
| clang_analyzer_eval(globalInt == 42); // expected-warning{{TRUE}} |
| clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{TRUE}} |
| |
| invalidateGlobals(); |
| clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}} |
| clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}} |
| |
| // Repeat to make sure we don't get the /same/ new symbolic values. |
| if (globalInt != 42) |
| return; |
| if (globalStruct.value != 43) |
| return; |
| clang_analyzer_eval(globalInt == 42); // expected-warning{{TRUE}} |
| clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{TRUE}} |
| |
| invalidateGlobals(); |
| clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}} |
| clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}} |
| } |
| |
| void testGlobalInvalidationWithDirectBinding() { |
| clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}} |
| clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}} |
| |
| globalInt = 42; |
| globalStruct.value = 43; |
| clang_analyzer_eval(globalInt == 42); // expected-warning{{TRUE}} |
| clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{TRUE}} |
| |
| invalidateGlobals(); |
| clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}} |
| clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}} |
| } |
| |
| void testStaticLocals(void) { |
| static int i; |
| int tmp; |
| |
| extern int someSymbolicValue(); |
| i = someSymbolicValue(); |
| |
| if (i == 5) { |
| clang_analyzer_eval(i == 5); // expected-warning{{TRUE}} |
| scanf("%d", &tmp); |
| clang_analyzer_eval(i == 5); // expected-warning{{TRUE}} |
| invalidateGlobals(); |
| clang_analyzer_eval(i == 5); // expected-warning{{TRUE}} |
| } |
| |
| i = 6; |
| clang_analyzer_eval(i == 6); // expected-warning{{TRUE}} |
| scanf("%d", &tmp); |
| clang_analyzer_eval(i == 6); // expected-warning{{TRUE}} |
| invalidateGlobals(); |
| clang_analyzer_eval(i == 6); // expected-warning{{TRUE}} |
| |
| i = someSymbolicValue(); |
| if (i == 7) { |
| clang_analyzer_eval(i == 7); // expected-warning{{TRUE}} |
| scanf("%d", &i); |
| clang_analyzer_eval(i == 7); // expected-warning{{UNKNOWN}} |
| } |
| |
| i = 8; |
| clang_analyzer_eval(i == 8); // expected-warning{{TRUE}} |
| scanf("%d", &i); |
| clang_analyzer_eval(i == 8); // expected-warning{{UNKNOWN}} |
| } |
| |
| void testNonSystemGlobals(void) { |
| extern int i; |
| int tmp; |
| |
| if (i == 5) { |
| clang_analyzer_eval(i == 5); // expected-warning{{TRUE}} |
| scanf("%d", &tmp); |
| clang_analyzer_eval(i == 5); // expected-warning{{TRUE}} |
| invalidateGlobals(); |
| clang_analyzer_eval(i == 5); // expected-warning{{UNKNOWN}} |
| } |
| |
| i = 6; |
| clang_analyzer_eval(i == 6); // expected-warning{{TRUE}} |
| scanf("%d", &tmp); |
| clang_analyzer_eval(i == 6); // expected-warning{{TRUE}} |
| invalidateGlobals(); |
| clang_analyzer_eval(i == 6); // expected-warning{{UNKNOWN}} |
| |
| if (i == 7) { |
| clang_analyzer_eval(i == 7); // expected-warning{{TRUE}} |
| scanf("%d", &i); |
| clang_analyzer_eval(i == 7); // expected-warning{{UNKNOWN}} |
| } |
| |
| i = 8; |
| clang_analyzer_eval(i == 8); // expected-warning{{TRUE}} |
| scanf("%d", &i); |
| clang_analyzer_eval(i == 8); // expected-warning{{UNKNOWN}} |
| } |
| |
| void testWrappedGlobals(void) { |
| extern char c; |
| SomeStruct s; |
| |
| if (c == 'C') { |
| s.p = &c; |
| clang_analyzer_eval(c == 'C'); // expected-warning{{TRUE}} |
| fakeSystemHeaderCall(0); |
| clang_analyzer_eval(c == 'C'); // expected-warning{{TRUE}} |
| fakeSystemHeaderCall(&s); |
| clang_analyzer_eval(c == 'C'); // expected-warning{{UNKNOWN}} |
| } |
| |
| c = 'c'; |
| s.p = &c; |
| clang_analyzer_eval(c == 'c'); // expected-warning{{TRUE}} |
| fakeSystemHeaderCall(0); |
| clang_analyzer_eval(c == 'c'); // expected-warning{{TRUE}} |
| fakeSystemHeaderCall(&s); |
| clang_analyzer_eval(c == 'c'); // expected-warning{{UNKNOWN}} |
| |
| if (c == 'C') { |
| s.p = &c; |
| clang_analyzer_eval(c == 'C'); // expected-warning{{TRUE}} |
| fakeSystemHeaderCall(0); |
| clang_analyzer_eval(c == 'C'); // expected-warning{{TRUE}} |
| fakeSystemHeaderCall(&s); |
| clang_analyzer_eval(c == 'C'); // expected-warning{{UNKNOWN}} |
| } |
| } |
| |
| void testWrappedStaticsViaGlobal(void) { |
| static char c; |
| extern SomeStruct s; |
| |
| extern char getSomeChar(); |
| c = getSomeChar(); |
| |
| if (c == 'C') { |
| s.p = &c; |
| clang_analyzer_eval(c == 'C'); // expected-warning{{TRUE}} |
| invalidateGlobals(); |
| clang_analyzer_eval(c == 'C'); // expected-warning{{UNKNOWN}} |
| } |
| |
| c = 'c'; |
| s.p = &c; |
| clang_analyzer_eval(c == 'c'); // expected-warning{{TRUE}} |
| invalidateGlobals(); |
| clang_analyzer_eval(c == 'c'); // expected-warning{{UNKNOWN}} |
| } |