1 // RUN: %clang_cc1 -std=c++14 -triple i386-apple-darwin10 -analyze -analyzer-config eagerly-assume=false -analyzer-checker=core.uninitialized.Assign,core.builtin,debug.ExprInspection,core.uninitialized.UndefReturn -verify %s
2 
3 template <typename T>
4 void clang_analyzer_dump(T x);
5 void clang_analyzer_eval(int);
6 
7 struct S {
8   int a = 3;
9 };
10 S const sarr[2] = {};
11 void definit() {
12   int i = 1;
13   // FIXME: Should recognize that it is 3.
14   clang_analyzer_eval(sarr[i].a); // expected-warning{{UNKNOWN}}
15 }
16 
17 int const glob_arr1[3] = {};
18 void glob_array_index1() {
19   clang_analyzer_eval(glob_arr1[0] == 0); // expected-warning{{TRUE}}
20   clang_analyzer_eval(glob_arr1[1] == 0); // expected-warning{{TRUE}}
21   clang_analyzer_eval(glob_arr1[2] == 0); // expected-warning{{TRUE}}
22 }
23 
24 void glob_invalid_index1() {
25   const int *ptr = glob_arr1;
26   int idx = -42;
27   auto x = ptr[idx]; // expected-warning{{garbage or undefined}}
28 }
29 
30 void glob_symbolic_index1(int idx) {
31   clang_analyzer_dump(glob_arr1[idx]); // expected-warning{{Unknown}}
32 }
33 
34 int const glob_arr2[4] = {1, 2};
35 void glob_ptr_index1() {
36   int const *ptr = glob_arr2;
37   clang_analyzer_eval(ptr[0] == 1); // expected-warning{{TRUE}}
38   clang_analyzer_eval(ptr[1] == 2); // expected-warning{{TRUE}}
39   clang_analyzer_eval(ptr[2] == 0); // expected-warning{{TRUE}}
40   clang_analyzer_eval(ptr[3] == 0); // expected-warning{{TRUE}}
41   clang_analyzer_eval(ptr[4] == 0); // expected-warning{{UNDEFINED}}
42 }
43 
44 void glob_invalid_index2() {
45   const int *ptr = glob_arr2;
46   int idx = 42;
47   auto x = ptr[idx]; // expected-warning{{garbage or undefined}}
48 }
49 
50 const float glob_arr3[] = {
51     0.0000, 0.0235, 0.0470, 0.0706, 0.0941, 0.1176};
52 float no_warn_garbage_value() {
53   return glob_arr3[0]; // no-warning (garbage or undefined)
54 }
55 
56 int const glob_arr4[4][2] = {};
57 void glob_array_index2() {
58   clang_analyzer_eval(glob_arr4[0][0] == 0); // expected-warning{{TRUE}}
59   clang_analyzer_eval(glob_arr4[1][0] == 0); // expected-warning{{TRUE}}
60   clang_analyzer_eval(glob_arr4[1][1] == 0); // expected-warning{{TRUE}}
61 }
62 
63 void glob_invalid_index3() {
64   int idx = -42;
65   auto x = glob_arr4[1][idx]; // expected-warning{{garbage or undefined}}
66 }
67 
68 void glob_invalid_index4() {
69   const int *ptr = glob_arr4[1];
70   int idx = -42;
71   // FIXME: Should warn {{garbage or undefined}}.
72   auto x = ptr[idx]; // no-warning
73 }
74 
75 int const glob_arr5[4][2] = {{1}, 3, 4, 5};
76 void glob_array_index3() {
77   clang_analyzer_eval(glob_arr5[0][0] == 1); // expected-warning{{TRUE}}
78   clang_analyzer_eval(glob_arr5[0][1] == 0); // expected-warning{{TRUE}}
79   clang_analyzer_eval(glob_arr5[1][0] == 3); // expected-warning{{TRUE}}
80   clang_analyzer_eval(glob_arr5[1][1] == 4); // expected-warning{{TRUE}}
81   clang_analyzer_eval(glob_arr5[2][0] == 5); // expected-warning{{TRUE}}
82   clang_analyzer_eval(glob_arr5[2][1] == 0); // expected-warning{{TRUE}}
83   clang_analyzer_eval(glob_arr5[3][0] == 0); // expected-warning{{TRUE}}
84   clang_analyzer_eval(glob_arr5[3][1] == 0); // expected-warning{{TRUE}}
85 }
86 
87 void glob_ptr_index2() {
88   int const *ptr = glob_arr5[1];
89   // FIXME: Should be TRUE.
90   clang_analyzer_eval(ptr[0] == 3); // expected-warning{{UNKNOWN}}
91   // FIXME: Should be TRUE.
92   clang_analyzer_eval(ptr[1] == 4); // expected-warning{{UNKNOWN}}
93   // FIXME: Should be UNDEFINED.
94   clang_analyzer_eval(ptr[2] == 5); // expected-warning{{UNKNOWN}}
95   // FIXME: Should be UNDEFINED.
96   clang_analyzer_eval(ptr[3] == 0); // expected-warning{{UNKNOWN}}
97   // FIXME: Should be UNDEFINED.
98   clang_analyzer_eval(ptr[4] == 0); // expected-warning{{UNKNOWN}}
99 }
100 
101 void glob_invalid_index5() {
102   int idx = -42;
103   auto x = glob_arr5[1][idx]; // expected-warning{{garbage or undefined}}
104 }
105 
106 void glob_invalid_index6() {
107   int const *ptr = &glob_arr5[1][0];
108   int idx = 42;
109   // FIXME: Should warn {{garbage or undefined}}.
110   auto x = ptr[idx]; // no-warning
111 }
112 
113 extern const int glob_arr_no_init[10];
114 void glob_array_index4() {
115   clang_analyzer_eval(glob_arr_no_init[2]); // expected-warning{{UNKNOWN}}
116 }
117 
118 struct S2 {
119   static const int arr_no_init[10];
120 };
121 void struct_arr_index1() {
122   clang_analyzer_eval(S2::arr_no_init[2]); // expected-warning{{UNKNOWN}}
123 }
124 
125 char const glob_arr6[5] = "123";
126 void glob_array_index5() {
127   clang_analyzer_eval(glob_arr6[0] == '1');  // expected-warning{{TRUE}}
128   clang_analyzer_eval(glob_arr6[1] == '2');  // expected-warning{{TRUE}}
129   clang_analyzer_eval(glob_arr6[2] == '3');  // expected-warning{{TRUE}}
130   clang_analyzer_eval(glob_arr6[3] == '\0'); // expected-warning{{TRUE}}
131   clang_analyzer_eval(glob_arr6[4] == '\0'); // expected-warning{{TRUE}}
132 }
133 
134 void glob_ptr_index3() {
135   char const *ptr = glob_arr6;
136   clang_analyzer_eval(ptr[-42] == '\0'); // expected-warning{{UNDEFINED}}
137   clang_analyzer_eval(ptr[0] == '1');    // expected-warning{{TRUE}}
138   clang_analyzer_eval(ptr[1] == '2');    // expected-warning{{TRUE}}
139   clang_analyzer_eval(ptr[2] == '3');    // expected-warning{{TRUE}}
140   clang_analyzer_eval(ptr[3] == '\0');   // expected-warning{{TRUE}}
141   clang_analyzer_eval(ptr[4] == '\0');   // expected-warning{{TRUE}}
142   clang_analyzer_eval(ptr[5] == '\0');   // expected-warning{{UNDEFINED}}
143   clang_analyzer_eval(ptr[6] == '\0');   // expected-warning{{UNDEFINED}}
144 }
145 
146 void glob_invalid_index7() {
147   int idx = -42;
148   auto x = glob_arr6[idx]; // expected-warning{{garbage or undefined}}
149 }
150 
151 void glob_invalid_index8() {
152   const char *ptr = glob_arr6;
153   int idx = 42;
154   auto x = ptr[idx]; // expected-warning{{garbage or undefined}}
155 }
156 
157 char const glob_arr7[5] = {"123"};
158 void glob_array_index6() {
159   clang_analyzer_eval(glob_arr7[0] == '1');  // expected-warning{{TRUE}}
160   clang_analyzer_eval(glob_arr7[1] == '2');  // expected-warning{{TRUE}}
161   clang_analyzer_eval(glob_arr7[2] == '3');  // expected-warning{{TRUE}}
162   clang_analyzer_eval(glob_arr7[3] == '\0'); // expected-warning{{TRUE}}
163   clang_analyzer_eval(glob_arr7[4] == '\0'); // expected-warning{{TRUE}}
164 }
165 
166 void glob_invalid_index9() {
167   int idx = -42;
168   auto x = glob_arr7[idx]; // expected-warning{{garbage or undefined}}
169 }
170 
171 void glob_invalid_index10() {
172   const char *ptr = glob_arr7;
173   int idx = 42;
174   auto x = ptr[idx]; // expected-warning{{garbage or undefined}}
175 }
176 
177 char const *const glob_ptr8 = "123";
178 void glob_ptr_index4() {
179   clang_analyzer_eval(glob_ptr8[0] == '1');  // expected-warning{{TRUE}}
180   clang_analyzer_eval(glob_ptr8[1] == '2');  // expected-warning{{TRUE}}
181   clang_analyzer_eval(glob_ptr8[2] == '3');  // expected-warning{{TRUE}}
182   clang_analyzer_eval(glob_ptr8[3] == '\0'); // expected-warning{{TRUE}}
183   // FIXME: Should be UNDEFINED.
184   // We should take into account a declaration in which the literal is used.
185   clang_analyzer_eval(glob_ptr8[4] == '\0'); // expected-warning{{TRUE}}
186 }
187 
188 void glob_invalid_index11() {
189   int idx = -42;
190   auto x = glob_ptr8[idx]; // expected-warning{{garbage or undefined}}
191 }
192 
193 void glob_invalid_index12() {
194   int idx = 42;
195   // FIXME: Should warn {{garbage or undefined}}
196   // We should take into account a declaration in which the literal is used.
197   auto x = glob_ptr8[idx]; // no-warning
198 }
199 
200 const char16_t *const glob_ptr9 = u"абв";
201 void glob_ptr_index5() {
202   clang_analyzer_eval(glob_ptr9[0] == u'а'); // expected-warning{{TRUE}}
203   clang_analyzer_eval(glob_ptr9[1] == u'б'); // expected-warning{{TRUE}}
204   clang_analyzer_eval(glob_ptr9[2] == u'в'); // expected-warning{{TRUE}}
205   clang_analyzer_eval(glob_ptr9[3] == '\0'); // expected-warning{{TRUE}}
206 }
207 
208 const char32_t *const glob_ptr10 = U"\U0001F607\U0001F608\U0001F609";
209 void glob_ptr_index6() {
210   clang_analyzer_eval(glob_ptr10[0] == U'\U0001F607'); // expected-warning{{TRUE}}
211   clang_analyzer_eval(glob_ptr10[1] == U'\U0001F608'); // expected-warning{{TRUE}}
212   clang_analyzer_eval(glob_ptr10[2] == U'\U0001F609'); // expected-warning{{TRUE}}
213   clang_analyzer_eval(glob_ptr10[3] == '\0');          // expected-warning{{TRUE}}
214 }
215 
216 const wchar_t *const glob_ptr11 = L"\123\u0041\xFF";
217 void glob_ptr_index7() {
218   clang_analyzer_eval(glob_ptr11[0] == L'\123');   // expected-warning{{TRUE}}
219   clang_analyzer_eval(glob_ptr11[1] == L'\u0041'); // expected-warning{{TRUE}}
220   clang_analyzer_eval(glob_ptr11[2] == L'\xFF');   // expected-warning{{TRUE}}
221   clang_analyzer_eval(glob_ptr11[3] == L'\0');     // expected-warning{{TRUE}}
222 }
223 
224 const char *const glob_ptr12 = u8"abc";
225 void glob_ptr_index8() {
226   clang_analyzer_eval(glob_ptr12[0] == 'a');  // expected-warning{{TRUE}}
227   clang_analyzer_eval(glob_ptr12[1] == 'b');  // expected-warning{{TRUE}}
228   clang_analyzer_eval(glob_ptr12[2] == 'c');  // expected-warning{{TRUE}}
229   clang_analyzer_eval(glob_ptr12[3] == '\0'); // expected-warning{{TRUE}}
230 }
231 
232 typedef int Int;
233 typedef Int const CInt;
234 typedef CInt Arr[2];
235 typedef Arr Arr2[4];
236 Arr2 glob_arr8 = {{1}, 3, 4, 5}; // const int[4][2]
237 void glob_array_typedef1() {
238   clang_analyzer_eval(glob_arr8[0][0] == 1); // expected-warning{{TRUE}}
239   clang_analyzer_eval(glob_arr8[0][1] == 0); // expected-warning{{TRUE}}
240   clang_analyzer_eval(glob_arr8[1][0] == 3); // expected-warning{{TRUE}}
241   clang_analyzer_eval(glob_arr8[1][1] == 4); // expected-warning{{TRUE}}
242   clang_analyzer_eval(glob_arr8[2][0] == 5); // expected-warning{{TRUE}}
243   clang_analyzer_eval(glob_arr8[2][1] == 0); // expected-warning{{TRUE}}
244   clang_analyzer_eval(glob_arr8[3][0] == 0); // expected-warning{{TRUE}}
245   clang_analyzer_eval(glob_arr8[3][1] == 0); // expected-warning{{TRUE}}
246 }
247 
248 const int glob_arr9[2][4] = {{(1), 2, ((3)), 4}, 5, 6, (((7)))};
249 void glob_array_parentheses1() {
250   clang_analyzer_eval(glob_arr9[0][0] == 1); // expected-warning{{TRUE}}
251   clang_analyzer_eval(glob_arr9[0][1] == 2); // expected-warning{{TRUE}}
252   clang_analyzer_eval(glob_arr9[0][2] == 3); // expected-warning{{TRUE}}
253   clang_analyzer_eval(glob_arr9[0][3] == 4); // expected-warning{{TRUE}}
254   clang_analyzer_eval(glob_arr9[1][0] == 5); // expected-warning{{TRUE}}
255   clang_analyzer_eval(glob_arr9[1][1] == 6); // expected-warning{{TRUE}}
256   clang_analyzer_eval(glob_arr9[1][2] == 7); // expected-warning{{TRUE}}
257   clang_analyzer_eval(glob_arr9[1][3] == 0); // expected-warning{{TRUE}}
258 }
259