blob: a71e35dc63c6c75bd227818b787c568f394ddae5 [file] [log] [blame]
Anna Zaksbfa9ab82013-01-24 23:15:30 +00001// RUN: %clang_cc1 -analyze -analyzer-checker=core,unix.Malloc,debug.ExprInspection -analyzer-config c++-inlining=constructors -std=c++11 -verify %s
Jordy Rose43d9f0d2012-05-16 16:01:10 +00002
3void clang_analyzer_eval(bool);
Zhongxing Xu9dc84c92010-11-16 07:52:17 +00004
5class A {
6 int x;
7public:
8 A();
9};
10
11A::A() : x(0) {
Jordy Rose43d9f0d2012-05-16 16:01:10 +000012 clang_analyzer_eval(x == 0); // expected-warning{{TRUE}}
Zhongxing Xu9dc84c92010-11-16 07:52:17 +000013}
Jordan Rose3a0a9e32012-07-26 20:04:21 +000014
15
16class DirectMember {
17 int x;
18public:
19 DirectMember(int value) : x(value) {}
20
21 int getX() { return x; }
22};
23
24void testDirectMember() {
25 DirectMember obj(3);
26 clang_analyzer_eval(obj.getX() == 3); // expected-warning{{TRUE}}
27}
28
29
30class IndirectMember {
31 struct {
32 int x;
33 };
34public:
35 IndirectMember(int value) : x(value) {}
36
37 int getX() { return x; }
38};
39
40void testIndirectMember() {
41 IndirectMember obj(3);
42 clang_analyzer_eval(obj.getX() == 3); // expected-warning{{TRUE}}
43}
Jordan Rose9f3b9d52012-08-02 21:33:42 +000044
45
Jordan Rose563ea232012-08-03 23:31:15 +000046struct DelegatingConstructor {
47 int x;
48 DelegatingConstructor(int y) { x = y; }
49 DelegatingConstructor() : DelegatingConstructor(42) {}
50};
51
52void testDelegatingConstructor() {
53 DelegatingConstructor obj;
54 clang_analyzer_eval(obj.x == 42); // expected-warning{{TRUE}}
55}
56
57
Jordan Rose9f3b9d52012-08-02 21:33:42 +000058struct RefWrapper {
59 RefWrapper(int *p) : x(*p) {}
60 RefWrapper(int &r) : x(r) {}
61 int &x;
62};
63
64void testReferenceMember() {
65 int *p = 0;
Jordan Rosede5277f2012-08-31 17:06:49 +000066 RefWrapper X(p); // expected-warning@-7 {{Dereference of null pointer}}
Jordan Rose9f3b9d52012-08-02 21:33:42 +000067}
68
69void testReferenceMember2() {
70 int *p = 0;
Anna Zaks018e9aa2013-03-07 03:02:36 +000071 RefWrapper X(*p); // expected-warning {{Forming reference to null pointer}}
Jordan Rose9f3b9d52012-08-02 21:33:42 +000072}
Jordan Rose3682f1e2012-08-25 01:06:23 +000073
74
75extern "C" char *strdup(const char *);
76
77class StringWrapper {
78 char *str;
79public:
80 StringWrapper(const char *input) : str(strdup(input)) {} // no-warning
81};
Jordan Rose07c52d22013-01-26 03:16:31 +000082
83
84// PR15070 - Constructing a type containing a non-POD array mistakenly
85// tried to perform a bind instead of relying on the CXXConstructExpr,
86// which caused a cast<> failure in RegionStore.
87namespace DefaultConstructorWithCleanups {
88 class Element {
89 public:
90 int value;
91
92 class Helper {
93 public:
94 ~Helper();
95 };
96 Element(Helper h = Helper());
97 };
98 class Wrapper {
99 public:
100 Element arr[2];
101
102 Wrapper();
103 };
104
105 Wrapper::Wrapper() /* initializers synthesized */ {}
106
107 int test() {
108 Wrapper w;
109 return w.arr[0].value; // no-warning
110 }
111}
Jordan Rosebccda132013-07-17 17:16:42 +0000112
113namespace DefaultMemberInitializers {
114 struct Wrapper {
115 int value = 42;
116
117 Wrapper() {}
118 Wrapper(int x) : value(x) {}
119 Wrapper(bool) {}
120 };
121
122 void test() {
123 Wrapper w1;
124 clang_analyzer_eval(w1.value == 42); // expected-warning{{TRUE}}
125
126 Wrapper w2(50);
127 clang_analyzer_eval(w2.value == 50); // expected-warning{{TRUE}}
128
129 Wrapper w3(false);
130 clang_analyzer_eval(w3.value == 42); // expected-warning{{TRUE}}
131 }
132
133 struct StringWrapper {
134 const char s[4] = "abc";
135 const char *p = "xyz";
136
137 StringWrapper(bool) {}
138 };
139
140 void testString() {
141 StringWrapper w(true);
142 clang_analyzer_eval(w.s[1] == 'b'); // expected-warning{{TRUE}}
143 clang_analyzer_eval(w.p[1] == 'y'); // expected-warning{{TRUE}}
144 }
145}