1 // RUN: %clang_cc1 -analyze -analyzer-checker=core,unix.Malloc -analyzer-store=region -verify %s 2 3 #include "Inputs/system-header-simulator.h" 4 5 typedef void* gpointer; 6 typedef const void* gconstpointer; 7 typedef unsigned long gsize; 8 typedef unsigned int guint; 9 10 gpointer g_malloc(gsize n_bytes); 11 gpointer g_malloc0(gsize n_bytes); 12 gpointer g_realloc(gpointer mem, gsize n_bytes); 13 gpointer g_try_malloc(gsize n_bytes); 14 gpointer g_try_malloc0(gsize n_bytes); 15 gpointer g_try_realloc(gpointer mem, gsize n_bytes); 16 gpointer g_malloc_n(gsize n_blocks, gsize n_block_bytes); 17 gpointer g_malloc0_n(gsize n_blocks, gsize n_block_bytes); 18 gpointer g_realloc_n(gpointer mem, gsize n_blocks, gsize n_block_bytes); 19 gpointer g_try_malloc_n(gsize n_blocks, gsize n_block_bytes); 20 gpointer g_try_malloc0_n(gsize n_blocks, gsize n_block_bytes); 21 gpointer g_try_realloc_n(gpointer mem, gsize n_blocks, gsize n_block_bytes); 22 void g_free(gpointer mem); 23 gpointer g_memdup(gconstpointer mem, guint byte_size); 24 25 static const gsize n_bytes = 1024; 26 27 void f1() { 28 gpointer g1 = g_malloc(n_bytes); 29 gpointer g2 = g_malloc0(n_bytes); 30 g1 = g_realloc(g1, n_bytes * 2); 31 gpointer g3 = g_try_malloc(n_bytes); 32 gpointer g4 = g_try_malloc0(n_bytes); 33 g3 = g_try_realloc(g3, n_bytes * 2); 34 gpointer g5 = g_malloc_n(n_bytes, sizeof(char)); 35 gpointer g6 = g_malloc0_n(n_bytes, sizeof(char)); 36 g5 = g_realloc_n(g5, n_bytes * 2, sizeof(char)); 37 gpointer g7 = g_try_malloc_n(n_bytes, sizeof(char)); 38 gpointer g8 = g_try_malloc0_n(n_bytes, sizeof(char)); 39 g7 = g_try_realloc_n(g7, n_bytes * 2, sizeof(char)); 40 41 g_free(g1); 42 g_free(g2); 43 g_free(g2); // expected-warning{{Attempt to free released memory}} 44 } 45 46 void f2() { 47 gpointer g1 = g_malloc(n_bytes); 48 gpointer g2 = g_malloc0(n_bytes); 49 g1 = g_realloc(g1, n_bytes * 2); 50 gpointer g3 = g_try_malloc(n_bytes); 51 gpointer g4 = g_try_malloc0(n_bytes); 52 g3 = g_try_realloc(g3, n_bytes * 2); 53 gpointer g5 = g_malloc_n(n_bytes, sizeof(char)); 54 gpointer g6 = g_malloc0_n(n_bytes, sizeof(char)); 55 g5 = g_realloc_n(g5, n_bytes * 2, sizeof(char)); 56 gpointer g7 = g_try_malloc_n(n_bytes, sizeof(char)); 57 gpointer g8 = g_try_malloc0_n(n_bytes, sizeof(char)); 58 g7 = g_try_realloc_n(g7, n_bytes * 2, sizeof(char)); 59 60 g_free(g1); 61 g_free(g2); 62 g_free(g3); 63 g3 = g_memdup(g3, n_bytes); // expected-warning{{Use of memory after it is freed}} 64 } 65 66 void f3() { 67 gpointer g1 = g_malloc(n_bytes); 68 gpointer g2 = g_malloc0(n_bytes); 69 g1 = g_realloc(g1, n_bytes * 2); 70 gpointer g3 = g_try_malloc(n_bytes); 71 gpointer g4 = g_try_malloc0(n_bytes); 72 g3 = g_try_realloc(g3, n_bytes * 2); // expected-warning{{Potential leak of memory pointed to by 'g4'}} 73 gpointer g5 = g_malloc_n(n_bytes, sizeof(char)); 74 gpointer g6 = g_malloc0_n(n_bytes, sizeof(char)); 75 g5 = g_realloc_n(g5, n_bytes * 2, sizeof(char)); // expected-warning{{Potential leak of memory pointed to by 'g6'}} 76 gpointer g7 = g_try_malloc_n(n_bytes, sizeof(char)); // expected-warning{{Potential leak of memory pointed to by 'g5'}} 77 gpointer g8 = g_try_malloc0_n(n_bytes, sizeof(char)); 78 g7 = g_try_realloc_n(g7, n_bytes * 2, sizeof(char)); // expected-warning{{Potential leak of memory pointed to by 'g8'}} 79 80 g_free(g1); // expected-warning{{Potential leak of memory pointed to by 'g7'}} 81 g_free(g2); 82 g_free(g3); 83 } 84 85 void f4() { 86 gpointer g1 = g_malloc(n_bytes); 87 gpointer g2 = g_malloc0(n_bytes); 88 g1 = g_realloc(g1, n_bytes * 2); 89 gpointer g3 = g_try_malloc(n_bytes); 90 gpointer g4 = g_try_malloc0(n_bytes); 91 g3 = g_try_realloc(g3, n_bytes * 2); 92 gpointer g5 = g_malloc_n(n_bytes, sizeof(char)); 93 gpointer g6 = g_malloc0_n(n_bytes, sizeof(char)); 94 g5 = g_realloc_n(g5, n_bytes * 2, sizeof(char)); // expected-warning{{Potential leak of memory pointed to by 'g6'}} 95 gpointer g7 = g_try_malloc_n(n_bytes, sizeof(char)); // expected-warning{{Potential leak of memory pointed to by 'g5'}} 96 gpointer g8 = g_try_malloc0_n(n_bytes, sizeof(char)); 97 g7 = g_try_realloc_n(g7, n_bytes * 2, sizeof(char)); // expected-warning{{Potential leak of memory pointed to by 'g8'}} 98 99 g_free(g1); // expected-warning{{Potential leak of memory pointed to by 'g7'}} 100 g_free(g2); 101 g_free(g3); 102 g_free(g4); 103 } 104 105 void f5() { 106 gpointer g1 = g_malloc(n_bytes); 107 gpointer g2 = g_malloc0(n_bytes); 108 g1 = g_realloc(g1, n_bytes * 2); 109 gpointer g3 = g_try_malloc(n_bytes); 110 gpointer g4 = g_try_malloc0(n_bytes); 111 g3 = g_try_realloc(g3, n_bytes * 2); 112 gpointer g5 = g_malloc_n(n_bytes, sizeof(char)); 113 gpointer g6 = g_malloc0_n(n_bytes, sizeof(char)); 114 g5 = g_realloc_n(g5, n_bytes * 2, sizeof(char)); // expected-warning{{Potential leak of memory pointed to by 'g6'}} 115 gpointer g7 = g_try_malloc_n(n_bytes, sizeof(char)); 116 gpointer g8 = g_try_malloc0_n(n_bytes, sizeof(char)); 117 g7 = g_try_realloc_n(g7, n_bytes * 2, sizeof(char)); // expected-warning{{Potential leak of memory pointed to by 'g8'}} 118 119 g_free(g1); // expected-warning{{Potential leak of memory pointed to by 'g7'}} 120 g_free(g2); 121 g_free(g3); 122 g_free(g4); 123 g_free(g5); 124 } 125 126 void f6() { 127 gpointer g1 = g_malloc(n_bytes); 128 gpointer g2 = g_malloc0(n_bytes); 129 g1 = g_realloc(g1, n_bytes * 2); 130 gpointer g3 = g_try_malloc(n_bytes); 131 gpointer g4 = g_try_malloc0(n_bytes); 132 g3 = g_try_realloc(g3, n_bytes * 2); 133 gpointer g5 = g_malloc_n(n_bytes, sizeof(char)); 134 gpointer g6 = g_malloc0_n(n_bytes, sizeof(char)); 135 g5 = g_realloc_n(g5, n_bytes * 2, sizeof(char)); 136 gpointer g7 = g_try_malloc_n(n_bytes, sizeof(char)); 137 gpointer g8 = g_try_malloc0_n(n_bytes, sizeof(char)); 138 g7 = g_try_realloc_n(g7, n_bytes * 2, sizeof(char)); // expected-warning{{Potential leak of memory pointed to by 'g8'}} 139 140 g_free(g1); // expected-warning{{Potential leak of memory pointed to by 'g7'}} 141 g_free(g2); 142 g_free(g3); 143 g_free(g4); 144 g_free(g5); 145 g_free(g6); 146 } 147 148 void f7() { 149 gpointer g1 = g_malloc(n_bytes); 150 gpointer g2 = g_malloc0(n_bytes); 151 g1 = g_realloc(g1, n_bytes * 2); 152 gpointer g3 = g_try_malloc(n_bytes); 153 gpointer g4 = g_try_malloc0(n_bytes); 154 g3 = g_try_realloc(g3, n_bytes * 2); 155 gpointer g5 = g_malloc_n(n_bytes, sizeof(char)); 156 gpointer g6 = g_malloc0_n(n_bytes, sizeof(char)); 157 g5 = g_realloc_n(g5, n_bytes * 2, sizeof(char)); 158 gpointer g7 = g_try_malloc_n(n_bytes, sizeof(char)); 159 gpointer g8 = g_try_malloc0_n(n_bytes, sizeof(char)); 160 g7 = g_try_realloc_n(g7, n_bytes * 2, sizeof(char)); // expected-warning{{Potential leak of memory pointed to by 'g8'}} 161 162 g_free(g1); 163 g_free(g2); 164 g_free(g3); 165 g_free(g4); 166 g_free(g5); 167 g_free(g6); 168 g_free(g7); 169 } 170