14967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// RUN: %clang_cc1 -triple i386-apple-darwin10 -analyze -analyzer-checker=core.builtin,debug.ExprInspection,unix.cstring -verify %s 24967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 34967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartypedef unsigned long size_t; 44967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 54967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct S { 64967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar struct S3 { 74967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar int y[10]; 84967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar }; 94967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar struct S2 : S3 { 104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar int *x; 114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } s2[10]; 124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar int z; 134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}; 144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid clang_analyzer_explain(int); 174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid clang_analyzer_explain(void *); 184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid clang_analyzer_explain(S); 194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarsize_t clang_analyzer_getExtent(void *); 214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarsize_t strlen(const char *); 234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarint conjure(); 254967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarS conjure_S(); 264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarint glob; 284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstatic int stat_glob; 294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid *glob_ptr; 304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// Test strings are regex'ed because we need to match exact string 324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// rather than a substring. 334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid test_1(int param, void *ptr) { 354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar clang_analyzer_explain(&glob); // expected-warning-re{{{{^pointer to global variable 'glob'$}}}} 364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar clang_analyzer_explain(param); // expected-warning-re{{{{^argument 'param'$}}}} 374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar clang_analyzer_explain(ptr); // expected-warning-re{{{{^argument 'ptr'$}}}} 384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (param == 42) 394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar clang_analyzer_explain(param); // expected-warning-re{{{{^signed 32-bit integer '42'$}}}} 404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid test_2(char *ptr, int ext) { 434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar clang_analyzer_explain((void *) "asdf"); // expected-warning-re{{{{^pointer to element of type 'char' with index 0 of string literal "asdf"$}}}} 444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar clang_analyzer_explain(strlen(ptr)); // expected-warning-re{{{{^metadata of type 'unsigned long' tied to pointee of argument 'ptr'$}}}} 454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar clang_analyzer_explain(conjure()); // expected-warning-re{{{{^symbol of type 'int' conjured at statement 'conjure\(\)'$}}}} 464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar clang_analyzer_explain(glob); // expected-warning-re{{{{^value derived from \(symbol of type 'int' conjured at statement 'conjure\(\)'\) for global variable 'glob'$}}}} 474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar clang_analyzer_explain(glob_ptr); // expected-warning-re{{{{^value derived from \(symbol of type 'int' conjured at statement 'conjure\(\)'\) for global variable 'glob_ptr'$}}}} 484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar clang_analyzer_explain(clang_analyzer_getExtent(ptr)); // expected-warning-re{{{{^extent of pointee of argument 'ptr'$}}}} 494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar int *x = new int[ext]; 504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar clang_analyzer_explain(x); // expected-warning-re{{{{^pointer to element of type 'int' with index 0 of pointee of symbol of type 'int \*' conjured at statement 'new int \[ext\]'$}}}} 514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Sic! What gets computed is the extent of the element-region. 524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar clang_analyzer_explain(clang_analyzer_getExtent(x)); // expected-warning-re{{{{^signed 32-bit integer '4'$}}}} 534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar delete[] x; 544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid test_3(S s) { 574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar clang_analyzer_explain(&s); // expected-warning-re{{{{^pointer to parameter 's'$}}}} 584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar clang_analyzer_explain(s.z); // expected-warning-re{{{{^initial value of field 'z' of parameter 's'$}}}} 594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar clang_analyzer_explain(&s.s2[5].y[3]); // expected-warning-re{{{{^pointer to element of type 'int' with index 3 of field 'y' of base object 'S::S3' inside element of type 'struct S::S2' with index 5 of field 's2' of parameter 's'$}}}} 604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!s.s2[7].x) { 614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar clang_analyzer_explain(s.s2[7].x); // expected-warning-re{{{{^concrete memory address '0'$}}}} 624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // FIXME: we need to be explaining '1' rather than '0' here; not explainer bug. 634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar clang_analyzer_explain(s.s2[7].x + 1); // expected-warning-re{{{{^concrete memory address '0'$}}}} 644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid test_4(int x, int y) { 684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar int z; 694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar static int stat; 704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar clang_analyzer_explain(x + 1); // expected-warning-re{{{{^\(argument 'x'\) \+ 1$}}}} 714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar clang_analyzer_explain(1 + y); // expected-warning-re{{{{^\(argument 'y'\) \+ 1$}}}} 724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar clang_analyzer_explain(x + y); // expected-warning-re{{{{^unknown value$}}}} 734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar clang_analyzer_explain(z); // expected-warning-re{{{{^undefined value$}}}} 744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar clang_analyzer_explain(&z); // expected-warning-re{{{{^pointer to local variable 'z'$}}}} 754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar clang_analyzer_explain(stat); // expected-warning-re{{{{^signed 32-bit integer '0'$}}}} 764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar clang_analyzer_explain(&stat); // expected-warning-re{{{{^pointer to static local variable 'stat'$}}}} 774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar clang_analyzer_explain(stat_glob); // expected-warning-re{{{{^initial value of global variable 'stat_glob'$}}}} 784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar clang_analyzer_explain(&stat_glob); // expected-warning-re{{{{^pointer to global variable 'stat_glob'$}}}} 794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar clang_analyzer_explain((int[]){1, 2, 3}); // expected-warning-re{{{{^pointer to element of type 'int' with index 0 of compound literal \(int \[3\]\)\{1, 2, 3\}$}}}} 804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarnamespace { 834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass C { 844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar int x[10]; 854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarpublic: 874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar void test_5(int i) { 884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar clang_analyzer_explain(this); // expected-warning-re{{{{^pointer to 'this' object$}}}} 894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar clang_analyzer_explain(&x[i]); // expected-warning-re{{{{^pointer to element of type 'int' with index 'argument 'i'' of field 'x' of 'this' object$}}}} 904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar clang_analyzer_explain(__builtin_alloca(i)); // expected-warning-re{{{{^pointer to region allocated by '__builtin_alloca\(i\)'$}}}} 914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}; 934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} // end of anonymous namespace 944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid test_6() { 964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar clang_analyzer_explain(conjure_S()); // expected-warning-re{{{{^lazily frozen compound value of temporary object constructed at statement 'conjure_S\(\)'$}}}} 974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar clang_analyzer_explain(conjure_S().z); // expected-warning-re{{{{^value derived from \(symbol of type 'struct S' conjured at statement 'conjure_S\(\)'\) for field 'z' of temporary object constructed at statement 'conjure_S\(\)'$}}}} 984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 99