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