Skip to content

Commit b6e6f55

Browse files
committed
[analyzer] Add more C++ list initializer tests and regroup
1 parent 88e72c4 commit b6e6f55

File tree

3 files changed

+910
-233
lines changed

3 files changed

+910
-233
lines changed

clang/test/Analysis/initialization.cpp

-154
Original file line numberDiff line numberDiff line change
@@ -4,105 +4,6 @@ template <typename T>
44
void clang_analyzer_dump(T x);
55
void clang_analyzer_eval(int);
66

7-
struct S {
8-
int a = 3;
9-
};
10-
S const sarr[2] = {};
11-
void definit() {
12-
int i = 1;
13-
// FIXME: Should recognize that it is 3.
14-
clang_analyzer_eval(sarr[i].a); // expected-warning{{UNKNOWN}}
15-
}
16-
17-
int const glob_arr1[3] = {};
18-
void glob_array_index1() {
19-
clang_analyzer_eval(glob_arr1[0] == 0); // expected-warning{{TRUE}}
20-
clang_analyzer_eval(glob_arr1[1] == 0); // expected-warning{{TRUE}}
21-
clang_analyzer_eval(glob_arr1[2] == 0); // expected-warning{{TRUE}}
22-
}
23-
24-
void glob_invalid_index1() {
25-
const int *ptr = glob_arr1;
26-
int idx = -42;
27-
auto x = ptr[idx]; // expected-warning{{garbage or undefined}}
28-
}
29-
30-
void glob_symbolic_index1(int idx) {
31-
clang_analyzer_dump(glob_arr1[idx]); // expected-warning{{Unknown}}
32-
}
33-
34-
int const glob_arr2[4] = {1, 2};
35-
void glob_ptr_index1() {
36-
int const *ptr = glob_arr2;
37-
clang_analyzer_eval(ptr[0] == 1); // expected-warning{{TRUE}}
38-
clang_analyzer_eval(ptr[1] == 2); // expected-warning{{TRUE}}
39-
clang_analyzer_eval(ptr[2] == 0); // expected-warning{{TRUE}}
40-
clang_analyzer_eval(ptr[3] == 0); // expected-warning{{TRUE}}
41-
clang_analyzer_eval(ptr[4] == 0); // expected-warning{{UNDEFINED}}
42-
}
43-
44-
void glob_invalid_index2() {
45-
const int *ptr = glob_arr2;
46-
int idx = 42;
47-
auto x = ptr[idx]; // expected-warning{{garbage or undefined}}
48-
}
49-
50-
const float glob_arr3[] = {
51-
0.0000, 0.0235, 0.0470, 0.0706, 0.0941, 0.1176};
52-
float no_warn_garbage_value() {
53-
return glob_arr3[0]; // no-warning (garbage or undefined)
54-
}
55-
56-
int const glob_arr4[4][2] = {};
57-
void glob_array_index2() {
58-
clang_analyzer_eval(glob_arr4[0][0] == 0); // expected-warning{{TRUE}}
59-
clang_analyzer_eval(glob_arr4[1][0] == 0); // expected-warning{{TRUE}}
60-
clang_analyzer_eval(glob_arr4[1][1] == 0); // expected-warning{{TRUE}}
61-
}
62-
63-
void glob_invalid_index3() {
64-
int idx = -42;
65-
auto x = glob_arr4[1][idx]; // expected-warning{{garbage or undefined}}
66-
}
67-
68-
void glob_invalid_index4() {
69-
const int *ptr = glob_arr4[1];
70-
int idx = -42;
71-
auto x = ptr[idx]; // expected-warning{{garbage or undefined}}
72-
}
73-
74-
int const glob_arr5[4][2] = {{1}, 3, 4, 5};
75-
void glob_array_index3() {
76-
clang_analyzer_eval(glob_arr5[0][0] == 1); // expected-warning{{TRUE}}
77-
clang_analyzer_eval(glob_arr5[0][1] == 0); // expected-warning{{TRUE}}
78-
clang_analyzer_eval(glob_arr5[1][0] == 3); // expected-warning{{TRUE}}
79-
clang_analyzer_eval(glob_arr5[1][1] == 4); // expected-warning{{TRUE}}
80-
clang_analyzer_eval(glob_arr5[2][0] == 5); // expected-warning{{TRUE}}
81-
clang_analyzer_eval(glob_arr5[2][1] == 0); // expected-warning{{TRUE}}
82-
clang_analyzer_eval(glob_arr5[3][0] == 0); // expected-warning{{TRUE}}
83-
clang_analyzer_eval(glob_arr5[3][1] == 0); // expected-warning{{TRUE}}
84-
}
85-
86-
void glob_ptr_index2() {
87-
int const *ptr = glob_arr5[1];
88-
clang_analyzer_eval(ptr[0] == 3); // expected-warning{{TRUE}}
89-
clang_analyzer_eval(ptr[1] == 4); // expected-warning{{TRUE}}
90-
clang_analyzer_eval(ptr[2] == 5); // expected-warning{{UNDEFINED}}
91-
clang_analyzer_eval(ptr[3] == 0); // expected-warning{{UNDEFINED}}
92-
clang_analyzer_eval(ptr[4] == 0); // expected-warning{{UNDEFINED}}
93-
}
94-
95-
void glob_invalid_index5() {
96-
int idx = -42;
97-
auto x = glob_arr5[1][idx]; // expected-warning{{garbage or undefined}}
98-
}
99-
100-
void glob_invalid_index6() {
101-
int const *ptr = &glob_arr5[1][0];
102-
int idx = 42;
103-
auto x = ptr[idx]; // expected-warning{{garbage or undefined}}
104-
}
105-
1067
extern const int glob_arr_no_init[10];
1078
void glob_array_index4() {
1089
clang_analyzer_eval(glob_arr_no_init[2]); // expected-warning{{UNKNOWN}}
@@ -147,26 +48,6 @@ void glob_invalid_index8() {
14748
auto x = ptr[idx]; // expected-warning{{garbage or undefined}}
14849
}
14950

150-
char const glob_arr7[5] = {"123"};
151-
void glob_array_index6() {
152-
clang_analyzer_eval(glob_arr7[0] == '1'); // expected-warning{{TRUE}}
153-
clang_analyzer_eval(glob_arr7[1] == '2'); // expected-warning{{TRUE}}
154-
clang_analyzer_eval(glob_arr7[2] == '3'); // expected-warning{{TRUE}}
155-
clang_analyzer_eval(glob_arr7[3] == '\0'); // expected-warning{{TRUE}}
156-
clang_analyzer_eval(glob_arr7[4] == '\0'); // expected-warning{{TRUE}}
157-
}
158-
159-
void glob_invalid_index9() {
160-
int idx = -42;
161-
auto x = glob_arr7[idx]; // expected-warning{{garbage or undefined}}
162-
}
163-
164-
void glob_invalid_index10() {
165-
const char *ptr = glob_arr7;
166-
int idx = 42;
167-
auto x = ptr[idx]; // expected-warning{{garbage or undefined}}
168-
}
169-
17051
char const *const glob_ptr8 = "123";
17152
void glob_ptr_index4() {
17253
clang_analyzer_eval(glob_ptr8[0] == '1'); // expected-warning{{TRUE}}
@@ -221,38 +102,3 @@ void glob_ptr_index8() {
221102
clang_analyzer_eval(glob_ptr12[2] == 'c'); // expected-warning{{TRUE}}
222103
clang_analyzer_eval(glob_ptr12[3] == '\0'); // expected-warning{{TRUE}}
223104
}
224-
225-
typedef int Int;
226-
typedef Int const CInt;
227-
typedef CInt Arr[2];
228-
typedef Arr Arr2[4];
229-
Arr2 glob_arr8 = {{1}, 3, 4, 5}; // const int[4][2]
230-
void glob_array_typedef1() {
231-
clang_analyzer_eval(glob_arr8[0][0] == 1); // expected-warning{{TRUE}}
232-
clang_analyzer_eval(glob_arr8[0][1] == 0); // expected-warning{{TRUE}}
233-
clang_analyzer_eval(glob_arr8[1][0] == 3); // expected-warning{{TRUE}}
234-
clang_analyzer_eval(glob_arr8[1][1] == 4); // expected-warning{{TRUE}}
235-
clang_analyzer_eval(glob_arr8[2][0] == 5); // expected-warning{{TRUE}}
236-
clang_analyzer_eval(glob_arr8[2][1] == 0); // expected-warning{{TRUE}}
237-
clang_analyzer_eval(glob_arr8[3][0] == 0); // expected-warning{{TRUE}}
238-
clang_analyzer_eval(glob_arr8[3][1] == 0); // expected-warning{{TRUE}}
239-
}
240-
241-
const int glob_arr9[2][4] = {{(1), 2, ((3)), 4}, 5, 6, (((7)))};
242-
void glob_array_parentheses1() {
243-
clang_analyzer_eval(glob_arr9[0][0] == 1); // expected-warning{{TRUE}}
244-
clang_analyzer_eval(glob_arr9[0][1] == 2); // expected-warning{{TRUE}}
245-
clang_analyzer_eval(glob_arr9[0][2] == 3); // expected-warning{{TRUE}}
246-
clang_analyzer_eval(glob_arr9[0][3] == 4); // expected-warning{{TRUE}}
247-
clang_analyzer_eval(glob_arr9[1][0] == 5); // expected-warning{{TRUE}}
248-
clang_analyzer_eval(glob_arr9[1][1] == 6); // expected-warning{{TRUE}}
249-
clang_analyzer_eval(glob_arr9[1][2] == 7); // expected-warning{{TRUE}}
250-
clang_analyzer_eval(glob_arr9[1][3] == 0); // expected-warning{{TRUE}}
251-
}
252-
253-
enum class E {};
254-
const E glob[] = {{}};
255-
void initlistWithinInitlist() {
256-
// no-crash
257-
clang_analyzer_dump(glob[0]); // expected-warning-re {{reg_${{[0-9]+}}<enum E Element{glob,0 S64b,enum E}>}}
258-
}

clang/test/Analysis/initializer.cpp

-79
Original file line numberDiff line numberDiff line change
@@ -197,85 +197,6 @@ struct C {
197197
};
198198
}
199199

200-
namespace CXX_initializer_lists {
201-
struct C {
202-
C(std::initializer_list<int *> list);
203-
};
204-
void testPointerEscapeIntoLists() {
205-
C empty{}; // no-crash
206-
207-
// Do not warn that 'x' leaks. It might have been deleted by
208-
// the destructor of 'c'.
209-
int *x = new int;
210-
C c{x}; // no-warning
211-
}
212-
213-
void testPassListsWithExplicitConstructors() {
214-
(void)(std::initializer_list<int>){12}; // no-crash
215-
}
216-
}
217-
218-
namespace CXX17_aggregate_construction {
219-
struct A {
220-
A();
221-
};
222-
223-
struct B: public A {
224-
};
225-
226-
struct C: public B {
227-
};
228-
229-
struct D: public virtual A {
230-
};
231-
232-
// In C++17, classes B and C are aggregates, so they will be constructed
233-
// without actually calling their trivial constructor. Used to crash.
234-
void foo() {
235-
B b = {}; // no-crash
236-
const B &bl = {}; // no-crash
237-
B &&br = {}; // no-crash
238-
239-
C c = {}; // no-crash
240-
const C &cl = {}; // no-crash
241-
C &&cr = {}; // no-crash
242-
243-
D d = {}; // no-crash
244-
245-
#if __cplusplus >= 201703L
246-
C cd = {{}}; // no-crash
247-
const C &cdl = {{}}; // no-crash
248-
C &&cdr = {{}}; // no-crash
249-
250-
const B &bll = {{}}; // no-crash
251-
const B &bcl = C({{}}); // no-crash
252-
B &&bcr = C({{}}); // no-crash
253-
#endif
254-
}
255-
} // namespace CXX17_aggregate_construction
256-
257-
namespace CXX17_transparent_init_list_exprs {
258-
class A {};
259-
260-
class B: private A {};
261-
262-
B boo();
263-
void foo1() {
264-
B b { boo() }; // no-crash
265-
}
266-
267-
class C: virtual public A {};
268-
269-
C coo();
270-
void foo2() {
271-
C c { coo() }; // no-crash
272-
}
273-
274-
B foo_recursive() {
275-
B b { foo_recursive() };
276-
}
277-
} // namespace CXX17_transparent_init_list_exprs
278-
279200
namespace skip_vbase_initializer_side_effects {
280201
int glob;
281202
struct S {

0 commit comments

Comments
 (0)