19ad92c47SDonát Nagy // RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -analyzer-config c++-inlining=constructors -verify %s 2b032e3ffSisuckatcs 3b032e3ffSisuckatcs #include "Inputs/system-header-simulator-cxx.h" 4b032e3ffSisuckatcs 5b032e3ffSisuckatcs void clang_analyzer_eval(bool); 6b032e3ffSisuckatcs 7b032e3ffSisuckatcs struct s { 8b032e3ffSisuckatcs int x; 9b032e3ffSisuckatcs int y; 10b032e3ffSisuckatcs }; 11b032e3ffSisuckatcs 12b032e3ffSisuckatcs void a1(void) { 13b032e3ffSisuckatcs s arr[3]; 14b032e3ffSisuckatcs int x = arr[0].x; 15b032e3ffSisuckatcs // expected-warning@-1{{Assigned value is garbage or undefined}} 16b032e3ffSisuckatcs } 17b032e3ffSisuckatcs 18b032e3ffSisuckatcs void a2(void) { 19b032e3ffSisuckatcs s arr[3]; 20b032e3ffSisuckatcs int x = arr[1].x; 21b032e3ffSisuckatcs // expected-warning@-1{{Assigned value is garbage or undefined}} 22b032e3ffSisuckatcs } 23b032e3ffSisuckatcs 24b032e3ffSisuckatcs void a3(void) { 25b032e3ffSisuckatcs s arr[3]; 26b032e3ffSisuckatcs int x = arr[2].x; 27b032e3ffSisuckatcs // expected-warning@-1{{Assigned value is garbage or undefined}} 28b032e3ffSisuckatcs } 29b032e3ffSisuckatcs 30b032e3ffSisuckatcs struct s2 { 31b032e3ffSisuckatcs int x; 32b032e3ffSisuckatcs int y = 2; 33b032e3ffSisuckatcs }; 34b032e3ffSisuckatcs 35b032e3ffSisuckatcs void b1(void) { 36b032e3ffSisuckatcs s2 arr[3]; 37b032e3ffSisuckatcs 38b032e3ffSisuckatcs clang_analyzer_eval(arr[0].y == 2); // expected-warning{{TRUE}} 39b032e3ffSisuckatcs int x = arr[0].x; 40b032e3ffSisuckatcs // expected-warning@-1{{Assigned value is garbage or undefined}} 41b032e3ffSisuckatcs } 42b032e3ffSisuckatcs 43b032e3ffSisuckatcs void b2(void) { 44b032e3ffSisuckatcs s2 arr[3]; 45b032e3ffSisuckatcs 46b032e3ffSisuckatcs clang_analyzer_eval(arr[1].y == 2); // expected-warning{{TRUE}} 47b032e3ffSisuckatcs int x = arr[1].x; 48b032e3ffSisuckatcs // expected-warning@-1{{Assigned value is garbage or undefined}} 49b032e3ffSisuckatcs } 50b032e3ffSisuckatcs 51b032e3ffSisuckatcs void b3(void) { 52b032e3ffSisuckatcs s2 arr[3]; 53b032e3ffSisuckatcs 54b032e3ffSisuckatcs clang_analyzer_eval(arr[2].y == 2); // expected-warning{{TRUE}} 55b032e3ffSisuckatcs int x = arr[2].x; 56b032e3ffSisuckatcs // expected-warning@-1{{Assigned value is garbage or undefined}} 57b032e3ffSisuckatcs } 58b032e3ffSisuckatcs 59b032e3ffSisuckatcs void c1(void) { 60b032e3ffSisuckatcs { 61b032e3ffSisuckatcs s2 arr[2]; 62b032e3ffSisuckatcs arr[1].x = 3; 63b032e3ffSisuckatcs 64b032e3ffSisuckatcs clang_analyzer_eval(arr[1].y == 2); // expected-warning{{TRUE}} 65b032e3ffSisuckatcs clang_analyzer_eval(arr[1].x == 3); // expected-warning{{TRUE}} 66b032e3ffSisuckatcs } 67b032e3ffSisuckatcs 68b032e3ffSisuckatcs { 69b032e3ffSisuckatcs s2 arr[2]; 70b032e3ffSisuckatcs 71b032e3ffSisuckatcs clang_analyzer_eval(arr[1].y == 2); // expected-warning{{TRUE}} 72b032e3ffSisuckatcs int x = arr[1].x; 73b032e3ffSisuckatcs // expected-warning@-1{{Assigned value is garbage or undefined}} 74b032e3ffSisuckatcs } 75b032e3ffSisuckatcs } 76b032e3ffSisuckatcs 77b032e3ffSisuckatcs struct s3 { 78b032e3ffSisuckatcs int x = 1; 79b032e3ffSisuckatcs int y = 2; 80b032e3ffSisuckatcs }; 81b032e3ffSisuckatcs 82b032e3ffSisuckatcs struct s4 { 83b032e3ffSisuckatcs s3 arr[2]; 84b032e3ffSisuckatcs s sarr[2]; 85b032e3ffSisuckatcs }; 86b032e3ffSisuckatcs 87b032e3ffSisuckatcs void e1(void) { 88b032e3ffSisuckatcs s4 arr[2]; 89b032e3ffSisuckatcs 90b032e3ffSisuckatcs clang_analyzer_eval(arr[0].arr[0].x == 1); // expected-warning{{TRUE}} 91b032e3ffSisuckatcs clang_analyzer_eval(arr[0].arr[0].y == 2); // expected-warning{{TRUE}} 92b032e3ffSisuckatcs 93b032e3ffSisuckatcs clang_analyzer_eval(arr[0].arr[1].x == 1); // expected-warning{{TRUE}} 94b032e3ffSisuckatcs clang_analyzer_eval(arr[0].arr[1].y == 2); // expected-warning{{TRUE}} 95b032e3ffSisuckatcs 96b032e3ffSisuckatcs clang_analyzer_eval(arr[1].arr[0].x == 1); // expected-warning{{TRUE}} 97b032e3ffSisuckatcs clang_analyzer_eval(arr[1].arr[0].y == 2); // expected-warning{{TRUE}} 98b032e3ffSisuckatcs 99b032e3ffSisuckatcs clang_analyzer_eval(arr[1].arr[1].x == 1); // expected-warning{{TRUE}} 100b032e3ffSisuckatcs clang_analyzer_eval(arr[1].arr[1].y == 2); // expected-warning{{TRUE}} 101b032e3ffSisuckatcs 102b032e3ffSisuckatcs int x = arr[1].sarr[1].x; 103b032e3ffSisuckatcs // expected-warning@-1{{Assigned value is garbage or undefined}} 104b032e3ffSisuckatcs } 105b032e3ffSisuckatcs 106b032e3ffSisuckatcs void f1(void) { 107b032e3ffSisuckatcs s2 arr[2][2]; 108b032e3ffSisuckatcs 109b032e3ffSisuckatcs clang_analyzer_eval(arr[1][1].y == 2); // expected-warning{{TRUE}} 110b032e3ffSisuckatcs int x = arr[1][1].x; 111b032e3ffSisuckatcs // expected-warning@-1{{Assigned value is garbage or undefined}} 112b032e3ffSisuckatcs } 113b032e3ffSisuckatcs 114b032e3ffSisuckatcs struct s5 { 115b032e3ffSisuckatcs static int c; 116b032e3ffSisuckatcs int x; 117b032e3ffSisuckatcs 118b032e3ffSisuckatcs s5() : x(c++) {} 119b032e3ffSisuckatcs }; 120b032e3ffSisuckatcs 121b032e3ffSisuckatcs void g1(void) { 122b032e3ffSisuckatcs s5::c = 0; 123b032e3ffSisuckatcs s5 *arr = new s5[4]; 124b032e3ffSisuckatcs new (arr + 1) s5[3]; 125b032e3ffSisuckatcs 126b032e3ffSisuckatcs clang_analyzer_eval(arr[0].x == 0); // expected-warning{{TRUE}} 127b032e3ffSisuckatcs clang_analyzer_eval(arr[1].x == 4); // expected-warning{{TRUE}} 128b032e3ffSisuckatcs clang_analyzer_eval(arr[2].x == 5); // expected-warning{{TRUE}} 129b032e3ffSisuckatcs clang_analyzer_eval(arr[3].x == 6); // expected-warning{{TRUE}} 130b032e3ffSisuckatcs } 131b032e3ffSisuckatcs 132b032e3ffSisuckatcs void g2(void) { 133b032e3ffSisuckatcs s5::c = 0; 134b032e3ffSisuckatcs s5 arr[4]; 135b032e3ffSisuckatcs 136b032e3ffSisuckatcs clang_analyzer_eval(arr[0].x == 0); // expected-warning{{TRUE}} 137b032e3ffSisuckatcs clang_analyzer_eval(arr[1].x == 1); // expected-warning{{TRUE}} 138b032e3ffSisuckatcs clang_analyzer_eval(arr[2].x == 2); // expected-warning{{TRUE}} 139b032e3ffSisuckatcs clang_analyzer_eval(arr[3].x == 3); // expected-warning{{TRUE}} 140b032e3ffSisuckatcs } 141b032e3ffSisuckatcs 142b032e3ffSisuckatcs void g3(void) { 143b032e3ffSisuckatcs s5::c = 0; 144b032e3ffSisuckatcs s5 arr[2][2]; 145b032e3ffSisuckatcs 146b032e3ffSisuckatcs clang_analyzer_eval(arr[0][0].x == 0); // expected-warning{{TRUE}} 147b032e3ffSisuckatcs clang_analyzer_eval(arr[0][1].x == 1); // expected-warning{{TRUE}} 148b032e3ffSisuckatcs clang_analyzer_eval(arr[1][0].x == 2); // expected-warning{{TRUE}} 149b032e3ffSisuckatcs clang_analyzer_eval(arr[1][1].x == 3); // expected-warning{{TRUE}} 150b032e3ffSisuckatcs } 151b032e3ffSisuckatcs 152b032e3ffSisuckatcs void h1(void) { 153b032e3ffSisuckatcs s5::c = 0; 154b032e3ffSisuckatcs s5 a[2][2], b[2][2]; 155b032e3ffSisuckatcs 156b032e3ffSisuckatcs clang_analyzer_eval(a[0][0].x == 0); // expected-warning{{TRUE}} 157b032e3ffSisuckatcs clang_analyzer_eval(a[0][1].x == 1); // expected-warning{{TRUE}} 158b032e3ffSisuckatcs clang_analyzer_eval(a[1][0].x == 2); // expected-warning{{TRUE}} 159b032e3ffSisuckatcs clang_analyzer_eval(a[1][1].x == 3); // expected-warning{{TRUE}} 160b032e3ffSisuckatcs 161b032e3ffSisuckatcs clang_analyzer_eval(b[0][0].x == 4); // expected-warning{{TRUE}} 162b032e3ffSisuckatcs clang_analyzer_eval(b[0][1].x == 5); // expected-warning{{TRUE}} 163b032e3ffSisuckatcs clang_analyzer_eval(b[1][0].x == 6); // expected-warning{{TRUE}} 164b032e3ffSisuckatcs clang_analyzer_eval(b[1][1].x == 7); // expected-warning{{TRUE}} 165b032e3ffSisuckatcs } 166b032e3ffSisuckatcs 167b032e3ffSisuckatcs void h2(void) { 168b032e3ffSisuckatcs s a[2][2], b[2][2]; 169b032e3ffSisuckatcs 170b032e3ffSisuckatcs int x = a[1][1].x; 171b032e3ffSisuckatcs // expected-warning@-1{{Assigned value is garbage or undefined}} 172b032e3ffSisuckatcs } 173b032e3ffSisuckatcs 174b032e3ffSisuckatcs void h3(void) { 175b032e3ffSisuckatcs s a[2][2], b[2][2]; 176b032e3ffSisuckatcs 177b032e3ffSisuckatcs int x = b[1][1].y; 178b032e3ffSisuckatcs // expected-warning@-1{{Assigned value is garbage or undefined}} 179b032e3ffSisuckatcs } 180b032e3ffSisuckatcs 181b032e3ffSisuckatcs struct Base { 182b032e3ffSisuckatcs int x; 183b032e3ffSisuckatcs int y; 184b032e3ffSisuckatcs 185b032e3ffSisuckatcs Base(int x, int y) : x(x), y(y) {} 186b032e3ffSisuckatcs }; 187b032e3ffSisuckatcs 188b032e3ffSisuckatcs struct Derived : public Base { 189b032e3ffSisuckatcs int i; 190b032e3ffSisuckatcs int j; 191b032e3ffSisuckatcs 192b032e3ffSisuckatcs Derived(int x, int y, int i, int j) : Base(x, y), i(i), j(j) {} 193b032e3ffSisuckatcs }; 194b032e3ffSisuckatcs 195b032e3ffSisuckatcs void delegate(void) { 196b032e3ffSisuckatcs Derived arr[2] = {{1, 2, 3, 4}, {5, 6, 7, 8}}; 197b032e3ffSisuckatcs 198b032e3ffSisuckatcs clang_analyzer_eval(arr[0].x == 1); // expected-warning{{TRUE}} 199b032e3ffSisuckatcs clang_analyzer_eval(arr[0].y == 2); // expected-warning{{TRUE}} 200b032e3ffSisuckatcs clang_analyzer_eval(arr[0].i == 3); // expected-warning{{TRUE}} 201b032e3ffSisuckatcs clang_analyzer_eval(arr[0].j == 4); // expected-warning{{TRUE}} 202b032e3ffSisuckatcs 203b032e3ffSisuckatcs clang_analyzer_eval(arr[1].x == 5); // expected-warning{{TRUE}} 204b032e3ffSisuckatcs clang_analyzer_eval(arr[1].y == 6); // expected-warning{{TRUE}} 205b032e3ffSisuckatcs clang_analyzer_eval(arr[1].i == 7); // expected-warning{{TRUE}} 206b032e3ffSisuckatcs clang_analyzer_eval(arr[1].j == 8); // expected-warning{{TRUE}} 207b032e3ffSisuckatcs } 208b032e3ffSisuckatcs 209b032e3ffSisuckatcs void delegate_heap(void) { 210b032e3ffSisuckatcs Derived *arr = new Derived[2]{{1, 2, 3, 4}, {5, 6, 7, 8}}; 211b032e3ffSisuckatcs 212b032e3ffSisuckatcs clang_analyzer_eval(arr[0].x == 1); // expected-warning{{TRUE}} 213b032e3ffSisuckatcs clang_analyzer_eval(arr[0].y == 2); // expected-warning{{TRUE}} 214b032e3ffSisuckatcs clang_analyzer_eval(arr[0].i == 3); // expected-warning{{TRUE}} 215b032e3ffSisuckatcs clang_analyzer_eval(arr[0].j == 4); // expected-warning{{TRUE}} 216b032e3ffSisuckatcs 217b032e3ffSisuckatcs clang_analyzer_eval(arr[1].x == 5); // expected-warning{{TRUE}} 218b032e3ffSisuckatcs clang_analyzer_eval(arr[1].y == 6); // expected-warning{{TRUE}} 219b032e3ffSisuckatcs clang_analyzer_eval(arr[1].i == 7); // expected-warning{{TRUE}} 220b032e3ffSisuckatcs clang_analyzer_eval(arr[1].j == 8); // expected-warning{{TRUE}} 221b032e3ffSisuckatcs } 222b032e3ffSisuckatcs 223b032e3ffSisuckatcs struct Member { 224b032e3ffSisuckatcs int x; 225b032e3ffSisuckatcs int y; 226b032e3ffSisuckatcs }; 227b032e3ffSisuckatcs 228b032e3ffSisuckatcs struct Parent { 229b032e3ffSisuckatcs Member arr[2]; 230b032e3ffSisuckatcs 231b032e3ffSisuckatcs Parent() : arr{{1, 2}, {3, 4}} {} 232b032e3ffSisuckatcs }; 233b032e3ffSisuckatcs 234b032e3ffSisuckatcs void member() { 235b032e3ffSisuckatcs Parent arr[2]; 236b032e3ffSisuckatcs 237*e4bb68b8SArseniy Zaostrovnykh clang_analyzer_eval(arr[0].arr[0].x == 1); // expected-warning{{TRUE}} 238*e4bb68b8SArseniy Zaostrovnykh clang_analyzer_eval(arr[0].arr[0].y == 2); // expected-warning{{TRUE}} 239*e4bb68b8SArseniy Zaostrovnykh clang_analyzer_eval(arr[0].arr[1].x == 3); // expected-warning{{TRUE}} 240*e4bb68b8SArseniy Zaostrovnykh clang_analyzer_eval(arr[0].arr[1].y == 4); // expected-warning{{TRUE}} 241b032e3ffSisuckatcs 242*e4bb68b8SArseniy Zaostrovnykh clang_analyzer_eval(arr[1].arr[0].x == 1); // expected-warning{{TRUE}} 243*e4bb68b8SArseniy Zaostrovnykh clang_analyzer_eval(arr[1].arr[0].y == 2); // expected-warning{{TRUE}} 244*e4bb68b8SArseniy Zaostrovnykh clang_analyzer_eval(arr[1].arr[1].x == 3); // expected-warning{{TRUE}} 245*e4bb68b8SArseniy Zaostrovnykh clang_analyzer_eval(arr[1].arr[1].y == 4); // expected-warning{{TRUE}} 246*e4bb68b8SArseniy Zaostrovnykh } 247*e4bb68b8SArseniy Zaostrovnykh 248*e4bb68b8SArseniy Zaostrovnykh struct HasArr { 249*e4bb68b8SArseniy Zaostrovnykh int arrDefault[2] = {1, 2}; 250*e4bb68b8SArseniy Zaostrovnykh int arr[2]; 251*e4bb68b8SArseniy Zaostrovnykh HasArr(int x, int y) : arr{x, y} {} 252*e4bb68b8SArseniy Zaostrovnykh }; 253*e4bb68b8SArseniy Zaostrovnykh 254*e4bb68b8SArseniy Zaostrovnykh struct ArrCombination : public HasArr { 255*e4bb68b8SArseniy Zaostrovnykh HasArr membDefault = {5, 6}; 256*e4bb68b8SArseniy Zaostrovnykh HasArr memb; 257*e4bb68b8SArseniy Zaostrovnykh ArrCombination(int x) : HasArr(3, 4), memb{7, x} {} 258*e4bb68b8SArseniy Zaostrovnykh }; 259*e4bb68b8SArseniy Zaostrovnykh 260*e4bb68b8SArseniy Zaostrovnykh void derived_and_member() { 261*e4bb68b8SArseniy Zaostrovnykh ArrCombination a{8}; 262*e4bb68b8SArseniy Zaostrovnykh // FIXME: Default initializers for array members are not modeled. 263*e4bb68b8SArseniy Zaostrovnykh clang_analyzer_eval(a.arrDefault[0] == 1); // expected-warning{{UNKNOWN}} 264*e4bb68b8SArseniy Zaostrovnykh clang_analyzer_eval(a.arrDefault[1] == 2); // expected-warning{{UNKNOWN}} 265*e4bb68b8SArseniy Zaostrovnykh clang_analyzer_eval(a.arr[0] == 3); // expected-warning{{TRUE}} 266*e4bb68b8SArseniy Zaostrovnykh clang_analyzer_eval(a.arr[1] == 4); // expected-warning{{TRUE}} 267*e4bb68b8SArseniy Zaostrovnykh clang_analyzer_eval(a.membDefault.arrDefault[0] == 1); // expected-warning{{UNKNOWN}} 268*e4bb68b8SArseniy Zaostrovnykh clang_analyzer_eval(a.membDefault.arrDefault[1] == 2); // expected-warning{{UNKNOWN}} 269*e4bb68b8SArseniy Zaostrovnykh clang_analyzer_eval(a.membDefault.arr[0] == 5); // expected-warning{{UNKNOWN}} 270*e4bb68b8SArseniy Zaostrovnykh clang_analyzer_eval(a.membDefault.arr[1] == 6); // expected-warning{{UNKNOWN}} 271*e4bb68b8SArseniy Zaostrovnykh clang_analyzer_eval(a.memb.arrDefault[0] == 1); // expected-warning{{UNKNOWN}} 272*e4bb68b8SArseniy Zaostrovnykh clang_analyzer_eval(a.memb.arrDefault[1] == 2); // expected-warning{{UNKNOWN}} 273*e4bb68b8SArseniy Zaostrovnykh clang_analyzer_eval(a.memb.arr[0] == 7); // expected-warning{{TRUE}} 274*e4bb68b8SArseniy Zaostrovnykh clang_analyzer_eval(a.memb.arr[1] == 8); // expected-warning{{TRUE}} 275*e4bb68b8SArseniy Zaostrovnykh 276*e4bb68b8SArseniy Zaostrovnykh } 277*e4bb68b8SArseniy Zaostrovnykh 278*e4bb68b8SArseniy Zaostrovnykh struct IncompleteArrInit { 279*e4bb68b8SArseniy Zaostrovnykh int arr[2]; 280*e4bb68b8SArseniy Zaostrovnykh int arrDefault[3] = {1, 2, 3}; 281*e4bb68b8SArseniy Zaostrovnykh IncompleteArrInit() : arr{1}, arrDefault{2, 3} {} 282*e4bb68b8SArseniy Zaostrovnykh }; 283*e4bb68b8SArseniy Zaostrovnykh 284*e4bb68b8SArseniy Zaostrovnykh void incomplete_array_init() { 285*e4bb68b8SArseniy Zaostrovnykh IncompleteArrInit a; 286*e4bb68b8SArseniy Zaostrovnykh clang_analyzer_eval(a.arr[0] == 1); // expected-warning{{TRUE}} 287*e4bb68b8SArseniy Zaostrovnykh clang_analyzer_eval(a.arr[1] == 0); // expected-warning{{TRUE}} 288*e4bb68b8SArseniy Zaostrovnykh clang_analyzer_eval(a.arrDefault[0] == 2); // expected-warning{{TRUE}} 289*e4bb68b8SArseniy Zaostrovnykh clang_analyzer_eval(a.arrDefault[1] == 3); // expected-warning{{TRUE}} 290*e4bb68b8SArseniy Zaostrovnykh clang_analyzer_eval(a.arrDefault[2] == 0); // expected-warning{{TRUE}} 291b032e3ffSisuckatcs } 292