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