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