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
checkThatMallocCheckerIsRunning()10 void checkThatMallocCheckerIsRunning() {
11 malloc(4);
12 } // expected-warning{{leak}}
13
14 // Test for radar://11110132.
15 struct Foo {
16 mutable void* m_data;
FooFoo17 Foo(void* data) : m_data(data) {}
18 };
aFunction()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);
r11160612_3()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).
r11160612_3(CanFreeMemory * p)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();
push_back(void * Item)51 void push_back(void *Item) {
52 storage[length++] = Item;
53 }
54 };
55
testDestructors()56 void testDestructors() {
57 OwningVector v;
58 v.push_back(malloc(4));
59 // no leak warning; freed in destructor
60 }
61 }
62
63 struct X { void *a; };
64
get()65 struct X get() {
66 struct X result;
67 result.a = malloc(4);
68 return result; // no-warning
69 }
70