blob: 16d7a348fdfb6d57fd722a8639a6c2c7222dc337 [file] [log] [blame]
Artem Dergacheva7ecb4c2019-03-26 00:36:53 +00001// RUN: %clang_analyze_cc1 -w -verify %s\
2// RUN: -analyzer-checker=core,unix.Malloc,cplusplus.NewDeleteLeaks\
3// RUN: -analyzer-checker=debug.ExprInspection -std=c++11
4// RUN: %clang_analyze_cc1 -w -verify %s\
5// RUN: -analyzer-checker=core,unix.Malloc,cplusplus.NewDeleteLeaks\
6// RUN: -analyzer-checker=debug.ExprInspection -std=c++17
7// RUN: %clang_analyze_cc1 -w -verify %s\
8// RUN: -analyzer-checker=core,unix.Malloc,cplusplus.NewDeleteLeaks\
9// RUN: -analyzer-checker=debug.ExprInspection -std=c++11\
10// RUN: -DTEST_INLINABLE_ALLOCATORS
11// RUN: %clang_analyze_cc1 -w -verify %s\
12// RUN: -analyzer-checker=core,unix.Malloc,cplusplus.NewDeleteLeaks\
13// RUN: -analyzer-checker=debug.ExprInspection -std=c++17\
14// RUN: -DTEST_INLINABLE_ALLOCATORS
Jordy Rose43d9f0d2012-05-16 16:01:10 +000015
16void clang_analyzer_eval(bool);
Zhongxing Xu9dc84c92010-11-16 07:52:17 +000017
Artem Dergachev7728f352017-10-05 08:43:32 +000018#include "Inputs/system-header-simulator-cxx.h"
19
Zhongxing Xu9dc84c92010-11-16 07:52:17 +000020class A {
21 int x;
22public:
23 A();
24};
25
26A::A() : x(0) {
Jordy Rose43d9f0d2012-05-16 16:01:10 +000027 clang_analyzer_eval(x == 0); // expected-warning{{TRUE}}
Zhongxing Xu9dc84c92010-11-16 07:52:17 +000028}
Jordan Rose3a0a9e32012-07-26 20:04:21 +000029
30
31class DirectMember {
32 int x;
33public:
34 DirectMember(int value) : x(value) {}
35
36 int getX() { return x; }
37};
38
39void testDirectMember() {
40 DirectMember obj(3);
41 clang_analyzer_eval(obj.getX() == 3); // expected-warning{{TRUE}}
42}
43
44
45class IndirectMember {
46 struct {
47 int x;
48 };
49public:
50 IndirectMember(int value) : x(value) {}
51
52 int getX() { return x; }
53};
54
55void testIndirectMember() {
56 IndirectMember obj(3);
57 clang_analyzer_eval(obj.getX() == 3); // expected-warning{{TRUE}}
58}
Jordan Rose9f3b9d52012-08-02 21:33:42 +000059
60
Jordan Rose563ea232012-08-03 23:31:15 +000061struct DelegatingConstructor {
62 int x;
63 DelegatingConstructor(int y) { x = y; }
64 DelegatingConstructor() : DelegatingConstructor(42) {}
65};
66
67void testDelegatingConstructor() {
68 DelegatingConstructor obj;
69 clang_analyzer_eval(obj.x == 42); // expected-warning{{TRUE}}
70}
71
72
Jordan Rose9f3b9d52012-08-02 21:33:42 +000073struct RefWrapper {
74 RefWrapper(int *p) : x(*p) {}
75 RefWrapper(int &r) : x(r) {}
76 int &x;
77};
78
79void testReferenceMember() {
80 int *p = 0;
Jordan Rosede5277f2012-08-31 17:06:49 +000081 RefWrapper X(p); // expected-warning@-7 {{Dereference of null pointer}}
Jordan Rose9f3b9d52012-08-02 21:33:42 +000082}
83
84void testReferenceMember2() {
85 int *p = 0;
Anna Zaks018e9aa2013-03-07 03:02:36 +000086 RefWrapper X(*p); // expected-warning {{Forming reference to null pointer}}
Jordan Rose9f3b9d52012-08-02 21:33:42 +000087}
Jordan Rose3682f1e2012-08-25 01:06:23 +000088
89
90extern "C" char *strdup(const char *);
91
92class StringWrapper {
93 char *str;
94public:
95 StringWrapper(const char *input) : str(strdup(input)) {} // no-warning
96};
Jordan Rose07c52d22013-01-26 03:16:31 +000097
98
99// PR15070 - Constructing a type containing a non-POD array mistakenly
100// tried to perform a bind instead of relying on the CXXConstructExpr,
101// which caused a cast<> failure in RegionStore.
102namespace DefaultConstructorWithCleanups {
103 class Element {
104 public:
105 int value;
106
107 class Helper {
108 public:
109 ~Helper();
110 };
111 Element(Helper h = Helper());
112 };
113 class Wrapper {
114 public:
115 Element arr[2];
116
117 Wrapper();
118 };
119
120 Wrapper::Wrapper() /* initializers synthesized */ {}
121
122 int test() {
123 Wrapper w;
124 return w.arr[0].value; // no-warning
125 }
126}
Jordan Rosebccda132013-07-17 17:16:42 +0000127
128namespace DefaultMemberInitializers {
129 struct Wrapper {
130 int value = 42;
131
132 Wrapper() {}
133 Wrapper(int x) : value(x) {}
134 Wrapper(bool) {}
135 };
136
137 void test() {
138 Wrapper w1;
139 clang_analyzer_eval(w1.value == 42); // expected-warning{{TRUE}}
140
141 Wrapper w2(50);
142 clang_analyzer_eval(w2.value == 50); // expected-warning{{TRUE}}
143
144 Wrapper w3(false);
145 clang_analyzer_eval(w3.value == 42); // expected-warning{{TRUE}}
146 }
147
148 struct StringWrapper {
149 const char s[4] = "abc";
150 const char *p = "xyz";
151
152 StringWrapper(bool) {}
153 };
154
155 void testString() {
156 StringWrapper w(true);
157 clang_analyzer_eval(w.s[1] == 'b'); // expected-warning{{TRUE}}
158 clang_analyzer_eval(w.p[1] == 'y'); // expected-warning{{TRUE}}
159 }
160}
Devin Coughlind4ba9bd2015-12-17 00:28:33 +0000161
162namespace ReferenceInitialization {
163 struct OtherStruct {
164 OtherStruct(int i);
165 ~OtherStruct();
166 };
167
168 struct MyStruct {
169 MyStruct(int i);
170 MyStruct(OtherStruct os);
171
172 void method() const;
173 };
174
175 void referenceInitializeLocal() {
176 const MyStruct &myStruct(5);
177 myStruct.method(); // no-warning
178 }
179
180 void referenceInitializeMultipleLocals() {
181 const MyStruct &myStruct1(5), myStruct2(5), &myStruct3(5);
182 myStruct1.method(); // no-warning
183 myStruct2.method(); // no-warning
184 myStruct3.method(); // no-warning
185 }
186
187 void referenceInitializeLocalWithCleanup() {
188 const MyStruct &myStruct(OtherStruct(5));
189 myStruct.method(); // no-warning
190 }
Devin Coughlind4ba9bd2015-12-17 00:28:33 +0000191};
Artem Dergachev335c7a02017-01-12 09:46:16 +0000192
193namespace PR31592 {
194struct C {
195 C() : f("}") { } // no-crash
196 const char(&f)[2];
197};
198}
Artem Dergachev7728f352017-10-05 08:43:32 +0000199
200namespace CXX_initializer_lists {
201struct C {
202 C(std::initializer_list<int *> list);
203};
Artem Dergachev0dca9cd2017-11-27 17:37:09 +0000204void testPointerEscapeIntoLists() {
Artem Dergachev7728f352017-10-05 08:43:32 +0000205 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}
Artem Dergachev0dca9cd2017-11-27 17:37:09 +0000212
213void testPassListsWithExplicitConstructors() {
214 (void)(std::initializer_list<int>){12}; // no-crash
215}
Artem Dergachev7728f352017-10-05 08:43:32 +0000216}
Artem Dergachev4cf105d2017-12-20 00:40:38 +0000217
218namespace CXX17_aggregate_construction {
219struct A {
220 A();
221};
222
223struct B: public A {
224};
225
226struct C: public B {
227};
228
229struct 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.
234void 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
Artem Dergacheva7ecb4c2019-03-26 00:36:53 +0000245#if __cplusplus >= 201703L
Artem Dergachev4cf105d2017-12-20 00:40:38 +0000246 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}
Artem Dergachevaf056c12019-03-21 00:15:07 +0000255} // namespace CXX17_aggregate_construction
256
257namespace CXX17_transparent_init_list_exprs {
258class A {};
259
260class B: private A {};
261
262B boo();
263void foo1() {
264 B b { boo() }; // no-crash
Artem Dergachev4cf105d2017-12-20 00:40:38 +0000265}
Artem Dergachevaf056c12019-03-21 00:15:07 +0000266
267class C: virtual public A {};
268
269C coo();
270void foo2() {
271 C c { coo() }; // no-crash
272}
Artem Dergacheva7ecb4c2019-03-26 00:36:53 +0000273
274B foo_recursive() {
275 B b { foo_recursive() };
276}
Artem Dergachevaf056c12019-03-21 00:15:07 +0000277} // namespace CXX17_transparent_init_list_exprs
Artem Dergachev46470df2019-05-24 23:37:08 +0000278
279namespace skip_vbase_initializer_side_effects {
280int glob;
281struct S {
282 S() { ++glob; }
283};
284
285struct A {
286 A() {}
287 A(S s) {}
288};
289
290struct B : virtual A {
291 B() : A(S()) {}
292};
293
294struct C : B {
295 C() {}
296};
297
298void foo() {
299 glob = 0;
300 B b;
301 clang_analyzer_eval(glob == 1); // expected-warning{{TRUE}}
302 C c; // no-crash
303 clang_analyzer_eval(glob == 1); // expected-warning{{TRUE}}
304}
305} // namespace skip_vbase_initializer_side_effects
306
307namespace dont_skip_vbase_initializers_in_most_derived_class {
308struct A {
309 static int a;
310 A() { a = 0; }
311 A(int x) { a = x; }
312};
313
314struct B {
315 static int b;
316 B() { b = 0; }
317 B(int y) { b = y; }
318};
319
320struct C : virtual A {
321 C() : A(1) {}
322};
323struct D : C, virtual B {
324 D() : B(2) {}
325};
326
327void testD() {
328 D d;
329 clang_analyzer_eval(A::a == 0); // expected-warning{{TRUE}}
330 clang_analyzer_eval(B::b == 2); // expected-warning{{TRUE}}
331}
332
333struct E : virtual B, C {
334 E() : B(2) {}
335};
336
337void testE() {
338 E e;
339 clang_analyzer_eval(A::a == 0); // expected-warning{{TRUE}}
340 clang_analyzer_eval(B::b == 2); // expected-warning{{TRUE}}
341}
342
343struct F : virtual A, virtual B {
344 F() : A(1) {}
345};
346struct G : F {
347 G(): B(2) {}
348};
349
350void testG() {
351 G g;
352 clang_analyzer_eval(A::a == 0); // expected-warning{{TRUE}}
353 clang_analyzer_eval(B::b == 2); // expected-warning{{TRUE}}
354}
355
356struct H : virtual B, virtual A {
357 H(): A(1) {}
358};
359struct I : H {
360 I(): B(2) {}
361};
362
363void testI() {
364 I i;
365 clang_analyzer_eval(A::a == 0); // expected-warning{{TRUE}}
366 clang_analyzer_eval(B::b == 2); // expected-warning{{TRUE}}
367}
368} // namespace dont_skip_vbase_initializers_in_most_derived_class