blob: 75d06d66c2c3eb870ed0eb7e01d6c80bc1dd51ee [file] [log] [blame]
Ted Kremenekcdc3a892012-08-24 20:39:55 +00001// RUN: %clang_cc1 -analyze -analyzer-checker=core,alpha.deadcode.UnreachableCode,alpha.core.CastSize,unix.Malloc -analyzer-store=region -verify %s
Anna Zaks4b81e742012-03-29 23:26:54 +00002
3typedef __typeof(sizeof(int)) size_t;
4void *malloc(size_t);
5void free(void *);
6void *realloc(void *ptr, size_t size);
7void *calloc(size_t nmemb, size_t size);
Anna Zaks658a2842013-04-02 01:28:24 +00008char *strdup(const char *s);
Jordan Rose5a1ffe92012-09-05 22:55:23 +00009
10void checkThatMallocCheckerIsRunning() {
Jordan Rose63bc1862012-11-15 19:11:43 +000011 malloc(4);
12} // expected-warning{{leak}}
Jordan Rose5a1ffe92012-09-05 22:55:23 +000013
Anna Zaks4b81e742012-03-29 23:26:54 +000014// Test for radar://11110132.
15struct Foo {
16 mutable void* m_data;
17 Foo(void* data) : m_data(data) {}
18};
19Foo aFunction() {
20 return malloc(10);
21}
Anna Zaksaca0ac52012-05-03 23:50:28 +000022
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.
Jordan Rosee2b12462013-05-01 23:10:44 +000027int const_ptr_and_callback_def_param(int, const char*, int n, void(*)(void*) = free);
Anna Zaksaca0ac52012-05-03 23:50:28 +000028void r11160612_3() {
29 char *x = (char*)malloc(12);
30 const_ptr_and_callback_def_param(0, x, 12);
31}
Anna Zaksf132ba82012-05-04 22:18:36 +000032
Jordan Rosee2b12462013-05-01 23:10:44 +000033int const_ptr_and_callback_def_param_null(int, const char*, int n, void(*)(void*) = 0);
34void r11160612_no_callback() {
35 char *x = (char*)malloc(12);
36 const_ptr_and_callback_def_param_null(0, x, 12);
37} // expected-warning{{leak}}
38
Anna Zaksf132ba82012-05-04 22:18:36 +000039// Test member function pointer.
40struct CanFreeMemory {
41 static void myFree(void*);
42};
43//This is handled because we look at the type of the parameter(not argument).
44void r11160612_3(CanFreeMemory* p) {
45 char *x = (char*)malloc(12);
46 const_ptr_and_callback_def_param(0, x, 12, p->myFree);
47}
48
Jordan Rose5a1ffe92012-09-05 22:55:23 +000049
50namespace PR13751 {
51 class OwningVector {
52 void **storage;
53 size_t length;
54 public:
55 OwningVector();
56 ~OwningVector();
57 void push_back(void *Item) {
58 storage[length++] = Item;
59 }
60 };
61
62 void testDestructors() {
63 OwningVector v;
64 v.push_back(malloc(4));
65 // no leak warning; freed in destructor
66 }
67}
68
Anna Zaksb98c6fe2013-02-06 00:01:14 +000069struct X { void *a; };
70
71struct X get() {
72 struct X result;
73 result.a = malloc(4);
74 return result; // no-warning
75}
Anna Zaks658a2842013-04-02 01:28:24 +000076
77// Ensure that regions accessible through a LazyCompoundVal trigger region escape.
78// Malloc checker used to report leaks for the following two test cases.
79struct Property {
80 char* getterName;
81 Property(char* n)
82 : getterName(n) {}
83
84};
85void append(Property x);
86
87void appendWrapper(char *getterName) {
88 append(Property(getterName));
89}
90void foo(const char* name) {
91 char* getterName = strdup(name);
92 appendWrapper(getterName); // no-warning
93}
94
95struct NestedProperty {
96 Property prop;
97 NestedProperty(Property p)
98 : prop(p) {}
99};
100void appendNested(NestedProperty x);
101
102void appendWrapperNested(char *getterName) {
103 appendNested(NestedProperty(Property(getterName)));
104}
105void fooNested(const char* name) {
106 char* getterName = strdup(name);
107 appendWrapperNested(getterName); // no-warning
108}