1*67e74705SXin Li// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -analyze -analyzer-checker=core,debug.ExprInspection -verify %s 2*67e74705SXin Li 3*67e74705SXin Livoid clang_analyzer_eval(int); 4*67e74705SXin Li 5*67e74705SXin Li#include "Inputs/system-header-simulator.h" 6*67e74705SXin Li 7*67e74705SXin Livoid use(int); 8*67e74705SXin Liid foo(int x) { 9*67e74705SXin Li if (x) 10*67e74705SXin Li return 0; 11*67e74705SXin Li static id p = foo(1); 12*67e74705SXin Li clang_analyzer_eval(p == 0); // expected-warning{{TRUE}} 13*67e74705SXin Li return p; 14*67e74705SXin Li} 15*67e74705SXin Li 16*67e74705SXin Liconst int &globalIntRef = 42; 17*67e74705SXin Li 18*67e74705SXin Livoid testGlobalRef() { 19*67e74705SXin Li // FIXME: Should be TRUE, but should at least not crash. 20*67e74705SXin Li clang_analyzer_eval(globalIntRef == 42); // expected-warning{{UNKNOWN}} 21*67e74705SXin Li} 22*67e74705SXin Li 23*67e74705SXin Liextern int globalInt; 24*67e74705SXin Listruct IntWrapper { 25*67e74705SXin Li int value; 26*67e74705SXin Li}; 27*67e74705SXin Liextern struct IntWrapper globalStruct; 28*67e74705SXin Liextern void invalidateGlobals(); 29*67e74705SXin Li 30*67e74705SXin Livoid testGlobalInvalidation() { 31*67e74705SXin Li clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}} 32*67e74705SXin Li clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}} 33*67e74705SXin Li 34*67e74705SXin Li if (globalInt != 42) 35*67e74705SXin Li return; 36*67e74705SXin Li if (globalStruct.value != 43) 37*67e74705SXin Li return; 38*67e74705SXin Li clang_analyzer_eval(globalInt == 42); // expected-warning{{TRUE}} 39*67e74705SXin Li clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{TRUE}} 40*67e74705SXin Li 41*67e74705SXin Li invalidateGlobals(); 42*67e74705SXin Li clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}} 43*67e74705SXin Li clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}} 44*67e74705SXin Li 45*67e74705SXin Li // Repeat to make sure we don't get the /same/ new symbolic values. 46*67e74705SXin Li if (globalInt != 42) 47*67e74705SXin Li return; 48*67e74705SXin Li if (globalStruct.value != 43) 49*67e74705SXin Li return; 50*67e74705SXin Li clang_analyzer_eval(globalInt == 42); // expected-warning{{TRUE}} 51*67e74705SXin Li clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{TRUE}} 52*67e74705SXin Li 53*67e74705SXin Li invalidateGlobals(); 54*67e74705SXin Li clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}} 55*67e74705SXin Li clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}} 56*67e74705SXin Li} 57*67e74705SXin Li 58*67e74705SXin Livoid testGlobalInvalidationWithDirectBinding() { 59*67e74705SXin Li clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}} 60*67e74705SXin Li clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}} 61*67e74705SXin Li 62*67e74705SXin Li globalInt = 42; 63*67e74705SXin Li globalStruct.value = 43; 64*67e74705SXin Li clang_analyzer_eval(globalInt == 42); // expected-warning{{TRUE}} 65*67e74705SXin Li clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{TRUE}} 66*67e74705SXin Li 67*67e74705SXin Li invalidateGlobals(); 68*67e74705SXin Li clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}} 69*67e74705SXin Li clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}} 70*67e74705SXin Li} 71*67e74705SXin Li 72*67e74705SXin Livoid testStaticLocals(void) { 73*67e74705SXin Li static int i; 74*67e74705SXin Li int tmp; 75*67e74705SXin Li 76*67e74705SXin Li extern int someSymbolicValue(); 77*67e74705SXin Li i = someSymbolicValue(); 78*67e74705SXin Li 79*67e74705SXin Li if (i == 5) { 80*67e74705SXin Li clang_analyzer_eval(i == 5); // expected-warning{{TRUE}} 81*67e74705SXin Li scanf("%d", &tmp); 82*67e74705SXin Li clang_analyzer_eval(i == 5); // expected-warning{{TRUE}} 83*67e74705SXin Li invalidateGlobals(); 84*67e74705SXin Li clang_analyzer_eval(i == 5); // expected-warning{{TRUE}} 85*67e74705SXin Li } 86*67e74705SXin Li 87*67e74705SXin Li i = 6; 88*67e74705SXin Li clang_analyzer_eval(i == 6); // expected-warning{{TRUE}} 89*67e74705SXin Li scanf("%d", &tmp); 90*67e74705SXin Li clang_analyzer_eval(i == 6); // expected-warning{{TRUE}} 91*67e74705SXin Li invalidateGlobals(); 92*67e74705SXin Li clang_analyzer_eval(i == 6); // expected-warning{{TRUE}} 93*67e74705SXin Li 94*67e74705SXin Li i = someSymbolicValue(); 95*67e74705SXin Li if (i == 7) { 96*67e74705SXin Li clang_analyzer_eval(i == 7); // expected-warning{{TRUE}} 97*67e74705SXin Li scanf("%d", &i); 98*67e74705SXin Li clang_analyzer_eval(i == 7); // expected-warning{{UNKNOWN}} 99*67e74705SXin Li } 100*67e74705SXin Li 101*67e74705SXin Li i = 8; 102*67e74705SXin Li clang_analyzer_eval(i == 8); // expected-warning{{TRUE}} 103*67e74705SXin Li scanf("%d", &i); 104*67e74705SXin Li clang_analyzer_eval(i == 8); // expected-warning{{UNKNOWN}} 105*67e74705SXin Li} 106*67e74705SXin Li 107*67e74705SXin Livoid testNonSystemGlobals(void) { 108*67e74705SXin Li extern int i; 109*67e74705SXin Li int tmp; 110*67e74705SXin Li 111*67e74705SXin Li if (i == 5) { 112*67e74705SXin Li clang_analyzer_eval(i == 5); // expected-warning{{TRUE}} 113*67e74705SXin Li scanf("%d", &tmp); 114*67e74705SXin Li clang_analyzer_eval(i == 5); // expected-warning{{TRUE}} 115*67e74705SXin Li invalidateGlobals(); 116*67e74705SXin Li clang_analyzer_eval(i == 5); // expected-warning{{UNKNOWN}} 117*67e74705SXin Li } 118*67e74705SXin Li 119*67e74705SXin Li i = 6; 120*67e74705SXin Li clang_analyzer_eval(i == 6); // expected-warning{{TRUE}} 121*67e74705SXin Li scanf("%d", &tmp); 122*67e74705SXin Li clang_analyzer_eval(i == 6); // expected-warning{{TRUE}} 123*67e74705SXin Li invalidateGlobals(); 124*67e74705SXin Li clang_analyzer_eval(i == 6); // expected-warning{{UNKNOWN}} 125*67e74705SXin Li 126*67e74705SXin Li if (i == 7) { 127*67e74705SXin Li clang_analyzer_eval(i == 7); // expected-warning{{TRUE}} 128*67e74705SXin Li scanf("%d", &i); 129*67e74705SXin Li clang_analyzer_eval(i == 7); // expected-warning{{UNKNOWN}} 130*67e74705SXin Li } 131*67e74705SXin Li 132*67e74705SXin Li i = 8; 133*67e74705SXin Li clang_analyzer_eval(i == 8); // expected-warning{{TRUE}} 134*67e74705SXin Li scanf("%d", &i); 135*67e74705SXin Li clang_analyzer_eval(i == 8); // expected-warning{{UNKNOWN}} 136*67e74705SXin Li} 137*67e74705SXin Li 138*67e74705SXin Livoid testWrappedGlobals(void) { 139*67e74705SXin Li extern char c; 140*67e74705SXin Li SomeStruct s; 141*67e74705SXin Li 142*67e74705SXin Li if (c == 'C') { 143*67e74705SXin Li s.p = &c; 144*67e74705SXin Li clang_analyzer_eval(c == 'C'); // expected-warning{{TRUE}} 145*67e74705SXin Li fakeSystemHeaderCall(0); 146*67e74705SXin Li clang_analyzer_eval(c == 'C'); // expected-warning{{TRUE}} 147*67e74705SXin Li fakeSystemHeaderCall(&s); 148*67e74705SXin Li clang_analyzer_eval(c == 'C'); // expected-warning{{UNKNOWN}} 149*67e74705SXin Li } 150*67e74705SXin Li 151*67e74705SXin Li c = 'c'; 152*67e74705SXin Li s.p = &c; 153*67e74705SXin Li clang_analyzer_eval(c == 'c'); // expected-warning{{TRUE}} 154*67e74705SXin Li fakeSystemHeaderCall(0); 155*67e74705SXin Li clang_analyzer_eval(c == 'c'); // expected-warning{{TRUE}} 156*67e74705SXin Li fakeSystemHeaderCall(&s); 157*67e74705SXin Li clang_analyzer_eval(c == 'c'); // expected-warning{{UNKNOWN}} 158*67e74705SXin Li 159*67e74705SXin Li if (c == 'C') { 160*67e74705SXin Li s.p = &c; 161*67e74705SXin Li clang_analyzer_eval(c == 'C'); // expected-warning{{TRUE}} 162*67e74705SXin Li fakeSystemHeaderCall(0); 163*67e74705SXin Li clang_analyzer_eval(c == 'C'); // expected-warning{{TRUE}} 164*67e74705SXin Li fakeSystemHeaderCall(&s); 165*67e74705SXin Li clang_analyzer_eval(c == 'C'); // expected-warning{{UNKNOWN}} 166*67e74705SXin Li } 167*67e74705SXin Li} 168*67e74705SXin Li 169*67e74705SXin Livoid testWrappedStaticsViaGlobal(void) { 170*67e74705SXin Li static char c; 171*67e74705SXin Li extern SomeStruct s; 172*67e74705SXin Li 173*67e74705SXin Li extern char getSomeChar(); 174*67e74705SXin Li c = getSomeChar(); 175*67e74705SXin Li 176*67e74705SXin Li if (c == 'C') { 177*67e74705SXin Li s.p = &c; 178*67e74705SXin Li clang_analyzer_eval(c == 'C'); // expected-warning{{TRUE}} 179*67e74705SXin Li invalidateGlobals(); 180*67e74705SXin Li clang_analyzer_eval(c == 'C'); // expected-warning{{UNKNOWN}} 181*67e74705SXin Li } 182*67e74705SXin Li 183*67e74705SXin Li c = 'c'; 184*67e74705SXin Li s.p = &c; 185*67e74705SXin Li clang_analyzer_eval(c == 'c'); // expected-warning{{TRUE}} 186*67e74705SXin Li invalidateGlobals(); 187*67e74705SXin Li clang_analyzer_eval(c == 'c'); // expected-warning{{UNKNOWN}} 188*67e74705SXin Li} 189