1 // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -analyze -disable-free -analyzer-eagerly-assume -analyzer-checker=core -analyzer-checker=deadcode -verify %s
2
3 int size_rdar9373039 = 1;
4 int foo_rdar9373039(const char *);
5
rdar93730392()6 int rdar93730392() {
7 int x;
8 int j = 0;
9
10 for (int i = 0 ; i < size_rdar9373039 ; ++i)
11 x = 1;
12
13 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}}
14
15 for (int i = 0 ; i < size_rdar9373039 ; ++i)
16 j += x; // expected-warning {{garbage}}
17
18 return j;
19 }
20
21
PR8962(int * t)22 int PR8962 (int *t) {
23 // This should look through the __extension__ no-op.
24 if (__extension__ (t)) return 0;
25 return *t; // expected-warning {{null pointer}}
26 }
27
PR8962_b(int * t)28 int PR8962_b (int *t) {
29 // This should still ignore the nested casts
30 // which aren't handled by a single IgnoreParens()
31 if (((int)((int)t))) return 0;
32 return *t; // expected-warning {{null pointer}}
33 }
34
PR8962_c(int * t)35 int PR8962_c (int *t) {
36 // If the last element in a StmtExpr was a ParenExpr, it's still live
37 if (({ (t ? (_Bool)0 : (_Bool)1); })) return 0;
38 return *t; // no-warning
39 }
40
PR8962_d(int * t)41 int PR8962_d (int *t) {
42 // If the last element in a StmtExpr is an __extension__, it's still live
43 if (({ __extension__(t ? (_Bool)0 : (_Bool)1); })) return 0;
44 return *t; // no-warning
45 }
46
PR8962_e(int * t)47 int PR8962_e (int *t) {
48 // Redundant casts can mess things up!
49 // Environment used to skip through NoOp casts, but LiveVariables didn't!
50 if (({ (t ? (int)(int)0L : (int)(int)1L); })) return 0;
51 return *t; // no-warning
52 }
53
PR8962_f(int * t)54 int PR8962_f (int *t) {
55 // The StmtExpr isn't a block-level expression here,
56 // the __extension__ is. But the value should be attached to the StmtExpr
57 // anyway. Make sure the block-level check is /before/ IgnoreParens.
58 if ( __extension__({
59 _Bool r;
60 if (t) r = 0;
61 else r = 1;
62 r;
63 }) ) return 0;
64 return *t; // no-warning
65 }
66
67 // This previously crashed logic in the analyzer engine when evaluating locations.
68 void rdar10308201_aux(unsigned val);
rdar10308201(int valA,void * valB,unsigned valC)69 void rdar10308201 (int valA, void *valB, unsigned valC) {
70 unsigned actual_base, lines;
71 if (valC == 0) {
72 actual_base = (unsigned)valB;
73 for (;;) {
74 if (valA & (1<<0))
75 rdar10308201_aux(actual_base);
76 }
77 }
78 }
79
80 typedef struct Struct103 {
81 unsigned i;
82 } Struct103;
83 typedef unsigned int size_t;
84 void __my_memset_chk(char*, int, size_t);
radar10367606(int t)85 static int radar10367606(int t) {
86 Struct103 overall;
87 ((__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)));
88 return 0;
89 }
90
91 /* Caching out on a sink node. */
92 extern int fooR10376675();
93 extern int* bazR10376675();
94 extern int nR10376675;
barR10376675(int * x)95 void barR10376675(int *x) {
96 int *pm;
97 if (nR10376675 * 2) {
98 int *pk = bazR10376675();
99 pm = pk; //expected-warning {{never read}}
100 }
101 do {
102 *x = fooR10376675();
103 } while (0);
104 }
105
106 // Test accesses to wide character strings doesn't break the analyzer.
107 typedef int wchar_t;
108 struct rdar10385775 {
109 wchar_t *name;
110 };
RDar10385775(struct rdar10385775 * p)111 void 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.
rdar10686586()117 void 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.
isctype(char c,unsigned long f)131 int 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.
138 void rdar_12075238__aux(unsigned long y);
rdar_12075238_(unsigned long count)139 int 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 // Test that we handle an uninitialized value within a logical expression.
PR14635(int * p)155 void PR14635(int *p) {
156 int a = 0, b;
157 *p = a || b; // expected-warning {{Assigned value is garbage or undefined}}
158 }
159
160 // Test handling floating point values with unary '!'.
PR14634(int x)161 int PR14634(int x) {
162 double y = (double)x;
163 return !y;
164 }
165
166