xref: /llvm-project/clang/test/Analysis/array-init-loop.cpp (revision 8ef628088b54aebd4a8317ce3a0029e3283b3aa0)
1*8ef62808Sisuckatcs // RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -std=c++17 -verify %s
2*8ef62808Sisuckatcs 
3*8ef62808Sisuckatcs void clang_analyzer_eval(bool);
4*8ef62808Sisuckatcs 
5*8ef62808Sisuckatcs void array_init() {
6*8ef62808Sisuckatcs   int arr[] = {1, 2, 3, 4, 5};
7*8ef62808Sisuckatcs 
8*8ef62808Sisuckatcs   auto [a, b, c, d, e] = arr;
9*8ef62808Sisuckatcs 
10*8ef62808Sisuckatcs   clang_analyzer_eval(a == 1); // expected-warning{{TRUE}}
11*8ef62808Sisuckatcs   clang_analyzer_eval(b == 2); // expected-warning{{TRUE}}
12*8ef62808Sisuckatcs   clang_analyzer_eval(c == 3); // expected-warning{{TRUE}}
13*8ef62808Sisuckatcs   clang_analyzer_eval(d == 4); // expected-warning{{TRUE}}
14*8ef62808Sisuckatcs   clang_analyzer_eval(e == 5); // expected-warning{{TRUE}}
15*8ef62808Sisuckatcs }
16*8ef62808Sisuckatcs 
17*8ef62808Sisuckatcs void array_uninit() {
18*8ef62808Sisuckatcs   int arr[5];
19*8ef62808Sisuckatcs 
20*8ef62808Sisuckatcs   auto [a, b, c, d, e] = arr;
21*8ef62808Sisuckatcs 
22*8ef62808Sisuckatcs   int x = e; // expected-warning{{Assigned value is garbage or undefined}}
23*8ef62808Sisuckatcs }
24*8ef62808Sisuckatcs 
25*8ef62808Sisuckatcs void lambda_init() {
26*8ef62808Sisuckatcs   int arr[] = {1, 2, 3, 4, 5};
27*8ef62808Sisuckatcs 
28*8ef62808Sisuckatcs   auto l = [arr] { return arr[0]; }();
29*8ef62808Sisuckatcs   clang_analyzer_eval(l == 1); // expected-warning{{TRUE}}
30*8ef62808Sisuckatcs 
31*8ef62808Sisuckatcs   l = [arr] { return arr[1]; }();
32*8ef62808Sisuckatcs   clang_analyzer_eval(l == 2); // expected-warning{{TRUE}}
33*8ef62808Sisuckatcs 
34*8ef62808Sisuckatcs   l = [arr] { return arr[2]; }();
35*8ef62808Sisuckatcs   clang_analyzer_eval(l == 3); // expected-warning{{TRUE}}
36*8ef62808Sisuckatcs 
37*8ef62808Sisuckatcs   l = [arr] { return arr[3]; }();
38*8ef62808Sisuckatcs   clang_analyzer_eval(l == 4); // expected-warning{{TRUE}}
39*8ef62808Sisuckatcs 
40*8ef62808Sisuckatcs   l = [arr] { return arr[4]; }();
41*8ef62808Sisuckatcs   clang_analyzer_eval(l == 5); // expected-warning{{TRUE}}
42*8ef62808Sisuckatcs }
43*8ef62808Sisuckatcs 
44*8ef62808Sisuckatcs void lambda_uninit() {
45*8ef62808Sisuckatcs   int arr[5];
46*8ef62808Sisuckatcs 
47*8ef62808Sisuckatcs   // FIXME: These should be Undefined, but we fail to read Undefined from a lazyCompoundVal
48*8ef62808Sisuckatcs   int l = [arr] { return arr[0]; }();
49*8ef62808Sisuckatcs   clang_analyzer_eval(l); // expected-warning{{UNKNOWN}}
50*8ef62808Sisuckatcs 
51*8ef62808Sisuckatcs   l = [arr] { return arr[1]; }();
52*8ef62808Sisuckatcs   clang_analyzer_eval(l); // expected-warning{{UNKNOWN}}
53*8ef62808Sisuckatcs 
54*8ef62808Sisuckatcs   l = [arr] { return arr[2]; }();
55*8ef62808Sisuckatcs   clang_analyzer_eval(l); // expected-warning{{UNKNOWN}}
56*8ef62808Sisuckatcs 
57*8ef62808Sisuckatcs   l = [arr] { return arr[3]; }();
58*8ef62808Sisuckatcs   clang_analyzer_eval(l); // expected-warning{{UNKNOWN}}
59*8ef62808Sisuckatcs 
60*8ef62808Sisuckatcs   l = [arr] { return arr[4]; }();
61*8ef62808Sisuckatcs   clang_analyzer_eval(l); // expected-warning{{UNKNOWN}}
62*8ef62808Sisuckatcs }
63*8ef62808Sisuckatcs 
64*8ef62808Sisuckatcs struct S {
65*8ef62808Sisuckatcs   int arr[5];
66*8ef62808Sisuckatcs };
67*8ef62808Sisuckatcs 
68*8ef62808Sisuckatcs void copy_ctor_init() {
69*8ef62808Sisuckatcs   S orig;
70*8ef62808Sisuckatcs   orig.arr[0] = 1;
71*8ef62808Sisuckatcs   orig.arr[1] = 2;
72*8ef62808Sisuckatcs   orig.arr[2] = 3;
73*8ef62808Sisuckatcs   orig.arr[3] = 4;
74*8ef62808Sisuckatcs   orig.arr[4] = 5;
75*8ef62808Sisuckatcs 
76*8ef62808Sisuckatcs   S copy = orig;
77*8ef62808Sisuckatcs   clang_analyzer_eval(copy.arr[0] == 1); // expected-warning{{TRUE}}
78*8ef62808Sisuckatcs   clang_analyzer_eval(copy.arr[1] == 2); // expected-warning{{TRUE}}
79*8ef62808Sisuckatcs   clang_analyzer_eval(copy.arr[2] == 3); // expected-warning{{TRUE}}
80*8ef62808Sisuckatcs   clang_analyzer_eval(copy.arr[3] == 4); // expected-warning{{TRUE}}
81*8ef62808Sisuckatcs   clang_analyzer_eval(copy.arr[4] == 5); // expected-warning{{TRUE}}
82*8ef62808Sisuckatcs }
83*8ef62808Sisuckatcs 
84*8ef62808Sisuckatcs void copy_ctor_uninit() {
85*8ef62808Sisuckatcs   S orig;
86*8ef62808Sisuckatcs 
87*8ef62808Sisuckatcs   S copy = orig;
88*8ef62808Sisuckatcs 
89*8ef62808Sisuckatcs   // FIXME: These should be Undefined, but we fail to read Undefined from a lazyCompoundVal.
90*8ef62808Sisuckatcs   // If the struct is not considered a small struct, instead of a copy, we store a lazy compound value.
91*8ef62808Sisuckatcs   // As the struct has an array data member, it is not considered small.
92*8ef62808Sisuckatcs   clang_analyzer_eval(copy.arr[0]); // expected-warning{{UNKNOWN}}
93*8ef62808Sisuckatcs   clang_analyzer_eval(copy.arr[1]); // expected-warning{{UNKNOWN}}
94*8ef62808Sisuckatcs   clang_analyzer_eval(copy.arr[2]); // expected-warning{{UNKNOWN}}
95*8ef62808Sisuckatcs   clang_analyzer_eval(copy.arr[3]); // expected-warning{{UNKNOWN}}
96*8ef62808Sisuckatcs   clang_analyzer_eval(copy.arr[4]); // expected-warning{{UNKNOWN}}
97*8ef62808Sisuckatcs }
98*8ef62808Sisuckatcs 
99*8ef62808Sisuckatcs void move_ctor_init() {
100*8ef62808Sisuckatcs   S orig;
101*8ef62808Sisuckatcs   orig.arr[0] = 1;
102*8ef62808Sisuckatcs   orig.arr[1] = 2;
103*8ef62808Sisuckatcs   orig.arr[2] = 3;
104*8ef62808Sisuckatcs   orig.arr[3] = 4;
105*8ef62808Sisuckatcs   orig.arr[4] = 5;
106*8ef62808Sisuckatcs 
107*8ef62808Sisuckatcs   S moved = (S &&) orig;
108*8ef62808Sisuckatcs 
109*8ef62808Sisuckatcs   clang_analyzer_eval(moved.arr[0] == 1); // expected-warning{{TRUE}}
110*8ef62808Sisuckatcs   clang_analyzer_eval(moved.arr[1] == 2); // expected-warning{{TRUE}}
111*8ef62808Sisuckatcs   clang_analyzer_eval(moved.arr[2] == 3); // expected-warning{{TRUE}}
112*8ef62808Sisuckatcs   clang_analyzer_eval(moved.arr[3] == 4); // expected-warning{{TRUE}}
113*8ef62808Sisuckatcs   clang_analyzer_eval(moved.arr[4] == 5); // expected-warning{{TRUE}}
114*8ef62808Sisuckatcs }
115*8ef62808Sisuckatcs 
116*8ef62808Sisuckatcs void move_ctor_uninit() {
117*8ef62808Sisuckatcs   S orig;
118*8ef62808Sisuckatcs 
119*8ef62808Sisuckatcs   S moved = (S &&) orig;
120*8ef62808Sisuckatcs 
121*8ef62808Sisuckatcs   // FIXME: These should be Undefined, but we fail to read Undefined from a lazyCompoundVal.
122*8ef62808Sisuckatcs   clang_analyzer_eval(moved.arr[0]); // expected-warning{{UNKNOWN}}
123*8ef62808Sisuckatcs   clang_analyzer_eval(moved.arr[1]); // expected-warning{{UNKNOWN}}
124*8ef62808Sisuckatcs   clang_analyzer_eval(moved.arr[2]); // expected-warning{{UNKNOWN}}
125*8ef62808Sisuckatcs   clang_analyzer_eval(moved.arr[3]); // expected-warning{{UNKNOWN}}
126*8ef62808Sisuckatcs   clang_analyzer_eval(moved.arr[4]); // expected-warning{{UNKNOWN}}
127*8ef62808Sisuckatcs }
128