1 // RUN: %clang_cc1 -analyze -analyzer-checker=core,alpha.deadcode.UnreachableCode,alpha.core.CastSize,unix.Malloc -analyzer-store=region -verify %s 2 3 typedef __typeof(sizeof(int)) size_t; 4 void *malloc(size_t); 5 void free(void *); 6 void *realloc(void *ptr, size_t size); 7 void *calloc(size_t nmemb, size_t size); 8 9 10 void checkThatMallocCheckerIsRunning() { 11 malloc(4); // expected-warning{{leak}} 12 } 13 14 // Test for radar://11110132. 15 struct Foo { 16 mutable void* m_data; 17 Foo(void* data) : m_data(data) {} 18 }; 19 Foo aFunction() { 20 return malloc(10); 21 } 22 23 // Assume that functions which take a function pointer can free memory even if 24 // they are defined in system headers and take the const pointer to the 25 // allocated memory. (radar://11160612) 26 // Test default parameter. 27 int const_ptr_and_callback_def_param(int, const char*, int n, void(*)(void*) = 0); 28 void r11160612_3() { 29 char *x = (char*)malloc(12); 30 const_ptr_and_callback_def_param(0, x, 12); 31 } 32 33 // Test member function pointer. 34 struct CanFreeMemory { 35 static void myFree(void*); 36 }; 37 //This is handled because we look at the type of the parameter(not argument). 38 void r11160612_3(CanFreeMemory* p) { 39 char *x = (char*)malloc(12); 40 const_ptr_and_callback_def_param(0, x, 12, p->myFree); 41 } 42 43 44 namespace PR13751 { 45 class OwningVector { 46 void **storage; 47 size_t length; 48 public: 49 OwningVector(); 50 ~OwningVector(); 51 void push_back(void *Item) { 52 storage[length++] = Item; 53 } 54 }; 55 56 void testDestructors() { 57 OwningVector v; 58 v.push_back(malloc(4)); 59 // no leak warning; freed in destructor 60 } 61 } 62 63