misc-ps.c revision c957319941e93db2bc399efa7a9d1425bc609ba9
19a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -analyze -disable-free -analyzer-eagerly-assume -analyzer-checker=core -analyzer-checker=deadcode -verify %s 29a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian 39a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanianint size_rdar9373039 = 1; 49a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanianint foo_rdar9373039(const char *); 59a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian 69a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanianint rdar93730392() { 79a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian int x; 89a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian int j = 0; 99a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian 109a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian for (int i = 0 ; i < size_rdar9373039 ; ++i) 119a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian x = 1; 129a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian 139a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian int extra = (2 + foo_rdar9373039 ("Clang") + ((4 - ((unsigned int) (2 + foo_rdar9373039 ("Clang")) % 4)) % 4)) + (2 + foo_rdar9373039 ("1.0") + ((4 - ((unsigned int) (2 + foo_rdar9373039 ("1.0")) % 4)) % 4)); // expected-warning {{never read}} 149a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian 159a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian for (int i = 0 ; i < size_rdar9373039 ; ++i) 169a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian j += x; // expected-warning {{garbage}} 179a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian 189a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian return j; 199a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian} 209a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian 219a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian 229a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanianint PR8962 (int *t) { 239a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian // This should look through the __extension__ no-op. 249a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian if (__extension__ (t)) return 0; 259a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian return *t; // expected-warning {{null pointer}} 269a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian} 279a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian 289a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanianint PR8962_b (int *t) { 299a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian // This should still ignore the nested casts 309a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian // which aren't handled by a single IgnoreParens() 319a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian if (((int)((int)t))) return 0; 329a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian return *t; // expected-warning {{null pointer}} 339a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian} 349a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian 359a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanianint PR8962_c (int *t) { 369a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian // If the last element in a StmtExpr was a ParenExpr, it's still live 379a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian if (({ (t ? (_Bool)0 : (_Bool)1); })) return 0; 389a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian return *t; // no-warning 399a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian} 409a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian 419a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanianint PR8962_d (int *t) { 429a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian // If the last element in a StmtExpr is an __extension__, it's still live 439a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian if (({ __extension__(t ? (_Bool)0 : (_Bool)1); })) return 0; 449a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian return *t; // no-warning 459a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian} 469a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian 479a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanianint PR8962_e (int *t) { 489a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian // Redundant casts can mess things up! 499a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian // Environment used to skip through NoOp casts, but LiveVariables didn't! 509a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian if (({ (t ? (int)(int)0L : (int)(int)1L); })) return 0; 519a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian return *t; // no-warning 529a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian} 539a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian 549a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanianint PR8962_f (int *t) { 559a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian // The StmtExpr isn't a block-level expression here, 569a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian // the __extension__ is. But the value should be attached to the StmtExpr 579a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian // anyway. Make sure the block-level check is /before/ IgnoreParens. 589a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian if ( __extension__({ 599a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian _Bool r; 609a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian if (t) r = 0; 619a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian else r = 1; 629a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian r; 639a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian }) ) return 0; 649a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian return *t; // no-warning 659a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian} 669a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian 679a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian// This previously crashed logic in the analyzer engine when evaluating locations. 689a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanianvoid rdar10308201_aux(unsigned val); 699a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanianvoid rdar10308201 (int valA, void *valB, unsigned valC) { 709a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian unsigned actual_base, lines; 719a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian if (valC == 0) { 729a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian actual_base = (unsigned)valB; 739a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian for (;;) { 749a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian if (valA & (1<<0)) 759a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian rdar10308201_aux(actual_base); 769a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian } 779a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian } 789a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian} 799a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian 809a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfaniantypedef struct Struct103 { 819a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian unsigned i; 829a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian} Struct103; 839a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfaniantypedef unsigned int size_t; 849a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanianvoid __my_memset_chk(char*, int, size_t); 859a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanianstatic int radar10367606(int t) { 869a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian Struct103 overall; 879a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian ((__builtin_object_size ((char *) &overall, 0) != (size_t) -1) ? __builtin___memset_chk ((char *) &overall, 0, sizeof(Struct103), __builtin_object_size ((char *) &overall, 0)) : __my_memset_chk ((char *) &overall, 0, sizeof(Struct103))); 889a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian return 0; 899a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian} 909a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian 919a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian/* Caching out on a sink node. */ 929a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanianextern int fooR10376675(); 939a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanianextern int* bazR10376675(); 949a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanianextern int nR10376675; 959a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanianvoid barR10376675(int *x) { 969a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian int *pm; 979a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian if (nR10376675 * 2) { 989a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian int *pk = bazR10376675(); 999a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian pm = pk; //expected-warning {{never read}} 1009a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian } 1019a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian do { 1029a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian *x = fooR10376675(); 1039a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian } while (0); 1049a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian} 1059a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian 1069a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian// Test accesses to wide character strings doesn't break the analyzer. 1079a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfaniantypedef int wchar_t; 1089a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanianstruct rdar10385775 { 1099a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian wchar_t *name; 1109a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian}; 111void RDar10385775(struct rdar10385775* p) { 112 p->name = L"a"; 113} 114 115// Test double loop of array and array literals. Previously this 116// resulted in a false positive uninitailized value warning. 117void rdar10686586() { 118 int array1[] = { 1, 2, 3, 0 }; 119 int array2[] = { 1, 2, 3, 0 }; 120 int *array[] = { array1, array2 }; 121 int sum = 0; 122 for (int i = 0; i < 2; i++) { 123 for (int j = 0; j < 4; j++) { 124 sum += array[i][j]; // no-warning 125 } 126 } 127} 128 129// This example tests CFG handling of '||' nested in a ternary expression, 130// and seeing that the analyzer doesn't crash. 131int isctype(char c, unsigned long f) 132{ 133 return (c < 1 || c > 10) ? 0 : !!(c & f); 134} 135 136// Test that symbolic array offsets are modeled conservatively. 137// This was triggering a false "use of uninitialized value" warning. 138void rdar_12075238__aux(unsigned long y); 139int rdar_12075238_(unsigned long count) { 140 if ((count < 3) || (count > 6)) 141 return 0; 142 143 unsigned long array[6]; 144 unsigned long i = 0; 145 for (; i <= count - 2; i++) 146 { 147 array[i] = i; 148 } 149 array[count - 1] = i; 150 rdar_12075238__aux(array[2]); // no-warning 151 return 0; 152} 153 154