xref: /llvm-project/clang/test/Analysis/ctor-array.cpp (revision e4bb68b8717a20c5828b479f83c8648c2596e598)
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