• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // RUN: %clang_cc1 -analyze -analyzer-checker=core,unix.Malloc,debug.ExprInspection -analyzer-config c++-inlining=constructors -std=c++11 -verify %s
2 
3 void clang_analyzer_eval(bool);
4 
5 class A {
6   int x;
7 public:
8   A();
9 };
10 
A()11 A::A() : x(0) {
12   clang_analyzer_eval(x == 0); // expected-warning{{TRUE}}
13 }
14 
15 
16 class DirectMember {
17   int x;
18 public:
DirectMember(int value)19   DirectMember(int value) : x(value) {}
20 
getX()21   int getX() { return x; }
22 };
23 
testDirectMember()24 void testDirectMember() {
25   DirectMember obj(3);
26   clang_analyzer_eval(obj.getX() == 3); // expected-warning{{TRUE}}
27 }
28 
29 
30 class IndirectMember {
31   struct {
32     int x;
33   };
34 public:
IndirectMember(int value)35   IndirectMember(int value) : x(value) {}
36 
getX()37   int getX() { return x; }
38 };
39 
testIndirectMember()40 void testIndirectMember() {
41   IndirectMember obj(3);
42   clang_analyzer_eval(obj.getX() == 3); // expected-warning{{TRUE}}
43 }
44 
45 
46 struct DelegatingConstructor {
47   int x;
DelegatingConstructorDelegatingConstructor48   DelegatingConstructor(int y) { x = y; }
DelegatingConstructorDelegatingConstructor49   DelegatingConstructor() : DelegatingConstructor(42) {}
50 };
51 
testDelegatingConstructor()52 void testDelegatingConstructor() {
53   DelegatingConstructor obj;
54   clang_analyzer_eval(obj.x == 42); // expected-warning{{TRUE}}
55 }
56 
57 
58 struct RefWrapper {
RefWrapperRefWrapper59   RefWrapper(int *p) : x(*p) {}
RefWrapperRefWrapper60   RefWrapper(int &r) : x(r) {}
61   int &x;
62 };
63 
testReferenceMember()64 void testReferenceMember() {
65   int *p = 0;
66   RefWrapper X(p); // expected-warning@-7 {{Dereference of null pointer}}
67 }
68 
testReferenceMember2()69 void testReferenceMember2() {
70   int *p = 0;
71   RefWrapper X(*p); // expected-warning {{Forming reference to null pointer}}
72 }
73 
74 
75 extern "C" char *strdup(const char *);
76 
77 class StringWrapper {
78   char *str;
79 public:
StringWrapper(const char * input)80   StringWrapper(const char *input) : str(strdup(input)) {} // no-warning
81 };
82 
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.
87 namespace 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 
Wrapper()105   Wrapper::Wrapper() /* initializers synthesized */ {}
106 
test()107   int test() {
108     Wrapper w;
109     return w.arr[0].value; // no-warning
110   }
111 }
112