1bef9f8aaSArtem Dergachev // RUN: %clang_analyze_cc1 -w -verify %s\
2bef9f8aaSArtem Dergachev // RUN: -analyzer-checker=core,unix.Malloc,cplusplus.NewDeleteLeaks\
3bef9f8aaSArtem Dergachev // RUN: -analyzer-checker=debug.ExprInspection -std=c++11
4bef9f8aaSArtem Dergachev // RUN: %clang_analyze_cc1 -w -verify %s\
5bef9f8aaSArtem Dergachev // RUN: -analyzer-checker=core,unix.Malloc,cplusplus.NewDeleteLeaks\
6bef9f8aaSArtem Dergachev // RUN: -analyzer-checker=debug.ExprInspection -std=c++17
7bef9f8aaSArtem Dergachev // RUN: %clang_analyze_cc1 -w -verify %s\
8bef9f8aaSArtem Dergachev // RUN: -analyzer-checker=core,unix.Malloc,cplusplus.NewDeleteLeaks\
9bef9f8aaSArtem Dergachev // RUN: -analyzer-checker=debug.ExprInspection -std=c++11\
10bef9f8aaSArtem Dergachev // RUN: -DTEST_INLINABLE_ALLOCATORS
11bef9f8aaSArtem Dergachev // RUN: %clang_analyze_cc1 -w -verify %s\
12bef9f8aaSArtem Dergachev // RUN: -analyzer-checker=core,unix.Malloc,cplusplus.NewDeleteLeaks\
13bef9f8aaSArtem Dergachev // RUN: -analyzer-checker=debug.ExprInspection -std=c++17\
14bef9f8aaSArtem Dergachev // RUN: -DTEST_INLINABLE_ALLOCATORS
156d5a8caaSJordy Rose
166d5a8caaSJordy Rose void clang_analyzer_eval(bool);
171ade3267SZhongxing Xu
1859428d18SArtem Dergachev #include "Inputs/system-header-simulator-cxx.h"
1959428d18SArtem Dergachev
201ade3267SZhongxing Xu class A {
211ade3267SZhongxing Xu int x;
221ade3267SZhongxing Xu public:
231ade3267SZhongxing Xu A();
241ade3267SZhongxing Xu };
251ade3267SZhongxing Xu
A()261ade3267SZhongxing Xu A::A() : x(0) {
276d5a8caaSJordy Rose clang_analyzer_eval(x == 0); // expected-warning{{TRUE}}
281ade3267SZhongxing Xu }
2954529a34SJordan Rose
3054529a34SJordan Rose
3154529a34SJordan Rose class DirectMember {
3254529a34SJordan Rose int x;
3354529a34SJordan Rose public:
DirectMember(int value)3454529a34SJordan Rose DirectMember(int value) : x(value) {}
3554529a34SJordan Rose
getX()3654529a34SJordan Rose int getX() { return x; }
3754529a34SJordan Rose };
3854529a34SJordan Rose
testDirectMember()3954529a34SJordan Rose void testDirectMember() {
4054529a34SJordan Rose DirectMember obj(3);
4154529a34SJordan Rose clang_analyzer_eval(obj.getX() == 3); // expected-warning{{TRUE}}
4254529a34SJordan Rose }
4354529a34SJordan Rose
4454529a34SJordan Rose
4554529a34SJordan Rose class IndirectMember {
4654529a34SJordan Rose struct {
4754529a34SJordan Rose int x;
4854529a34SJordan Rose };
4954529a34SJordan Rose public:
IndirectMember(int value)5054529a34SJordan Rose IndirectMember(int value) : x(value) {}
5154529a34SJordan Rose
getX()5254529a34SJordan Rose int getX() { return x; }
5354529a34SJordan Rose };
5454529a34SJordan Rose
testIndirectMember()5554529a34SJordan Rose void testIndirectMember() {
5654529a34SJordan Rose IndirectMember obj(3);
5754529a34SJordan Rose clang_analyzer_eval(obj.getX() == 3); // expected-warning{{TRUE}}
5854529a34SJordan Rose }
599a2eec38SJordan Rose
609a2eec38SJordan Rose
6117a8757aSJordan Rose struct DelegatingConstructor {
6217a8757aSJordan Rose int x;
DelegatingConstructorDelegatingConstructor6317a8757aSJordan Rose DelegatingConstructor(int y) { x = y; }
DelegatingConstructorDelegatingConstructor6417a8757aSJordan Rose DelegatingConstructor() : DelegatingConstructor(42) {}
6517a8757aSJordan Rose };
6617a8757aSJordan Rose
testDelegatingConstructor()6717a8757aSJordan Rose void testDelegatingConstructor() {
6817a8757aSJordan Rose DelegatingConstructor obj;
6917a8757aSJordan Rose clang_analyzer_eval(obj.x == 42); // expected-warning{{TRUE}}
7017a8757aSJordan Rose }
7117a8757aSJordan Rose
7217a8757aSJordan Rose
739a2eec38SJordan Rose struct RefWrapper {
RefWrapperRefWrapper749a2eec38SJordan Rose RefWrapper(int *p) : x(*p) {}
RefWrapperRefWrapper759a2eec38SJordan Rose RefWrapper(int &r) : x(r) {}
769a2eec38SJordan Rose int &x;
779a2eec38SJordan Rose };
789a2eec38SJordan Rose
testReferenceMember()799a2eec38SJordan Rose void testReferenceMember() {
809a2eec38SJordan Rose int *p = 0;
81219c9d0dSJordan Rose RefWrapper X(p); // expected-warning@-7 {{Dereference of null pointer}}
829a2eec38SJordan Rose }
839a2eec38SJordan Rose
testReferenceMember2()849a2eec38SJordan Rose void testReferenceMember2() {
859a2eec38SJordan Rose int *p = 0;
869e0da9e0SAnna Zaks RefWrapper X(*p); // expected-warning {{Forming reference to null pointer}}
879a2eec38SJordan Rose }
880a0aa84dSJordan Rose
890a0aa84dSJordan Rose
900a0aa84dSJordan Rose extern "C" char *strdup(const char *);
910a0aa84dSJordan Rose
920a0aa84dSJordan Rose class StringWrapper {
930a0aa84dSJordan Rose char *str;
940a0aa84dSJordan Rose public:
StringWrapper(const char * input)950a0aa84dSJordan Rose StringWrapper(const char *input) : str(strdup(input)) {} // no-warning
960a0aa84dSJordan Rose };
979853371fSJordan Rose
989853371fSJordan Rose
999853371fSJordan Rose // PR15070 - Constructing a type containing a non-POD array mistakenly
1009853371fSJordan Rose // tried to perform a bind instead of relying on the CXXConstructExpr,
1019853371fSJordan Rose // which caused a cast<> failure in RegionStore.
1029853371fSJordan Rose namespace DefaultConstructorWithCleanups {
1039853371fSJordan Rose class Element {
1049853371fSJordan Rose public:
1059853371fSJordan Rose int value;
1069853371fSJordan Rose
1079853371fSJordan Rose class Helper {
1089853371fSJordan Rose public:
1099853371fSJordan Rose ~Helper();
1109853371fSJordan Rose };
1119853371fSJordan Rose Element(Helper h = Helper());
1129853371fSJordan Rose };
1139853371fSJordan Rose class Wrapper {
1149853371fSJordan Rose public:
1159853371fSJordan Rose Element arr[2];
1169853371fSJordan Rose
1179853371fSJordan Rose Wrapper();
1189853371fSJordan Rose };
1199853371fSJordan Rose
Wrapper()1209853371fSJordan Rose Wrapper::Wrapper() /* initializers synthesized */ {}
1219853371fSJordan Rose
test()1229853371fSJordan Rose int test() {
1239853371fSJordan Rose Wrapper w;
1249853371fSJordan Rose return w.arr[0].value; // no-warning
1259853371fSJordan Rose }
1269853371fSJordan Rose }
1275f6c173eSJordan Rose
1285f6c173eSJordan Rose namespace DefaultMemberInitializers {
1295f6c173eSJordan Rose struct Wrapper {
1305f6c173eSJordan Rose int value = 42;
1315f6c173eSJordan Rose
WrapperDefaultMemberInitializers::Wrapper1325f6c173eSJordan Rose Wrapper() {}
WrapperDefaultMemberInitializers::Wrapper1335f6c173eSJordan Rose Wrapper(int x) : value(x) {}
WrapperDefaultMemberInitializers::Wrapper1345f6c173eSJordan Rose Wrapper(bool) {}
1355f6c173eSJordan Rose };
1365f6c173eSJordan Rose
test()1375f6c173eSJordan Rose void test() {
1385f6c173eSJordan Rose Wrapper w1;
1395f6c173eSJordan Rose clang_analyzer_eval(w1.value == 42); // expected-warning{{TRUE}}
1405f6c173eSJordan Rose
1415f6c173eSJordan Rose Wrapper w2(50);
1425f6c173eSJordan Rose clang_analyzer_eval(w2.value == 50); // expected-warning{{TRUE}}
1435f6c173eSJordan Rose
1445f6c173eSJordan Rose Wrapper w3(false);
1455f6c173eSJordan Rose clang_analyzer_eval(w3.value == 42); // expected-warning{{TRUE}}
1465f6c173eSJordan Rose }
1475f6c173eSJordan Rose
1485f6c173eSJordan Rose struct StringWrapper {
1495f6c173eSJordan Rose const char s[4] = "abc";
1505f6c173eSJordan Rose const char *p = "xyz";
1515f6c173eSJordan Rose
StringWrapperDefaultMemberInitializers::StringWrapper1525f6c173eSJordan Rose StringWrapper(bool) {}
1535f6c173eSJordan Rose };
1545f6c173eSJordan Rose
testString()1555f6c173eSJordan Rose void testString() {
1565f6c173eSJordan Rose StringWrapper w(true);
1575f6c173eSJordan Rose clang_analyzer_eval(w.s[1] == 'b'); // expected-warning{{TRUE}}
1585f6c173eSJordan Rose clang_analyzer_eval(w.p[1] == 'y'); // expected-warning{{TRUE}}
1595f6c173eSJordan Rose }
1605f6c173eSJordan Rose }
161412c0af2SDevin Coughlin
162412c0af2SDevin Coughlin namespace ReferenceInitialization {
163412c0af2SDevin Coughlin struct OtherStruct {
164412c0af2SDevin Coughlin OtherStruct(int i);
165412c0af2SDevin Coughlin ~OtherStruct();
166412c0af2SDevin Coughlin };
167412c0af2SDevin Coughlin
168412c0af2SDevin Coughlin struct MyStruct {
169412c0af2SDevin Coughlin MyStruct(int i);
170412c0af2SDevin Coughlin MyStruct(OtherStruct os);
171412c0af2SDevin Coughlin
172412c0af2SDevin Coughlin void method() const;
173412c0af2SDevin Coughlin };
174412c0af2SDevin Coughlin
referenceInitializeLocal()175412c0af2SDevin Coughlin void referenceInitializeLocal() {
176412c0af2SDevin Coughlin const MyStruct &myStruct(5);
177412c0af2SDevin Coughlin myStruct.method(); // no-warning
178412c0af2SDevin Coughlin }
179412c0af2SDevin Coughlin
referenceInitializeMultipleLocals()180412c0af2SDevin Coughlin void referenceInitializeMultipleLocals() {
181412c0af2SDevin Coughlin const MyStruct &myStruct1(5), myStruct2(5), &myStruct3(5);
182412c0af2SDevin Coughlin myStruct1.method(); // no-warning
183412c0af2SDevin Coughlin myStruct2.method(); // no-warning
184412c0af2SDevin Coughlin myStruct3.method(); // no-warning
185412c0af2SDevin Coughlin }
186412c0af2SDevin Coughlin
referenceInitializeLocalWithCleanup()187412c0af2SDevin Coughlin void referenceInitializeLocalWithCleanup() {
188412c0af2SDevin Coughlin const MyStruct &myStruct(OtherStruct(5));
189412c0af2SDevin Coughlin myStruct.method(); // no-warning
190412c0af2SDevin Coughlin }
191412c0af2SDevin Coughlin };
192c9affb0dSArtem Dergachev
193c9affb0dSArtem Dergachev namespace PR31592 {
194c9affb0dSArtem Dergachev struct C {
CPR31592::C195c9affb0dSArtem Dergachev C() : f("}") { } // no-crash
196c9affb0dSArtem Dergachev const char(&f)[2];
197c9affb0dSArtem Dergachev };
198c9affb0dSArtem Dergachev }
19959428d18SArtem Dergachev
20059428d18SArtem Dergachev namespace CXX_initializer_lists {
20159428d18SArtem Dergachev struct C {
20259428d18SArtem Dergachev C(std::initializer_list<int *> list);
20359428d18SArtem Dergachev };
testPointerEscapeIntoLists()204052436f7SArtem Dergachev void testPointerEscapeIntoLists() {
20559428d18SArtem Dergachev C empty{}; // no-crash
20659428d18SArtem Dergachev
20759428d18SArtem Dergachev // Do not warn that 'x' leaks. It might have been deleted by
20859428d18SArtem Dergachev // the destructor of 'c'.
20959428d18SArtem Dergachev int *x = new int;
21059428d18SArtem Dergachev C c{x}; // no-warning
21159428d18SArtem Dergachev }
212052436f7SArtem Dergachev
testPassListsWithExplicitConstructors()213052436f7SArtem Dergachev void testPassListsWithExplicitConstructors() {
214052436f7SArtem Dergachev (void)(std::initializer_list<int>){12}; // no-crash
215052436f7SArtem Dergachev }
21659428d18SArtem Dergachev }
217e8ba3ec4SArtem Dergachev
218e8ba3ec4SArtem Dergachev namespace CXX17_aggregate_construction {
219e8ba3ec4SArtem Dergachev struct A {
220e8ba3ec4SArtem Dergachev A();
221e8ba3ec4SArtem Dergachev };
222e8ba3ec4SArtem Dergachev
223e8ba3ec4SArtem Dergachev struct B: public A {
224e8ba3ec4SArtem Dergachev };
225e8ba3ec4SArtem Dergachev
226e8ba3ec4SArtem Dergachev struct C: public B {
227e8ba3ec4SArtem Dergachev };
228e8ba3ec4SArtem Dergachev
229e8ba3ec4SArtem Dergachev struct D: public virtual A {
230e8ba3ec4SArtem Dergachev };
231e8ba3ec4SArtem Dergachev
232e8ba3ec4SArtem Dergachev // In C++17, classes B and C are aggregates, so they will be constructed
233e8ba3ec4SArtem Dergachev // without actually calling their trivial constructor. Used to crash.
foo()234e8ba3ec4SArtem Dergachev void foo() {
235e8ba3ec4SArtem Dergachev B b = {}; // no-crash
236e8ba3ec4SArtem Dergachev const B &bl = {}; // no-crash
237e8ba3ec4SArtem Dergachev B &&br = {}; // no-crash
238e8ba3ec4SArtem Dergachev
239e8ba3ec4SArtem Dergachev C c = {}; // no-crash
240e8ba3ec4SArtem Dergachev const C &cl = {}; // no-crash
241e8ba3ec4SArtem Dergachev C &&cr = {}; // no-crash
242e8ba3ec4SArtem Dergachev
243e8ba3ec4SArtem Dergachev D d = {}; // no-crash
244e8ba3ec4SArtem Dergachev
245bef9f8aaSArtem Dergachev #if __cplusplus >= 201703L
246e8ba3ec4SArtem Dergachev C cd = {{}}; // no-crash
247e8ba3ec4SArtem Dergachev const C &cdl = {{}}; // no-crash
248e8ba3ec4SArtem Dergachev C &&cdr = {{}}; // no-crash
249e8ba3ec4SArtem Dergachev
250e8ba3ec4SArtem Dergachev const B &bll = {{}}; // no-crash
251e8ba3ec4SArtem Dergachev const B &bcl = C({{}}); // no-crash
252e8ba3ec4SArtem Dergachev B &&bcr = C({{}}); // no-crash
253e8ba3ec4SArtem Dergachev #endif
254e8ba3ec4SArtem Dergachev }
255aa40315cSArtem Dergachev } // namespace CXX17_aggregate_construction
256aa40315cSArtem Dergachev
257aa40315cSArtem Dergachev namespace CXX17_transparent_init_list_exprs {
258aa40315cSArtem Dergachev class A {};
259aa40315cSArtem Dergachev
260aa40315cSArtem Dergachev class B: private A {};
261aa40315cSArtem Dergachev
262aa40315cSArtem Dergachev B boo();
foo1()263aa40315cSArtem Dergachev void foo1() {
264aa40315cSArtem Dergachev B b { boo() }; // no-crash
265e8ba3ec4SArtem Dergachev }
266aa40315cSArtem Dergachev
267aa40315cSArtem Dergachev class C: virtual public A {};
268aa40315cSArtem Dergachev
269aa40315cSArtem Dergachev C coo();
foo2()270aa40315cSArtem Dergachev void foo2() {
271aa40315cSArtem Dergachev C c { coo() }; // no-crash
272aa40315cSArtem Dergachev }
273bef9f8aaSArtem Dergachev
foo_recursive()274bef9f8aaSArtem Dergachev B foo_recursive() {
275bef9f8aaSArtem Dergachev B b { foo_recursive() };
276bef9f8aaSArtem Dergachev }
277aa40315cSArtem Dergachev } // namespace CXX17_transparent_init_list_exprs
278*192a7474SArtem Dergachev
279*192a7474SArtem Dergachev namespace skip_vbase_initializer_side_effects {
280*192a7474SArtem Dergachev int glob;
281*192a7474SArtem Dergachev struct S {
Sskip_vbase_initializer_side_effects::S282*192a7474SArtem Dergachev S() { ++glob; }
283*192a7474SArtem Dergachev };
284*192a7474SArtem Dergachev
285*192a7474SArtem Dergachev struct A {
Askip_vbase_initializer_side_effects::A286*192a7474SArtem Dergachev A() {}
Askip_vbase_initializer_side_effects::A287*192a7474SArtem Dergachev A(S s) {}
288*192a7474SArtem Dergachev };
289*192a7474SArtem Dergachev
290*192a7474SArtem Dergachev struct B : virtual A {
Bskip_vbase_initializer_side_effects::B291*192a7474SArtem Dergachev B() : A(S()) {}
292*192a7474SArtem Dergachev };
293*192a7474SArtem Dergachev
294*192a7474SArtem Dergachev struct C : B {
Cskip_vbase_initializer_side_effects::C295*192a7474SArtem Dergachev C() {}
296*192a7474SArtem Dergachev };
297*192a7474SArtem Dergachev
foo()298*192a7474SArtem Dergachev void foo() {
299*192a7474SArtem Dergachev glob = 0;
300*192a7474SArtem Dergachev B b;
301*192a7474SArtem Dergachev clang_analyzer_eval(glob == 1); // expected-warning{{TRUE}}
302*192a7474SArtem Dergachev C c; // no-crash
303*192a7474SArtem Dergachev clang_analyzer_eval(glob == 1); // expected-warning{{TRUE}}
304*192a7474SArtem Dergachev }
305*192a7474SArtem Dergachev } // namespace skip_vbase_initializer_side_effects
306*192a7474SArtem Dergachev
307*192a7474SArtem Dergachev namespace dont_skip_vbase_initializers_in_most_derived_class {
308*192a7474SArtem Dergachev struct A {
309*192a7474SArtem Dergachev static int a;
Adont_skip_vbase_initializers_in_most_derived_class::A310*192a7474SArtem Dergachev A() { a = 0; }
Adont_skip_vbase_initializers_in_most_derived_class::A311*192a7474SArtem Dergachev A(int x) { a = x; }
312*192a7474SArtem Dergachev };
313*192a7474SArtem Dergachev
314*192a7474SArtem Dergachev struct B {
315*192a7474SArtem Dergachev static int b;
Bdont_skip_vbase_initializers_in_most_derived_class::B316*192a7474SArtem Dergachev B() { b = 0; }
Bdont_skip_vbase_initializers_in_most_derived_class::B317*192a7474SArtem Dergachev B(int y) { b = y; }
318*192a7474SArtem Dergachev };
319*192a7474SArtem Dergachev
320*192a7474SArtem Dergachev struct C : virtual A {
Cdont_skip_vbase_initializers_in_most_derived_class::C321*192a7474SArtem Dergachev C() : A(1) {}
322*192a7474SArtem Dergachev };
323*192a7474SArtem Dergachev struct D : C, virtual B {
Ddont_skip_vbase_initializers_in_most_derived_class::D324*192a7474SArtem Dergachev D() : B(2) {}
325*192a7474SArtem Dergachev };
326*192a7474SArtem Dergachev
testD()327*192a7474SArtem Dergachev void testD() {
328*192a7474SArtem Dergachev D d;
329*192a7474SArtem Dergachev clang_analyzer_eval(A::a == 0); // expected-warning{{TRUE}}
330*192a7474SArtem Dergachev clang_analyzer_eval(B::b == 2); // expected-warning{{TRUE}}
331*192a7474SArtem Dergachev }
332*192a7474SArtem Dergachev
333*192a7474SArtem Dergachev struct E : virtual B, C {
Edont_skip_vbase_initializers_in_most_derived_class::E334*192a7474SArtem Dergachev E() : B(2) {}
335*192a7474SArtem Dergachev };
336*192a7474SArtem Dergachev
testE()337*192a7474SArtem Dergachev void testE() {
338*192a7474SArtem Dergachev E e;
339*192a7474SArtem Dergachev clang_analyzer_eval(A::a == 0); // expected-warning{{TRUE}}
340*192a7474SArtem Dergachev clang_analyzer_eval(B::b == 2); // expected-warning{{TRUE}}
341*192a7474SArtem Dergachev }
342*192a7474SArtem Dergachev
343*192a7474SArtem Dergachev struct F : virtual A, virtual B {
Fdont_skip_vbase_initializers_in_most_derived_class::F344*192a7474SArtem Dergachev F() : A(1) {}
345*192a7474SArtem Dergachev };
346*192a7474SArtem Dergachev struct G : F {
Gdont_skip_vbase_initializers_in_most_derived_class::G347*192a7474SArtem Dergachev G(): B(2) {}
348*192a7474SArtem Dergachev };
349*192a7474SArtem Dergachev
testG()350*192a7474SArtem Dergachev void testG() {
351*192a7474SArtem Dergachev G g;
352*192a7474SArtem Dergachev clang_analyzer_eval(A::a == 0); // expected-warning{{TRUE}}
353*192a7474SArtem Dergachev clang_analyzer_eval(B::b == 2); // expected-warning{{TRUE}}
354*192a7474SArtem Dergachev }
355*192a7474SArtem Dergachev
356*192a7474SArtem Dergachev struct H : virtual B, virtual A {
Hdont_skip_vbase_initializers_in_most_derived_class::H357*192a7474SArtem Dergachev H(): A(1) {}
358*192a7474SArtem Dergachev };
359*192a7474SArtem Dergachev struct I : H {
Idont_skip_vbase_initializers_in_most_derived_class::I360*192a7474SArtem Dergachev I(): B(2) {}
361*192a7474SArtem Dergachev };
362*192a7474SArtem Dergachev
testI()363*192a7474SArtem Dergachev void testI() {
364*192a7474SArtem Dergachev I i;
365*192a7474SArtem Dergachev clang_analyzer_eval(A::a == 0); // expected-warning{{TRUE}}
366*192a7474SArtem Dergachev clang_analyzer_eval(B::b == 2); // expected-warning{{TRUE}}
367*192a7474SArtem Dergachev }
368*192a7474SArtem Dergachev } // namespace dont_skip_vbase_initializers_in_most_derived_class
369