brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.3 KiB · b7bfed9 Raw
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 &copy) {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