Clang Project

clang_source_code/test/Analysis/gmalloc.c
1// RUN: %clang_cc1 -analyze -analyzer-checker=core,unix.Malloc -analyzer-store=region -verify %s
2
3#include "Inputs/system-header-simulator.h"
4
5typedef void* gpointer;
6typedef const void* gconstpointer;
7typedef unsigned long gsize;
8typedef unsigned int guint;
9
10gpointer g_malloc(gsize n_bytes);
11gpointer g_malloc0(gsize n_bytes);
12gpointer g_realloc(gpointer mem, gsize n_bytes);
13gpointer g_try_malloc(gsize n_bytes);
14gpointer g_try_malloc0(gsize n_bytes);
15gpointer g_try_realloc(gpointer mem, gsize n_bytes);
16gpointer g_malloc_n(gsize n_blocks, gsize n_block_bytes);
17gpointer g_malloc0_n(gsize n_blocks, gsize n_block_bytes);
18gpointer g_realloc_n(gpointer mem, gsize n_blocks, gsize n_block_bytes);
19gpointer g_try_malloc_n(gsize n_blocks, gsize n_block_bytes);
20gpointer g_try_malloc0_n(gsize n_blocks, gsize n_block_bytes);
21gpointer g_try_realloc_n(gpointer mem, gsize n_blocks, gsize n_block_bytes);
22void g_free(gpointer mem);
23gpointer g_memdup(gconstpointer mem, guint byte_size);
24
25static const gsize n_bytes = 1024;
26
27void 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
46void 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
66void 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
85void 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
105void 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
126void 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
148void 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