blob: 8785a002c6cf28c73308548009540a96c43bb027 [file] [log] [blame]
Jordan Rose3682f1e2012-08-25 01:06:23 +00001// RUN: %clang_cc1 -analyze -analyzer-checker=core,unix.Malloc,debug.ExprInspection -analyzer-ipa=inlining -cfg-add-implicit-dtors -std=c++11 -verify %s
Jordan Rose3a0a9e32012-07-26 20:04:21 +00002
Jordan Rosee1ce7832012-07-31 18:04:59 +00003// We don't inline constructors unless we have destructors turned on.
Jordy Rose43d9f0d2012-05-16 16:01:10 +00004
5void clang_analyzer_eval(bool);
Zhongxing Xu9dc84c92010-11-16 07:52:17 +00006
7class A {
8 int x;
9public:
10 A();
11};
12
13A::A() : x(0) {
Jordy Rose43d9f0d2012-05-16 16:01:10 +000014 clang_analyzer_eval(x == 0); // expected-warning{{TRUE}}
Zhongxing Xu9dc84c92010-11-16 07:52:17 +000015}
Jordan Rose3a0a9e32012-07-26 20:04:21 +000016
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}
Jordan Rose9f3b9d52012-08-02 21:33:42 +000046
47
Jordan Rose563ea232012-08-03 23:31:15 +000048struct 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
Jordan Rose9f3b9d52012-08-02 21:33:42 +000060struct RefWrapper {
61 RefWrapper(int *p) : x(*p) {}
62 RefWrapper(int &r) : x(r) {}
63 int &x;
64};
65
66void testReferenceMember() {
67 int *p = 0;
Jordan Rose3682f1e2012-08-25 01:06:23 +000068 RefWrapper X(p); // expected-warning@61 {{Dereference of null pointer}}
Jordan Rose9f3b9d52012-08-02 21:33:42 +000069}
70
71void testReferenceMember2() {
72 int *p = 0;
Jordan Rose3682f1e2012-08-25 01:06:23 +000073 // FIXME: We should warn here, since we're creating the reference here.
74 RefWrapper X(*p); // expected-warning@62 {{Dereference of null pointer}}
Jordan Rose9f3b9d52012-08-02 21:33:42 +000075}
Jordan Rose3682f1e2012-08-25 01:06:23 +000076
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};