initializer.cpp revision 3682f1ea9c7fddc7dcbc590891158ba40f7fca16
1// RUN: %clang_cc1 -analyze -analyzer-checker=core,unix.Malloc,debug.ExprInspection -analyzer-ipa=inlining -cfg-add-implicit-dtors -std=c++11 -verify %s 2 3// We don't inline constructors unless we have destructors turned on. 4 5void clang_analyzer_eval(bool); 6 7class A { 8 int x; 9public: 10 A(); 11}; 12 13A::A() : x(0) { 14 clang_analyzer_eval(x == 0); // expected-warning{{TRUE}} 15} 16 17 18class DirectMember { 19 int x; 20public: 21 DirectMember(int value) : x(value) {} 22 23 int getX() { return x; } 24}; 25 26void testDirectMember() { 27 DirectMember obj(3); 28 clang_analyzer_eval(obj.getX() == 3); // expected-warning{{TRUE}} 29} 30 31 32class IndirectMember { 33 struct { 34 int x; 35 }; 36public: 37 IndirectMember(int value) : x(value) {} 38 39 int getX() { return x; } 40}; 41 42void testIndirectMember() { 43 IndirectMember obj(3); 44 clang_analyzer_eval(obj.getX() == 3); // expected-warning{{TRUE}} 45} 46 47 48struct DelegatingConstructor { 49 int x; 50 DelegatingConstructor(int y) { x = y; } 51 DelegatingConstructor() : DelegatingConstructor(42) {} 52}; 53 54void testDelegatingConstructor() { 55 DelegatingConstructor obj; 56 clang_analyzer_eval(obj.x == 42); // expected-warning{{TRUE}} 57} 58 59 60struct RefWrapper { 61 RefWrapper(int *p) : x(*p) {} 62 RefWrapper(int &r) : x(r) {} 63 int &x; 64}; 65 66void testReferenceMember() { 67 int *p = 0; 68 RefWrapper X(p); // expected-warning@61 {{Dereference of null pointer}} 69} 70 71void testReferenceMember2() { 72 int *p = 0; 73 // FIXME: We should warn here, since we're creating the reference here. 74 RefWrapper X(*p); // expected-warning@62 {{Dereference of null pointer}} 75} 76 77 78extern "C" char *strdup(const char *); 79 80class StringWrapper { 81 char *str; 82public: 83 StringWrapper(const char *input) : str(strdup(input)) {} // no-warning 84}; 85