389 lines · cpp
1// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -std=c++17 -verify %s2 3void clang_analyzer_eval(bool);4 5void array_value_a(void) {6 int arr[2];7 auto [a, b] = arr;8 arr[0] = 0;9 10 int x = a; // expected-warning{{Assigned value is uninitialized}}11}12 13void array_value_b(void) {14 int arr[] = {1, 2};15 auto [a, b] = arr;16 17 clang_analyzer_eval(a == 1); // expected-warning{{TRUE}}18 clang_analyzer_eval(b == 2); // expected-warning{{TRUE}}19 20 int x = a; // no-warning21}22 23void array_value_c(void) {24 int arr[3];25 26 arr[1] = 1;27 28 auto [a, b, c] = arr;29 30 clang_analyzer_eval(b == arr[1]); // expected-warning{{TRUE}}31 32 int y = b; // no-warning33 int x = a; // expected-warning{{Assigned value is uninitialized}}34}35 36void array_value_d(void) {37 int arr[3];38 39 arr[1] = 1;40 41 auto [a, b, c] = arr;42 43 clang_analyzer_eval(b == arr[1]); // expected-warning{{TRUE}}44 45 int y = b; // no-warning46 int x = c; // expected-warning{{Assigned value is uninitialized}}47}48 49void array_value_e(void) {50 int uninit[2];51 int init[2] = {0};52 53 uninit[0] = init[0];54 55 auto [i, j] = init;56 57 clang_analyzer_eval(i == 0); // expected-warning{{TRUE}}58 clang_analyzer_eval(j == 0); // expected-warning{{TRUE}}59 60 int a = i; // no-warning61 int b = j; // no-warning62}63 64void array_value_f(void) {65 int uninit[2];66 int init[2] = {0};67 68 uninit[0] = init[0];69 70 auto [i, j] = uninit;71 72 clang_analyzer_eval(i == 0); // expected-warning{{TRUE}}73 74 int a = i; // no-warning75 int b = j; // expected-warning{{Assigned value is uninitialized}}76}77 78void array_lref_a(void) {79 int arr[2];80 auto &[a, b] = arr;81 int x = a; // expected-warning{{Assigned value is uninitialized}}82}83 84void array_lref_b(void) {85 int arr[] = {1, 2};86 auto &[a, b] = arr;87 88 clang_analyzer_eval(a == 1); // expected-warning{{TRUE}}89 clang_analyzer_eval(b == 2); // expected-warning{{TRUE}}90 91 int x = a; // no-warning92}93 94void array_lref_c(void) {95 int arr[2];96 auto &[a, b] = arr;97 98 arr[0] = 1;99 100 clang_analyzer_eval(a == 1); // expected-warning{{TRUE}}101 102 int x = a; // no-warning103 int y = b; // expected-warning{{Assigned value is uninitialized}}104}105 106void array_lref_d(void) {107 int arr[3];108 109 arr[1] = 1;110 111 auto &[a, b, c] = arr;112 113 clang_analyzer_eval(b == 1); // expected-warning{{TRUE}}114 115 int y = b; // no-warning116 int x = a; // expected-warning{{Assigned value is uninitialized}}117}118 119void array_lref_e(void) {120 int arr[3];121 122 arr[1] = 1;123 124 auto &[a, b, c] = arr;125 126 clang_analyzer_eval(b == 1); // expected-warning{{TRUE}}127 128 int y = b; // no-warning129 int x = c; // expected-warning{{Assigned value is uninitialized}}130}131 132void array_lref_f(void) {133 int uninit[2];134 int init[2] = {0};135 136 uninit[0] = init[0];137 138 auto &[i, j] = init;139 140 clang_analyzer_eval(i == 0); // expected-warning{{TRUE}}141 clang_analyzer_eval(j == 0); // expected-warning{{TRUE}}142 143 int a = i; // no-warning144 int b = j; // no-warning145}146 147void array_lref_g(void) {148 int uninit[2];149 int init[2] = {0};150 151 uninit[0] = init[0];152 153 auto &[i, j] = uninit;154 155 clang_analyzer_eval(i == 0); // expected-warning{{TRUE}}156 157 int a = i; // no-warning158 int b = j; // expected-warning{{Assigned value is uninitialized}}159}160 161void array_rref_a(void) {162 int arr[2];163 auto &&[a, b] = arr;164 int x = a; // expected-warning{{Assigned value is uninitialized}}165}166 167void array_rref_b(void) {168 int arr[] = {1, 2};169 auto &&[a, b] = arr;170 171 clang_analyzer_eval(a == 1); // expected-warning{{TRUE}}172 clang_analyzer_eval(b == 2); // expected-warning{{TRUE}}173 174 int x = a; // no-warning175}176 177void array_rref_c(void) {178 int arr[2];179 auto &&[a, b] = arr;180 181 arr[0] = 1;182 183 clang_analyzer_eval(a == 1); // expected-warning{{TRUE}}184 185 int x = a; // no-warning186 int y = b; // expected-warning{{Assigned value is uninitialized}}187}188 189void array_rref_d(void) {190 int arr[3];191 192 arr[1] = 1;193 194 auto &&[a, b, c] = arr;195 196 clang_analyzer_eval(b == 1); // expected-warning{{TRUE}}197 198 int y = b; // no-warning199 int x = a; // expected-warning{{Assigned value is uninitialized}}200}201 202void array_rref_e(void) {203 int arr[3];204 205 arr[1] = 1;206 207 auto &&[a, b, c] = arr;208 209 clang_analyzer_eval(b == 1); // expected-warning{{TRUE}}210 211 int y = b; // no-warning212 int x = c; // expected-warning{{Assigned value is uninitialized}}213}214 215void array_rref_f(void) {216 int uninit[2];217 int init[2] = {0};218 219 uninit[0] = init[0];220 221 auto &&[i, j] = init;222 223 clang_analyzer_eval(i == 0); // expected-warning{{TRUE}}224 clang_analyzer_eval(j == 0); // expected-warning{{TRUE}}225 226 int a = i; // no-warning227 int b = j; // no-warning228}229 230void array_rref_g(void) {231 int uninit[2];232 int init[2] = {0};233 234 uninit[0] = init[0];235 236 auto &&[i, j] = uninit;237 238 clang_analyzer_eval(i == 0); // expected-warning{{TRUE}}239 240 int a = i; // no-warning241 int b = j; // expected-warning{{Assigned value is uninitialized}}242}243 244void array_change_a(void) {245 int arr[] = {1, 2};246 247 auto [a, b] = arr;248 249 clang_analyzer_eval(a == 1); // expected-warning{{TRUE}}250 a = 3;251 clang_analyzer_eval(a == 3); // expected-warning{{TRUE}}252 253 clang_analyzer_eval(arr[0] == 1); // expected-warning{{TRUE}}254 clang_analyzer_eval(arr[1] == 2); // expected-warning{{TRUE}}255 256 clang_analyzer_eval(b == 2); // expected-warning{{TRUE}}257}258 259void array_change_b(void) {260 int arr[] = {1, 2};261 262 auto &[a, b] = arr;263 264 clang_analyzer_eval(a == 1); // expected-warning{{TRUE}}265 clang_analyzer_eval(b == 2); // expected-warning{{TRUE}}266 267 a = 3;268 clang_analyzer_eval(a == 3); // expected-warning{{TRUE}}269 270 clang_analyzer_eval(arr[0] == 3); // expected-warning{{TRUE}}271 clang_analyzer_eval(arr[1] == 2); // expected-warning{{TRUE}}272}273 274void array_small_a(void) {275 int arr[5];276 277 auto [a, b, c, d, e] = arr;278 279 int x = e; // expected-warning{{Assigned value is uninitialized}}280}281 282void array_big_a(void) {283 int arr[6];284 285 auto [a, b, c, d, e, f] = arr;286 287 // FIXME: These will be Undefined when we handle reading Undefined values from lazyCompoundVal.288 clang_analyzer_eval(a == 1); // expected-warning{{UNKNOWN}}289 clang_analyzer_eval(b == 2); // expected-warning{{UNKNOWN}}290 clang_analyzer_eval(c == 3); // expected-warning{{UNKNOWN}}291 clang_analyzer_eval(d == 4); // expected-warning{{UNKNOWN}}292 clang_analyzer_eval(e == 5); // expected-warning{{UNKNOWN}}293 clang_analyzer_eval(f == 6); // expected-warning{{UNKNOWN}}294}295 296struct S {297 int a = 1;298 int b = 2;299};300 301void non_pod_val(void) {302 S arr[2];303 304 auto [x, y] = arr;305 306 clang_analyzer_eval(x.a == 1); // expected-warning{{TRUE}}307 clang_analyzer_eval(x.b == 2); // expected-warning{{TRUE}}308 309 clang_analyzer_eval(y.a == 1); // expected-warning{{TRUE}}310 clang_analyzer_eval(y.b == 2); // expected-warning{{TRUE}}311}312 313void non_pod_val_syntax_2(void) {314 S arr[2];315 316 auto [x, y](arr);317 318 clang_analyzer_eval(x.a == 1); // expected-warning{{TRUE}}319 clang_analyzer_eval(x.b == 2); // expected-warning{{TRUE}}320 321 clang_analyzer_eval(y.a == 1); // expected-warning{{TRUE}}322 clang_analyzer_eval(y.b == 2); // expected-warning{{TRUE}}323}324 325void non_pod_lref(void) {326 S arr[2];327 328 auto &[x, y] = arr;329 330 clang_analyzer_eval(x.a == 1); // expected-warning{{TRUE}}331 clang_analyzer_eval(x.b == 2); // expected-warning{{TRUE}}332 333 clang_analyzer_eval(y.a == 1); // expected-warning{{TRUE}}334 clang_analyzer_eval(y.b == 2); // expected-warning{{TRUE}}335}336 337void non_pod_rref(void) {338 S arr[2];339 340 auto &&[x, y] = arr;341 342 clang_analyzer_eval(x.a == 1); // expected-warning{{TRUE}}343 clang_analyzer_eval(x.b == 2); // expected-warning{{TRUE}}344 345 clang_analyzer_eval(y.a == 1); // expected-warning{{TRUE}}346 clang_analyzer_eval(y.b == 2); // expected-warning{{TRUE}}347}348 349struct SUD {350 inline static int c = 0;351 352 int a = 1;353 int b = 2;354 355 SUD() { ++c; };356 357 SUD(const SUD ©) {358 a = copy.a + 1;359 b = copy.b + 1;360 }361};362 363void non_pod_user_defined_val(void) {364 SUD arr[2];365 366 auto [x, y] = arr;367 368 clang_analyzer_eval(x.a == 2); // expected-warning{{TRUE}}369 clang_analyzer_eval(x.b == 3); // expected-warning{{TRUE}}370 371 clang_analyzer_eval(y.a == 2); // expected-warning{{TRUE}}372 clang_analyzer_eval(y.b == 3); // expected-warning{{TRUE}}373}374 375void non_pod_user_defined_val_syntax_2(void) {376 SUD::c = 0;377 SUD arr[2];378 379 auto [x, y](arr);380 381 clang_analyzer_eval(SUD::c == 2); // expected-warning{{TRUE}}382 383 clang_analyzer_eval(x.a == 2); // expected-warning{{TRUE}}384 clang_analyzer_eval(x.b == 3); // expected-warning{{TRUE}}385 386 clang_analyzer_eval(y.a == 2); // expected-warning{{TRUE}}387 clang_analyzer_eval(y.b == 3); // expected-warning{{TRUE}}388}389