blob: 3f7802c56d29e239d5f6c90494141a9a822adc92 [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}