dtor.cpp revision 3a0a9e3e8bbaa45f3ca22b1e20b3beaac0f5861e
1// RUN: %clang_cc1 -analyze -analyzer-checker=core,unix.Malloc -analyzer-store region -analyzer-ipa=inlining -cfg-add-implicit-dtors -cfg-add-initializers -verify %s
2
3class A {
4public:
5  ~A() {
6    int *x = 0;
7    *x = 3; // expected-warning{{Dereference of null pointer}}
8  }
9};
10
11int main() {
12  A a;
13}
14
15
16typedef __typeof(sizeof(int)) size_t;
17void *malloc(size_t);
18void free(void *);
19
20class SmartPointer {
21  void *X;
22public:
23  SmartPointer(void *x) : X(x) {}
24  ~SmartPointer() {
25    free(X);
26  }
27};
28
29void testSmartPointer() {
30  char *mem = (char*)malloc(4);
31  {
32    SmartPointer Deleter(mem);
33    // destructor called here
34  }
35  *mem = 0; // expected-warning{{Use of memory after it is freed}}
36}
37
38
39void doSomething();
40void testSmartPointer2() {
41  char *mem = (char*)malloc(4);
42  {
43    SmartPointer Deleter(mem);
44    // Remove dead bindings...
45    doSomething();
46    // destructor called here
47  }
48  *mem = 0; // expected-warning{{Use of memory after it is freed}}
49}
50
51
52class Subclass : public SmartPointer {
53public:
54  Subclass(void *x) : SmartPointer(x) {}
55};
56
57void testSubclassSmartPointer() {
58  char *mem = (char*)malloc(4);
59  {
60    Subclass Deleter(mem);
61    // Remove dead bindings...
62    doSomething();
63    // destructor called here
64  }
65  *mem = 0; // expected-warning{{Use of memory after it is freed}}
66}
67
68
69class MultipleInheritance : public Subclass, public SmartPointer {
70public:
71  MultipleInheritance(void *a, void *b) : Subclass(a), SmartPointer(b) {}
72};
73
74void testMultipleInheritance1() {
75  char *mem = (char*)malloc(4);
76  {
77    MultipleInheritance Deleter(mem, 0);
78    // Remove dead bindings...
79    doSomething();
80    // destructor called here
81  }
82  *mem = 0; // expected-warning{{Use of memory after it is freed}}
83}
84
85void testMultipleInheritance2() {
86  char *mem = (char*)malloc(4);
87  {
88    MultipleInheritance Deleter(0, mem);
89    // Remove dead bindings...
90    doSomething();
91    // destructor called here
92  }
93  *mem = 0; // expected-warning{{Use of memory after it is freed}}
94}
95
96void testMultipleInheritance3() {
97  char *mem = (char*)malloc(4);
98  {
99    MultipleInheritance Deleter(mem, mem);
100    // Remove dead bindings...
101    doSomething();
102    // destructor called here
103    // expected-warning@25 {{Attempt to free released memory}}
104  }
105}
106
107
108class SmartPointerMember {
109  SmartPointer P;
110public:
111  SmartPointerMember(void *x) : P(x) {}
112};
113
114void testSmartPointerMember() {
115  char *mem = (char*)malloc(4);
116  {
117    SmartPointerMember Deleter(mem);
118    // Remove dead bindings...
119    doSomething();
120    // destructor called here
121  }
122  *mem = 0; // expected-warning{{Use of memory after it is freed}}
123}
124