13ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// RUN: %clang_cc1 -analyze -analyzer-checker=core,alpha.deadcode.UnreachableCode,alpha.core.CastSize,unix.Malloc -analyzer-store=region -verify -analyzer-config unix.Malloc:Optimistic=true %s
2231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zakstypedef __typeof(sizeof(int)) size_t;
3231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksvoid *malloc(size_t);
4231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksvoid free(void *);
5231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksvoid *realloc(void *ptr, size_t size);
6231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksvoid *calloc(size_t nmemb, size_t size);
7231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksvoid __attribute((ownership_returns(malloc))) *my_malloc(size_t);
8231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksvoid __attribute((ownership_takes(malloc, 1))) my_free(void *);
9b3d7275c1a4a9f676af850cd661b56c4ad7ef5c9Anna Zaksvoid my_freeBoth(void *, void *)
10b3d7275c1a4a9f676af850cd661b56c4ad7ef5c9Anna Zaks       __attribute((ownership_holds(malloc, 1, 2)));
11231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksvoid __attribute((ownership_returns(malloc, 1))) *my_malloc2(size_t);
12231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksvoid __attribute((ownership_holds(malloc, 1))) my_hold(void *);
13231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks
14231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks// Duplicate attributes are silly, but not an error.
15231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks// Duplicate attribute has no extra effect.
16231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks// If two are of different kinds, that is an error and reported as such.
17231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksvoid __attribute((ownership_holds(malloc, 1)))
18231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks__attribute((ownership_holds(malloc, 1)))
19231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks__attribute((ownership_holds(malloc, 3))) my_hold2(void *, void *, void *);
20231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksvoid *my_malloc3(size_t);
21231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksvoid *myglobalpointer;
22231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksstruct stuff {
23231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  void *somefield;
24231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks};
25231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksstruct stuff myglobalstuff;
26231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks
27231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksvoid f1() {
28231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  int *p = malloc(12);
2968eb4c25e961d18f82b47a0a385f90d7af09bcc3Anna Zaks  return; // expected-warning{{Potential leak of memory pointed to by}}
30231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks}
31231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks
32231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksvoid f2() {
33231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  int *p = malloc(12);
34231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  free(p);
35febdc324faaf1678a4f41497fd691efe54e145c9Anna Zaks  free(p); // expected-warning{{Attempt to free released memory}}
36231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks}
37231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks
38231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksvoid f2_realloc_0() {
39231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  int *p = malloc(12);
40231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  realloc(p,0);
41febdc324faaf1678a4f41497fd691efe54e145c9Anna Zaks  realloc(p,0); // expected-warning{{Attempt to free released memory}}
42231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks}
43231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks
44231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksvoid f2_realloc_1() {
45231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  int *p = malloc(12);
46231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  int *q = realloc(p,0); // no-warning
47231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks}
48231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks
49231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks// ownership attributes tests
50231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksvoid naf1() {
51231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  int *p = my_malloc3(12);
52231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  return; // no-warning
53231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks}
54231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks
55231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksvoid n2af1() {
56231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  int *p = my_malloc2(12);
5768eb4c25e961d18f82b47a0a385f90d7af09bcc3Anna Zaks  return; // expected-warning{{Potential leak of memory pointed to by}}
58231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks}
59231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks
60231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksvoid af1() {
61231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  int *p = my_malloc(12);
6268eb4c25e961d18f82b47a0a385f90d7af09bcc3Anna Zaks  return; // expected-warning{{Potential leak of memory pointed to by}}
63231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks}
64231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks
65231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksvoid af1_b() {
6663bc186d6ac0b44ba4ec6fccb5f471b05c79b666Jordan Rose  int *p = my_malloc(12);
6768eb4c25e961d18f82b47a0a385f90d7af09bcc3Anna Zaks} // expected-warning{{Potential leak of memory pointed to by}}
68231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks
69231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksvoid af1_c() {
70231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  myglobalpointer = my_malloc(12); // no-warning
71231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks}
72231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks
7374f6982232c25ae723b1cc5abc59665a10867f21Jordan Rosevoid af1_d() {
7474f6982232c25ae723b1cc5abc59665a10867f21Jordan Rose  struct stuff mystuff;
7574f6982232c25ae723b1cc5abc59665a10867f21Jordan Rose  mystuff.somefield = my_malloc(12);
7668eb4c25e961d18f82b47a0a385f90d7af09bcc3Anna Zaks} // expected-warning{{Potential leak of memory pointed to by}}
7774f6982232c25ae723b1cc5abc59665a10867f21Jordan Rose
78231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks// Test that we can pass out allocated memory via pointer-to-pointer.
79231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksvoid af1_e(void **pp) {
80231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  *pp = my_malloc(42); // no-warning
81231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks}
82231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks
83231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksvoid af1_f(struct stuff *somestuff) {
84231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  somestuff->somefield = my_malloc(12); // no-warning
85231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks}
86231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks
87231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks// Allocating memory for a field via multiple indirections to our arguments is OK.
88231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksvoid af1_g(struct stuff **pps) {
89231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  *pps = my_malloc(sizeof(struct stuff)); // no-warning
90231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  (*pps)->somefield = my_malloc(42); // no-warning
91231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks}
92231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks
93231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksvoid af2() {
94231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  int *p = my_malloc(12);
95231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  my_free(p);
96febdc324faaf1678a4f41497fd691efe54e145c9Anna Zaks  free(p); // expected-warning{{Attempt to free released memory}}
97231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks}
98231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks
99231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksvoid af2b() {
100231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  int *p = my_malloc(12);
101231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  free(p);
102febdc324faaf1678a4f41497fd691efe54e145c9Anna Zaks  my_free(p); // expected-warning{{Attempt to free released memory}}
103231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks}
104231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks
105231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksvoid af2c() {
106231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  int *p = my_malloc(12);
107231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  free(p);
108febdc324faaf1678a4f41497fd691efe54e145c9Anna Zaks  my_hold(p); // expected-warning{{Attempt to free released memory}}
109231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks}
110231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks
111231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksvoid af2d() {
112231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  int *p = my_malloc(12);
113231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  free(p);
114febdc324faaf1678a4f41497fd691efe54e145c9Anna Zaks  my_hold2(0, 0, p); // expected-warning{{Attempt to free released memory}}
115231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks}
116231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks
117231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks// No leak if malloc returns null.
118231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksvoid af2e() {
119231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  int *p = my_malloc(12);
120231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  if (!p)
121231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks    return; // no-warning
122231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  free(p); // no-warning
123231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks}
124231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks
125050cdd7107526df8ff7a8e0a08b3e99c83c263c0Anna Zaks// This case inflicts a possible double-free.
126231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksvoid af3() {
127231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  int *p = my_malloc(12);
128231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  my_hold(p);
1295b7aa34167f23e6137bd257addac4dd67f612ec4Anna Zaks  free(p); // expected-warning{{Attempt to free non-owned memory}}
130231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks}
131231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks
132231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksint * af4() {
133231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  int *p = my_malloc(12);
134231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  my_free(p);
135febdc324faaf1678a4f41497fd691efe54e145c9Anna Zaks  return p; // expected-warning{{Use of memory after it is freed}}
136231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks}
137231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks
138231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks// This case is (possibly) ok, be conservative
139231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksint * af5() {
140231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  int *p = my_malloc(12);
141231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  my_hold(p);
142231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  return p; // no-warning
143231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks}
144231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks
145231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks
146231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks
147231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks// This case tests that storing malloc'ed memory to a static variable which is
148231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks// then returned is not leaked.  In the absence of known contracts for functions
149231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks// or inter-procedural analysis, this is a conservative answer.
150231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksint *f3() {
151231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  static int *p = 0;
152231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  p = malloc(12);
153231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  return p; // no-warning
154231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks}
155231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks
156231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks// This case tests that storing malloc'ed memory to a static global variable
157231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks// which is then returned is not leaked.  In the absence of known contracts for
158231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks// functions or inter-procedural analysis, this is a conservative answer.
159231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksstatic int *p_f4 = 0;
160231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksint *f4() {
161231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  p_f4 = malloc(12);
162231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  return p_f4; // no-warning
163231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks}
164231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks
165231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksint *f5() {
166231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  int *q = malloc(12);
167231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  q = realloc(q, 20);
168231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  return q; // no-warning
169231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks}
170231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks
171231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksvoid f6() {
172231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  int *p = malloc(12);
173231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  if (!p)
174231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks    return; // no-warning
175231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  else
176231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks    free(p);
177231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks}
178231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks
179231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksvoid f6_realloc() {
180231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  int *p = malloc(12);
181231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  if (!p)
182231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks    return; // no-warning
183231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  else
184231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks    realloc(p,0);
185231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks}
186231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks
187231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks
188231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zakschar *doit2();
189231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksvoid pr6069() {
190231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  char *buf = doit2();
191231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  free(buf);
192231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks}
193231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks
194231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksvoid pr6293() {
195231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  free(0);
196231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks}
197231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks
198231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksvoid f7() {
199231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  char *x = (char*) malloc(4);
200231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  free(x);
201febdc324faaf1678a4f41497fd691efe54e145c9Anna Zaks  x[0] = 'a'; // expected-warning{{Use of memory after it is freed}}
202231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks}
203231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks
204231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksvoid f7_realloc() {
205231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  char *x = (char*) malloc(4);
206231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  realloc(x,0);
207febdc324faaf1678a4f41497fd691efe54e145c9Anna Zaks  x[0] = 'a'; // expected-warning{{Use of memory after it is freed}}
208231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks}
209231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks
210231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksvoid PR6123() {
211c4bac8e376b98d633bb00ee5f510d5e58449753cTed Kremenek  int *x = malloc(11); // expected-warning{{Cast a region whose size is not a multiple of the destination type size}}
212231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks}
213231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks
214231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksvoid PR7217() {
215c4bac8e376b98d633bb00ee5f510d5e58449753cTed Kremenek  int *buf = malloc(2); // expected-warning{{Cast a region whose size is not a multiple of the destination type size}}
216231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  buf[1] = 'c'; // not crash
217231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks}
218231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks
219231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksvoid mallocCastToVoid() {
220231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  void *p = malloc(2);
221231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  const void *cp = p; // not crash
222231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  free(p);
223231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks}
224231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks
225231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksvoid mallocCastToFP() {
226231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  void *p = malloc(2);
227231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  void (*fp)() = p; // not crash
228231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  free(p);
229231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks}
230231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks
231231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks// This tests that malloc() buffers are undefined by default
232231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zakschar mallocGarbage () {
233231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  char *buf = malloc(2);
234231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  char result = buf[1]; // expected-warning{{undefined}}
235231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  free(buf);
236231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  return result;
237231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks}
238231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks
239231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks// This tests that calloc() buffers need to be freed
240231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaksvoid callocNoFree () {
241231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  char *buf = calloc(2,2);
24268eb4c25e961d18f82b47a0a385f90d7af09bcc3Anna Zaks  return; // expected-warning{{Potential leak of memory pointed to by}}
243231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks}
244231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks
245231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks// These test that calloc() buffers are zeroed by default
246231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zakschar callocZeroesGood () {
247231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  char *buf = calloc(2,2);
248231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  char result = buf[3]; // no-warning
249231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  if (buf[1] == 0) {
250231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks    free(buf);
251231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  }
252231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  return result; // no-warning
253231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks}
254231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks
255231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zakschar callocZeroesBad () {
256231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  char *buf = calloc(2,2);
257231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  char result = buf[3]; // no-warning
258231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  if (buf[1] != 0) {
259231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks    free(buf); // expected-warning{{never executed}}
260231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks  }
26168eb4c25e961d18f82b47a0a385f90d7af09bcc3Anna Zaks  return result; // expected-warning{{Potential leak of memory pointed to by}}
262231361ad343d655e4bbb1574ccbb4173b72dadfdAnna Zaks}
263b3d7275c1a4a9f676af850cd661b56c4ad7ef5c9Anna Zaks
264b3d7275c1a4a9f676af850cd661b56c4ad7ef5c9Anna Zaksvoid testMultipleFreeAnnotations() {
265b3d7275c1a4a9f676af850cd661b56c4ad7ef5c9Anna Zaks  int *p = malloc(12);
266b3d7275c1a4a9f676af850cd661b56c4ad7ef5c9Anna Zaks  int *q = malloc(12);
267b3d7275c1a4a9f676af850cd661b56c4ad7ef5c9Anna Zaks  my_freeBoth(p, q);
268b3d7275c1a4a9f676af850cd661b56c4ad7ef5c9Anna Zaks}
269b3d7275c1a4a9f676af850cd661b56c4ad7ef5c9Anna Zaks
270