1*b032e3ffSisuckatcs // RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -analyzer-disable-checker=cplusplus -analyzer-config c++-inlining=constructors -verify %s
2*b032e3ffSisuckatcs
3*b032e3ffSisuckatcs #include "Inputs/system-header-simulator-cxx.h"
4*b032e3ffSisuckatcs
5*b032e3ffSisuckatcs void clang_analyzer_eval(bool);
6*b032e3ffSisuckatcs
7*b032e3ffSisuckatcs struct s {
8*b032e3ffSisuckatcs int x;
9*b032e3ffSisuckatcs int y;
10*b032e3ffSisuckatcs };
11*b032e3ffSisuckatcs
a1(void)12*b032e3ffSisuckatcs void a1(void) {
13*b032e3ffSisuckatcs s arr[3];
14*b032e3ffSisuckatcs int x = arr[0].x;
15*b032e3ffSisuckatcs // expected-warning@-1{{Assigned value is garbage or undefined}}
16*b032e3ffSisuckatcs }
17*b032e3ffSisuckatcs
a2(void)18*b032e3ffSisuckatcs void a2(void) {
19*b032e3ffSisuckatcs s arr[3];
20*b032e3ffSisuckatcs int x = arr[1].x;
21*b032e3ffSisuckatcs // expected-warning@-1{{Assigned value is garbage or undefined}}
22*b032e3ffSisuckatcs }
23*b032e3ffSisuckatcs
a3(void)24*b032e3ffSisuckatcs void a3(void) {
25*b032e3ffSisuckatcs s arr[3];
26*b032e3ffSisuckatcs int x = arr[2].x;
27*b032e3ffSisuckatcs // expected-warning@-1{{Assigned value is garbage or undefined}}
28*b032e3ffSisuckatcs }
29*b032e3ffSisuckatcs
30*b032e3ffSisuckatcs struct s2 {
31*b032e3ffSisuckatcs int x;
32*b032e3ffSisuckatcs int y = 2;
33*b032e3ffSisuckatcs };
34*b032e3ffSisuckatcs
b1(void)35*b032e3ffSisuckatcs void b1(void) {
36*b032e3ffSisuckatcs s2 arr[3];
37*b032e3ffSisuckatcs
38*b032e3ffSisuckatcs clang_analyzer_eval(arr[0].y == 2); // expected-warning{{TRUE}}
39*b032e3ffSisuckatcs int x = arr[0].x;
40*b032e3ffSisuckatcs // expected-warning@-1{{Assigned value is garbage or undefined}}
41*b032e3ffSisuckatcs }
42*b032e3ffSisuckatcs
b2(void)43*b032e3ffSisuckatcs void b2(void) {
44*b032e3ffSisuckatcs s2 arr[3];
45*b032e3ffSisuckatcs
46*b032e3ffSisuckatcs clang_analyzer_eval(arr[1].y == 2); // expected-warning{{TRUE}}
47*b032e3ffSisuckatcs int x = arr[1].x;
48*b032e3ffSisuckatcs // expected-warning@-1{{Assigned value is garbage or undefined}}
49*b032e3ffSisuckatcs }
50*b032e3ffSisuckatcs
b3(void)51*b032e3ffSisuckatcs void b3(void) {
52*b032e3ffSisuckatcs s2 arr[3];
53*b032e3ffSisuckatcs
54*b032e3ffSisuckatcs clang_analyzer_eval(arr[2].y == 2); // expected-warning{{TRUE}}
55*b032e3ffSisuckatcs int x = arr[2].x;
56*b032e3ffSisuckatcs // expected-warning@-1{{Assigned value is garbage or undefined}}
57*b032e3ffSisuckatcs }
58*b032e3ffSisuckatcs
c1(void)59*b032e3ffSisuckatcs void c1(void) {
60*b032e3ffSisuckatcs {
61*b032e3ffSisuckatcs s2 arr[2];
62*b032e3ffSisuckatcs arr[1].x = 3;
63*b032e3ffSisuckatcs
64*b032e3ffSisuckatcs clang_analyzer_eval(arr[1].y == 2); // expected-warning{{TRUE}}
65*b032e3ffSisuckatcs clang_analyzer_eval(arr[1].x == 3); // expected-warning{{TRUE}}
66*b032e3ffSisuckatcs }
67*b032e3ffSisuckatcs
68*b032e3ffSisuckatcs {
69*b032e3ffSisuckatcs s2 arr[2];
70*b032e3ffSisuckatcs
71*b032e3ffSisuckatcs clang_analyzer_eval(arr[1].y == 2); // expected-warning{{TRUE}}
72*b032e3ffSisuckatcs int x = arr[1].x;
73*b032e3ffSisuckatcs // expected-warning@-1{{Assigned value is garbage or undefined}}
74*b032e3ffSisuckatcs }
75*b032e3ffSisuckatcs }
76*b032e3ffSisuckatcs
77*b032e3ffSisuckatcs struct s3 {
78*b032e3ffSisuckatcs int x = 1;
79*b032e3ffSisuckatcs int y = 2;
80*b032e3ffSisuckatcs };
81*b032e3ffSisuckatcs
82*b032e3ffSisuckatcs struct s4 {
83*b032e3ffSisuckatcs s3 arr[2];
84*b032e3ffSisuckatcs s sarr[2];
85*b032e3ffSisuckatcs };
86*b032e3ffSisuckatcs
e1(void)87*b032e3ffSisuckatcs void e1(void) {
88*b032e3ffSisuckatcs s4 arr[2];
89*b032e3ffSisuckatcs
90*b032e3ffSisuckatcs clang_analyzer_eval(arr[0].arr[0].x == 1); // expected-warning{{TRUE}}
91*b032e3ffSisuckatcs clang_analyzer_eval(arr[0].arr[0].y == 2); // expected-warning{{TRUE}}
92*b032e3ffSisuckatcs
93*b032e3ffSisuckatcs clang_analyzer_eval(arr[0].arr[1].x == 1); // expected-warning{{TRUE}}
94*b032e3ffSisuckatcs clang_analyzer_eval(arr[0].arr[1].y == 2); // expected-warning{{TRUE}}
95*b032e3ffSisuckatcs
96*b032e3ffSisuckatcs clang_analyzer_eval(arr[1].arr[0].x == 1); // expected-warning{{TRUE}}
97*b032e3ffSisuckatcs clang_analyzer_eval(arr[1].arr[0].y == 2); // expected-warning{{TRUE}}
98*b032e3ffSisuckatcs
99*b032e3ffSisuckatcs clang_analyzer_eval(arr[1].arr[1].x == 1); // expected-warning{{TRUE}}
100*b032e3ffSisuckatcs clang_analyzer_eval(arr[1].arr[1].y == 2); // expected-warning{{TRUE}}
101*b032e3ffSisuckatcs
102*b032e3ffSisuckatcs int x = arr[1].sarr[1].x;
103*b032e3ffSisuckatcs // expected-warning@-1{{Assigned value is garbage or undefined}}
104*b032e3ffSisuckatcs }
105*b032e3ffSisuckatcs
f1(void)106*b032e3ffSisuckatcs void f1(void) {
107*b032e3ffSisuckatcs s2 arr[2][2];
108*b032e3ffSisuckatcs
109*b032e3ffSisuckatcs clang_analyzer_eval(arr[1][1].y == 2); // expected-warning{{TRUE}}
110*b032e3ffSisuckatcs int x = arr[1][1].x;
111*b032e3ffSisuckatcs // expected-warning@-1{{Assigned value is garbage or undefined}}
112*b032e3ffSisuckatcs }
113*b032e3ffSisuckatcs
114*b032e3ffSisuckatcs struct s5 {
115*b032e3ffSisuckatcs static int c;
116*b032e3ffSisuckatcs int x;
117*b032e3ffSisuckatcs
s5s5118*b032e3ffSisuckatcs s5() : x(c++) {}
119*b032e3ffSisuckatcs };
120*b032e3ffSisuckatcs
g1(void)121*b032e3ffSisuckatcs void g1(void) {
122*b032e3ffSisuckatcs // FIXME: This test requires -analyzer-disable-checker=cplusplus,
123*b032e3ffSisuckatcs // because of the checker's weird behaviour in case of arrays.
124*b032e3ffSisuckatcs // E.g.:
125*b032e3ffSisuckatcs // s3 *arr = new s3[4];
126*b032e3ffSisuckatcs // s3 *arr2 = new (arr + 1) s3[1];
127*b032e3ffSisuckatcs // ^~~~~~~~~~~~~~~~~~~
128*b032e3ffSisuckatcs // warning: 12 bytes is possibly not enough
129*b032e3ffSisuckatcs // for array allocation which requires
130*b032e3ffSisuckatcs // 4 bytes.
131*b032e3ffSisuckatcs
132*b032e3ffSisuckatcs s5::c = 0;
133*b032e3ffSisuckatcs s5 *arr = new s5[4];
134*b032e3ffSisuckatcs new (arr + 1) s5[3];
135*b032e3ffSisuckatcs
136*b032e3ffSisuckatcs clang_analyzer_eval(arr[0].x == 0); // expected-warning{{TRUE}}
137*b032e3ffSisuckatcs clang_analyzer_eval(arr[1].x == 4); // expected-warning{{TRUE}}
138*b032e3ffSisuckatcs clang_analyzer_eval(arr[2].x == 5); // expected-warning{{TRUE}}
139*b032e3ffSisuckatcs clang_analyzer_eval(arr[3].x == 6); // expected-warning{{TRUE}}
140*b032e3ffSisuckatcs }
141*b032e3ffSisuckatcs
g2(void)142*b032e3ffSisuckatcs void g2(void) {
143*b032e3ffSisuckatcs s5::c = 0;
144*b032e3ffSisuckatcs s5 arr[4];
145*b032e3ffSisuckatcs
146*b032e3ffSisuckatcs clang_analyzer_eval(arr[0].x == 0); // expected-warning{{TRUE}}
147*b032e3ffSisuckatcs clang_analyzer_eval(arr[1].x == 1); // expected-warning{{TRUE}}
148*b032e3ffSisuckatcs clang_analyzer_eval(arr[2].x == 2); // expected-warning{{TRUE}}
149*b032e3ffSisuckatcs clang_analyzer_eval(arr[3].x == 3); // expected-warning{{TRUE}}
150*b032e3ffSisuckatcs }
151*b032e3ffSisuckatcs
g3(void)152*b032e3ffSisuckatcs void g3(void) {
153*b032e3ffSisuckatcs s5::c = 0;
154*b032e3ffSisuckatcs s5 arr[2][2];
155*b032e3ffSisuckatcs
156*b032e3ffSisuckatcs clang_analyzer_eval(arr[0][0].x == 0); // expected-warning{{TRUE}}
157*b032e3ffSisuckatcs clang_analyzer_eval(arr[0][1].x == 1); // expected-warning{{TRUE}}
158*b032e3ffSisuckatcs clang_analyzer_eval(arr[1][0].x == 2); // expected-warning{{TRUE}}
159*b032e3ffSisuckatcs clang_analyzer_eval(arr[1][1].x == 3); // expected-warning{{TRUE}}
160*b032e3ffSisuckatcs }
161*b032e3ffSisuckatcs
h1(void)162*b032e3ffSisuckatcs void h1(void) {
163*b032e3ffSisuckatcs s5::c = 0;
164*b032e3ffSisuckatcs s5 a[2][2], b[2][2];
165*b032e3ffSisuckatcs
166*b032e3ffSisuckatcs clang_analyzer_eval(a[0][0].x == 0); // expected-warning{{TRUE}}
167*b032e3ffSisuckatcs clang_analyzer_eval(a[0][1].x == 1); // expected-warning{{TRUE}}
168*b032e3ffSisuckatcs clang_analyzer_eval(a[1][0].x == 2); // expected-warning{{TRUE}}
169*b032e3ffSisuckatcs clang_analyzer_eval(a[1][1].x == 3); // expected-warning{{TRUE}}
170*b032e3ffSisuckatcs
171*b032e3ffSisuckatcs clang_analyzer_eval(b[0][0].x == 4); // expected-warning{{TRUE}}
172*b032e3ffSisuckatcs clang_analyzer_eval(b[0][1].x == 5); // expected-warning{{TRUE}}
173*b032e3ffSisuckatcs clang_analyzer_eval(b[1][0].x == 6); // expected-warning{{TRUE}}
174*b032e3ffSisuckatcs clang_analyzer_eval(b[1][1].x == 7); // expected-warning{{TRUE}}
175*b032e3ffSisuckatcs }
176*b032e3ffSisuckatcs
h2(void)177*b032e3ffSisuckatcs void h2(void) {
178*b032e3ffSisuckatcs s a[2][2], b[2][2];
179*b032e3ffSisuckatcs
180*b032e3ffSisuckatcs int x = a[1][1].x;
181*b032e3ffSisuckatcs // expected-warning@-1{{Assigned value is garbage or undefined}}
182*b032e3ffSisuckatcs }
183*b032e3ffSisuckatcs
h3(void)184*b032e3ffSisuckatcs void h3(void) {
185*b032e3ffSisuckatcs s a[2][2], b[2][2];
186*b032e3ffSisuckatcs
187*b032e3ffSisuckatcs int x = b[1][1].y;
188*b032e3ffSisuckatcs // expected-warning@-1{{Assigned value is garbage or undefined}}
189*b032e3ffSisuckatcs }
190*b032e3ffSisuckatcs
191*b032e3ffSisuckatcs struct Base {
192*b032e3ffSisuckatcs int x;
193*b032e3ffSisuckatcs int y;
194*b032e3ffSisuckatcs
BaseBase195*b032e3ffSisuckatcs Base(int x, int y) : x(x), y(y) {}
196*b032e3ffSisuckatcs };
197*b032e3ffSisuckatcs
198*b032e3ffSisuckatcs struct Derived : public Base {
199*b032e3ffSisuckatcs int i;
200*b032e3ffSisuckatcs int j;
201*b032e3ffSisuckatcs
DerivedDerived202*b032e3ffSisuckatcs Derived(int x, int y, int i, int j) : Base(x, y), i(i), j(j) {}
203*b032e3ffSisuckatcs };
204*b032e3ffSisuckatcs
delegate(void)205*b032e3ffSisuckatcs void delegate(void) {
206*b032e3ffSisuckatcs Derived arr[2] = {{1, 2, 3, 4}, {5, 6, 7, 8}};
207*b032e3ffSisuckatcs
208*b032e3ffSisuckatcs clang_analyzer_eval(arr[0].x == 1); // expected-warning{{TRUE}}
209*b032e3ffSisuckatcs clang_analyzer_eval(arr[0].y == 2); // expected-warning{{TRUE}}
210*b032e3ffSisuckatcs clang_analyzer_eval(arr[0].i == 3); // expected-warning{{TRUE}}
211*b032e3ffSisuckatcs clang_analyzer_eval(arr[0].j == 4); // expected-warning{{TRUE}}
212*b032e3ffSisuckatcs
213*b032e3ffSisuckatcs clang_analyzer_eval(arr[1].x == 5); // expected-warning{{TRUE}}
214*b032e3ffSisuckatcs clang_analyzer_eval(arr[1].y == 6); // expected-warning{{TRUE}}
215*b032e3ffSisuckatcs clang_analyzer_eval(arr[1].i == 7); // expected-warning{{TRUE}}
216*b032e3ffSisuckatcs clang_analyzer_eval(arr[1].j == 8); // expected-warning{{TRUE}}
217*b032e3ffSisuckatcs }
218*b032e3ffSisuckatcs
delegate_heap(void)219*b032e3ffSisuckatcs void delegate_heap(void) {
220*b032e3ffSisuckatcs Derived *arr = new Derived[2]{{1, 2, 3, 4}, {5, 6, 7, 8}};
221*b032e3ffSisuckatcs
222*b032e3ffSisuckatcs clang_analyzer_eval(arr[0].x == 1); // expected-warning{{TRUE}}
223*b032e3ffSisuckatcs clang_analyzer_eval(arr[0].y == 2); // expected-warning{{TRUE}}
224*b032e3ffSisuckatcs clang_analyzer_eval(arr[0].i == 3); // expected-warning{{TRUE}}
225*b032e3ffSisuckatcs clang_analyzer_eval(arr[0].j == 4); // expected-warning{{TRUE}}
226*b032e3ffSisuckatcs
227*b032e3ffSisuckatcs clang_analyzer_eval(arr[1].x == 5); // expected-warning{{TRUE}}
228*b032e3ffSisuckatcs clang_analyzer_eval(arr[1].y == 6); // expected-warning{{TRUE}}
229*b032e3ffSisuckatcs clang_analyzer_eval(arr[1].i == 7); // expected-warning{{TRUE}}
230*b032e3ffSisuckatcs clang_analyzer_eval(arr[1].j == 8); // expected-warning{{TRUE}}
231*b032e3ffSisuckatcs }
232*b032e3ffSisuckatcs
233*b032e3ffSisuckatcs struct Member {
234*b032e3ffSisuckatcs int x;
235*b032e3ffSisuckatcs int y;
236*b032e3ffSisuckatcs };
237*b032e3ffSisuckatcs
238*b032e3ffSisuckatcs struct Parent {
239*b032e3ffSisuckatcs Member arr[2];
240*b032e3ffSisuckatcs
ParentParent241*b032e3ffSisuckatcs Parent() : arr{{1, 2}, {3, 4}} {}
242*b032e3ffSisuckatcs };
243*b032e3ffSisuckatcs
member()244*b032e3ffSisuckatcs void member() {
245*b032e3ffSisuckatcs Parent arr[2];
246*b032e3ffSisuckatcs
247*b032e3ffSisuckatcs // FIXME: Ideally these are TRUE, but at the moment InitListExpr has no
248*b032e3ffSisuckatcs // knowledge about where the initializer list is used, so we can't bind
249*b032e3ffSisuckatcs // the initializer list to the required region.
250*b032e3ffSisuckatcs clang_analyzer_eval(arr[0].arr[0].x == 1); // expected-warning{{UNKNOWN}}
251*b032e3ffSisuckatcs clang_analyzer_eval(arr[0].arr[0].y == 2); // expected-warning{{UNKNOWN}}
252*b032e3ffSisuckatcs clang_analyzer_eval(arr[0].arr[1].x == 3); // expected-warning{{UNKNOWN}}
253*b032e3ffSisuckatcs clang_analyzer_eval(arr[0].arr[1].y == 4); // expected-warning{{UNKNOWN}}
254*b032e3ffSisuckatcs
255*b032e3ffSisuckatcs clang_analyzer_eval(arr[1].arr[0].x == 1); // expected-warning{{UNKNOWN}}
256*b032e3ffSisuckatcs clang_analyzer_eval(arr[1].arr[0].y == 2); // expected-warning{{UNKNOWN}}
257*b032e3ffSisuckatcs clang_analyzer_eval(arr[1].arr[1].x == 3); // expected-warning{{UNKNOWN}}
258*b032e3ffSisuckatcs clang_analyzer_eval(arr[1].arr[1].y == 4); // expected-warning{{UNKNOWN}}
259*b032e3ffSisuckatcs }
260