blob: c532d6813f4e0f9c6df51e24c4d176adb5fbb445 [file] [log] [blame]
Anna Zaksadccc3f2012-06-08 00:04:40 +00001// RUN: %clang_cc1 -analyze -analyzer-checker=core,experimental.deadcode.UnreachableCode,experimental.core.CastSize,unix.Malloc,debug.ExprInspection -analyzer-store=region -verify %s
Anna Zaks15d0ae12012-02-11 23:46:36 +00002#include "system-header-simulator.h"
3
Anna Zaksadccc3f2012-06-08 00:04:40 +00004void clang_analyzer_eval(int);
5
Eli Friedman2f005522009-11-14 04:23:25 +00006typedef __typeof(sizeof(int)) size_t;
Ted Kremenekc3607752009-11-13 20:03:22 +00007void *malloc(size_t);
Anna Zaksb16ce452012-02-15 00:11:22 +00008void *valloc(size_t);
Ted Kremenekc3607752009-11-13 20:03:22 +00009void free(void *);
Zhongxing Xud9c84c82009-12-12 12:29:38 +000010void *realloc(void *ptr, size_t size);
Anna Zaks40add292012-02-15 00:11:25 +000011void *reallocf(void *ptr, size_t size);
Zhongxing Xud9c84c82009-12-12 12:29:38 +000012void *calloc(size_t nmemb, size_t size);
Anna Zaks14345182012-05-18 01:16:10 +000013char *strdup(const char *s);
14char *strndup(const char *s, size_t n);
Ted Kremenekdd0e4902010-07-31 01:52:11 +000015
Anna Zaks91c2a112012-02-08 23:16:56 +000016void myfoo(int *p);
17void myfooint(int p);
Anna Zaksebc1d322012-02-15 00:11:28 +000018char *fooRetPtr();
Zhongxing Xufc7ac8f2009-11-13 07:48:11 +000019
20void f1() {
Zhongxing Xuab280992010-05-25 04:59:19 +000021 int *p = malloc(12);
Anna Zaks3d7c44e2012-03-21 19:45:08 +000022 return; // expected-warning{{Memory is never released; potential leak}}
Zhongxing Xufc7ac8f2009-11-13 07:48:11 +000023}
24
Zhongxing Xufc7ac8f2009-11-13 07:48:11 +000025void f2() {
Zhongxing Xuab280992010-05-25 04:59:19 +000026 int *p = malloc(12);
Zhongxing Xufc7ac8f2009-11-13 07:48:11 +000027 free(p);
Anna Zaksfebdc322012-02-16 22:26:12 +000028 free(p); // expected-warning{{Attempt to free released memory}}
Zhongxing Xufc7ac8f2009-11-13 07:48:11 +000029}
Ted Kremenekc764d4b2009-11-13 20:00:28 +000030
Lenny Maiorani4d8d8032011-04-27 14:49:29 +000031void f2_realloc_0() {
32 int *p = malloc(12);
33 realloc(p,0);
Anna Zaksfebdc322012-02-16 22:26:12 +000034 realloc(p,0); // expected-warning{{Attempt to free released memory}}
Lenny Maiorani4d8d8032011-04-27 14:49:29 +000035}
36
37void f2_realloc_1() {
38 int *p = malloc(12);
Zhongxing Xud56763f2011-09-01 04:53:59 +000039 int *q = realloc(p,0); // no-warning
Lenny Maiorani4d8d8032011-04-27 14:49:29 +000040}
41
Anna Zaksc8bb3be2012-02-13 18:05:39 +000042void reallocNotNullPtr(unsigned sizeIn) {
43 unsigned size = 12;
44 char *p = (char*)malloc(size);
45 if (p) {
46 char *q = (char*)realloc(p, sizeIn);
Anna Zaks3d7c44e2012-03-21 19:45:08 +000047 char x = *q; // expected-warning {{Memory is never released; potential leak}}
Anna Zaksc8bb3be2012-02-13 18:05:39 +000048 }
49}
50
51int *realloctest1() {
52 int *q = malloc(12);
53 q = realloc(q, 20);
54 return q; // no warning - returning the allocated value
55}
56
57// p should be freed if realloc fails.
58void reallocFails() {
59 char *p = malloc(12);
60 char *r = realloc(p, 12+1);
61 if (!r) {
62 free(p);
63 } else {
64 free(r);
65 }
66}
67
Anna Zaks30838b92012-02-13 20:57:07 +000068void reallocSizeZero1() {
69 char *p = malloc(12);
70 char *r = realloc(p, 0);
71 if (!r) {
72 free(p);
73 } else {
74 free(r);
75 }
76}
77
78void reallocSizeZero2() {
79 char *p = malloc(12);
80 char *r = realloc(p, 0);
81 if (!r) {
82 free(p);
83 } else {
84 free(r);
85 }
Anna Zaksfebdc322012-02-16 22:26:12 +000086 free(p); // expected-warning {{Attempt to free released memory}}
Anna Zaks30838b92012-02-13 20:57:07 +000087}
88
89void reallocSizeZero3() {
90 char *p = malloc(12);
91 char *r = realloc(p, 0);
92 free(r);
93}
94
95void reallocSizeZero4() {
96 char *r = realloc(0, 0);
97 free(r);
98}
99
100void reallocSizeZero5() {
101 char *r = realloc(0, 0);
102}
103
104void reallocPtrZero1() {
Anna Zaks3d7c44e2012-03-21 19:45:08 +0000105 char *r = realloc(0, 12); // expected-warning {{Memory is never released; potential leak}}
Anna Zaks30838b92012-02-13 20:57:07 +0000106}
107
108void reallocPtrZero2() {
109 char *r = realloc(0, 12);
110 if (r)
111 free(r);
112}
113
114void reallocPtrZero3() {
115 char *r = realloc(0, 12);
116 free(r);
117}
118
Anna Zaksb276bd92012-02-14 00:26:13 +0000119void reallocRadar6337483_1() {
120 char *buf = malloc(100);
121 buf = (char*)realloc(buf, 0x1000000);
122 if (!buf) {
Anna Zaks3d7c44e2012-03-21 19:45:08 +0000123 return;// expected-warning {{Memory is never released; potential leak}}
Anna Zaksb276bd92012-02-14 00:26:13 +0000124 }
125 free(buf);
126}
127
128void reallocRadar6337483_2() {
129 char *buf = malloc(100);
130 char *buf2 = (char*)realloc(buf, 0x1000000);
Anna Zaks3d7c44e2012-03-21 19:45:08 +0000131 if (!buf2) { // expected-warning {{Memory is never released; potential leak}}
Anna Zaksb276bd92012-02-14 00:26:13 +0000132 ;
133 } else {
134 free(buf2);
135 }
136}
137
138void reallocRadar6337483_3() {
139 char * buf = malloc(100);
140 char * tmp;
141 tmp = (char*)realloc(buf, 0x1000000);
142 if (!tmp) {
143 free(buf);
144 return;
145 }
146 buf = tmp;
147 free(buf);
148}
149
150void reallocRadar6337483_4() {
151 char *buf = malloc(100);
152 char *buf2 = (char*)realloc(buf, 0x1000000);
153 if (!buf2) {
Anna Zaks3d7c44e2012-03-21 19:45:08 +0000154 return; // expected-warning {{Memory is never released; potential leak}}
Anna Zaksb276bd92012-02-14 00:26:13 +0000155 } else {
156 free(buf2);
157 }
158}
159
Anna Zaks40add292012-02-15 00:11:25 +0000160int *reallocfTest1() {
161 int *q = malloc(12);
162 q = reallocf(q, 20);
163 return q; // no warning - returning the allocated value
164}
165
166void reallocfRadar6337483_4() {
167 char *buf = malloc(100);
168 char *buf2 = (char*)reallocf(buf, 0x1000000);
169 if (!buf2) {
170 return; // no warning - reallocf frees even on failure
171 } else {
172 free(buf2);
173 }
174}
175
176void reallocfRadar6337483_3() {
177 char * buf = malloc(100);
178 char * tmp;
179 tmp = (char*)reallocf(buf, 0x1000000);
180 if (!tmp) {
Anna Zaksfebdc322012-02-16 22:26:12 +0000181 free(buf); // expected-warning {{Attempt to free released memory}}
Anna Zaks40add292012-02-15 00:11:25 +0000182 return;
183 }
184 buf = tmp;
185 free(buf);
186}
187
188void reallocfPtrZero1() {
Anna Zaks3d7c44e2012-03-21 19:45:08 +0000189 char *r = reallocf(0, 12); // expected-warning {{Memory is never released; potential leak}}
Anna Zaks40add292012-02-15 00:11:25 +0000190}
191
192
Zhongxing Xu243fde92009-11-17 07:54:15 +0000193// This case tests that storing malloc'ed memory to a static variable which is
194// then returned is not leaked. In the absence of known contracts for functions
195// or inter-procedural analysis, this is a conservative answer.
Ted Kremenekc764d4b2009-11-13 20:00:28 +0000196int *f3() {
197 static int *p = 0;
Zhongxing Xuab280992010-05-25 04:59:19 +0000198 p = malloc(12);
Zhongxing Xu4985e3e2009-11-17 08:58:18 +0000199 return p; // no-warning
Ted Kremenekc764d4b2009-11-13 20:00:28 +0000200}
201
Zhongxing Xu243fde92009-11-17 07:54:15 +0000202// This case tests that storing malloc'ed memory to a static global variable
203// which is then returned is not leaked. In the absence of known contracts for
204// functions or inter-procedural analysis, this is a conservative answer.
Ted Kremenekc764d4b2009-11-13 20:00:28 +0000205static int *p_f4 = 0;
206int *f4() {
Zhongxing Xuab280992010-05-25 04:59:19 +0000207 p_f4 = malloc(12);
Zhongxing Xu4985e3e2009-11-17 08:58:18 +0000208 return p_f4; // no-warning
Ted Kremenekc764d4b2009-11-13 20:00:28 +0000209}
Zhongxing Xud9c84c82009-12-12 12:29:38 +0000210
211int *f5() {
Zhongxing Xuab280992010-05-25 04:59:19 +0000212 int *q = malloc(12);
Zhongxing Xud9c84c82009-12-12 12:29:38 +0000213 q = realloc(q, 20);
214 return q; // no-warning
215}
Zhongxing Xub94b81a2009-12-31 06:13:07 +0000216
217void f6() {
Zhongxing Xuab280992010-05-25 04:59:19 +0000218 int *p = malloc(12);
Zhongxing Xub94b81a2009-12-31 06:13:07 +0000219 if (!p)
220 return; // no-warning
221 else
222 free(p);
223}
Zhongxing Xu425c7ed2010-01-18 04:01:40 +0000224
Lenny Maiorani4d8d8032011-04-27 14:49:29 +0000225void f6_realloc() {
226 int *p = malloc(12);
227 if (!p)
228 return; // no-warning
229 else
230 realloc(p,0);
231}
232
233
Zhongxing Xu425c7ed2010-01-18 04:01:40 +0000234char *doit2();
235void pr6069() {
236 char *buf = doit2();
237 free(buf);
238}
Zhongxing Xu181cc3d2010-02-14 06:49:48 +0000239
240void pr6293() {
241 free(0);
242}
Zhongxing Xuc8023782010-03-10 04:58:55 +0000243
244void f7() {
245 char *x = (char*) malloc(4);
246 free(x);
Anna Zaksfebdc322012-02-16 22:26:12 +0000247 x[0] = 'a'; // expected-warning{{Use of memory after it is freed}}
Zhongxing Xuc8023782010-03-10 04:58:55 +0000248}
Zhongxing Xuab280992010-05-25 04:59:19 +0000249
Anna Zaks14345182012-05-18 01:16:10 +0000250void f8() {
251 char *x = (char*) malloc(4);
252 free(x);
253 char *y = strndup(x, 4); // expected-warning{{Use of memory after it is freed}}
254}
255
Lenny Maiorani4d8d8032011-04-27 14:49:29 +0000256void f7_realloc() {
257 char *x = (char*) malloc(4);
258 realloc(x,0);
Anna Zaksfebdc322012-02-16 22:26:12 +0000259 x[0] = 'a'; // expected-warning{{Use of memory after it is freed}}
Lenny Maiorani4d8d8032011-04-27 14:49:29 +0000260}
261
Zhongxing Xuab280992010-05-25 04:59:19 +0000262void PR6123() {
263 int *x = malloc(11); // expected-warning{{Cast a region whose size is not a multiple of the destination type size.}}
264}
265
266void PR7217() {
267 int *buf = malloc(2); // expected-warning{{Cast a region whose size is not a multiple of the destination type size.}}
268 buf[1] = 'c'; // not crash
Zhongxing Xuab280992010-05-25 04:59:19 +0000269}
Jordy Rosec580f2e2010-06-20 04:30:57 +0000270
271void mallocCastToVoid() {
272 void *p = malloc(2);
273 const void *cp = p; // not crash
274 free(p);
275}
276
277void mallocCastToFP() {
278 void *p = malloc(2);
279 void (*fp)() = p; // not crash
280 free(p);
281}
282
Zhongxing Xua5ce9662010-06-01 03:01:33 +0000283// This tests that malloc() buffers are undefined by default
284char mallocGarbage () {
285 char *buf = malloc(2);
286 char result = buf[1]; // expected-warning{{undefined}}
287 free(buf);
288 return result;
289}
290
291// This tests that calloc() buffers need to be freed
292void callocNoFree () {
293 char *buf = calloc(2,2);
294 return; // expected-warning{{never released}}
295}
296
297// These test that calloc() buffers are zeroed by default
298char callocZeroesGood () {
299 char *buf = calloc(2,2);
300 char result = buf[3]; // no-warning
301 if (buf[1] == 0) {
302 free(buf);
303 }
304 return result; // no-warning
305}
306
307char callocZeroesBad () {
308 char *buf = calloc(2,2);
309 char result = buf[3]; // no-warning
310 if (buf[1] != 0) {
Tom Carec4b5bd82010-07-23 23:04:53 +0000311 free(buf); // expected-warning{{never executed}}
Zhongxing Xua5ce9662010-06-01 03:01:33 +0000312 }
313 return result; // expected-warning{{never released}}
314}
Anna Zaks91c2a112012-02-08 23:16:56 +0000315
316void nullFree() {
317 int *p = 0;
318 free(p); // no warning - a nop
319}
320
321void paramFree(int *p) {
322 myfoo(p);
323 free(p); // no warning
324 myfoo(p); // TODO: This should be a warning.
325}
326
327int* mallocEscapeRet() {
328 int *p = malloc(12);
329 return p; // no warning
330}
331
332void mallocEscapeFoo() {
333 int *p = malloc(12);
334 myfoo(p);
335 return; // no warning
336}
337
338void mallocEscapeFree() {
339 int *p = malloc(12);
340 myfoo(p);
341 free(p);
342}
343
344void mallocEscapeFreeFree() {
345 int *p = malloc(12);
346 myfoo(p);
347 free(p);
Anna Zaksfebdc322012-02-16 22:26:12 +0000348 free(p); // expected-warning{{Attempt to free released memory}}
Anna Zaks91c2a112012-02-08 23:16:56 +0000349}
350
351void mallocEscapeFreeUse() {
352 int *p = malloc(12);
353 myfoo(p);
354 free(p);
Anna Zaksfebdc322012-02-16 22:26:12 +0000355 myfoo(p); // expected-warning{{Use of memory after it is freed}}
Anna Zaks91c2a112012-02-08 23:16:56 +0000356}
357
358int *myalloc();
359void myalloc2(int **p);
360
361void mallocEscapeFreeCustomAlloc() {
362 int *p = malloc(12);
363 myfoo(p);
364 free(p);
365 p = myalloc();
366 free(p); // no warning
367}
368
369void mallocEscapeFreeCustomAlloc2() {
370 int *p = malloc(12);
371 myfoo(p);
372 free(p);
373 myalloc2(&p);
374 free(p); // no warning
375}
376
377void mallocBindFreeUse() {
378 int *x = malloc(12);
379 int *y = x;
380 free(y);
Anna Zaksfebdc322012-02-16 22:26:12 +0000381 myfoo(x); // expected-warning{{Use of memory after it is freed}}
Anna Zaks91c2a112012-02-08 23:16:56 +0000382}
383
384void mallocEscapeMalloc() {
385 int *p = malloc(12);
386 myfoo(p);
Anna Zaks3d7c44e2012-03-21 19:45:08 +0000387 p = malloc(12); // expected-warning{{Memory is never released; potential leak}}
Anna Zaks91c2a112012-02-08 23:16:56 +0000388}
389
390void mallocMalloc() {
391 int *p = malloc(12);
Anna Zaks3d7c44e2012-03-21 19:45:08 +0000392 p = malloc(12); // expected-warning 2 {{Memory is never released; potential leak}}
Anna Zaks91c2a112012-02-08 23:16:56 +0000393}
394
395void mallocFreeMalloc() {
396 int *p = malloc(12);
397 free(p);
398 p = malloc(12);
399 free(p);
400}
401
Anna Zakscdfec5e2012-02-09 06:25:47 +0000402void mallocFreeUse_params() {
Anna Zaks91c2a112012-02-08 23:16:56 +0000403 int *p = malloc(12);
404 free(p);
Anna Zaksfebdc322012-02-16 22:26:12 +0000405 myfoo(p); //expected-warning{{Use of memory after it is freed}}
Anna Zaks15d0ae12012-02-11 23:46:36 +0000406}
407
408void mallocFreeUse_params2() {
409 int *p = malloc(12);
410 free(p);
Anna Zaksfebdc322012-02-16 22:26:12 +0000411 myfooint(*p); //expected-warning{{Use of memory after it is freed}}
Anna Zaks91c2a112012-02-08 23:16:56 +0000412}
413
Anna Zaksff3b9fd2012-02-09 06:25:51 +0000414void mallocFailedOrNot() {
415 int *p = malloc(12);
416 if (!p)
417 free(p);
418 else
419 free(p);
420}
421
Anna Zakse9ef5622012-02-10 01:11:00 +0000422struct StructWithInt {
423 int g;
424};
Anna Zaks0860cd02012-02-11 21:44:39 +0000425
426int *mallocReturnFreed() {
427 int *p = malloc(12);
428 free(p);
Anna Zaksfebdc322012-02-16 22:26:12 +0000429 return p; // expected-warning {{Use of memory after it is freed}}
Anna Zaks0860cd02012-02-11 21:44:39 +0000430}
431
432int useAfterFreeStruct() {
433 struct StructWithInt *px= malloc(sizeof(struct StructWithInt));
434 px->g = 5;
435 free(px);
Anna Zaksfebdc322012-02-16 22:26:12 +0000436 return px->g; // expected-warning {{Use of memory after it is freed}}
Anna Zaks0860cd02012-02-11 21:44:39 +0000437}
438
Anna Zakse9ef5622012-02-10 01:11:00 +0000439void nonSymbolAsFirstArg(int *pp, struct StructWithInt *p);
440
441void mallocEscapeFooNonSymbolArg() {
442 struct StructWithInt *p = malloc(sizeof(struct StructWithInt));
443 nonSymbolAsFirstArg(&p->g, p);
444 return; // no warning
445}
446
Anna Zaks4fb54872012-02-11 21:02:35 +0000447void mallocFailedOrNotLeak() {
448 int *p = malloc(12);
449 if (p == 0)
450 return; // no warning
451 else
Anna Zaks3d7c44e2012-03-21 19:45:08 +0000452 return; // expected-warning {{Memory is never released; potential leak}}
Anna Zaks4fb54872012-02-11 21:02:35 +0000453}
Anna Zakse9ef5622012-02-10 01:11:00 +0000454
Anna Zaksebc1d322012-02-15 00:11:28 +0000455void mallocAssignment() {
456 char *p = malloc(12);
457 p = fooRetPtr(); // expected-warning {{leak}}
458}
459
Anna Zaksb16ce452012-02-15 00:11:22 +0000460int vallocTest() {
461 char *mem = valloc(12);
Anna Zaks3d7c44e2012-03-21 19:45:08 +0000462 return 0; // expected-warning {{Memory is never released; potential leak}}
Anna Zaksb16ce452012-02-15 00:11:22 +0000463}
464
465void vallocEscapeFreeUse() {
466 int *p = valloc(12);
467 myfoo(p);
468 free(p);
Anna Zaksfebdc322012-02-16 22:26:12 +0000469 myfoo(p); // expected-warning{{Use of memory after it is freed}}
Anna Zaksb16ce452012-02-15 00:11:22 +0000470}
471
Anna Zakscdfec5e2012-02-09 06:25:47 +0000472int *Gl;
473struct GlStTy {
474 int *x;
475};
476
477struct GlStTy GlS = {0};
478
479void GlobalFree() {
480 free(Gl);
481}
482
483void GlobalMalloc() {
484 Gl = malloc(12);
485}
486
487void GlobalStructMalloc() {
488 int *a = malloc(12);
489 GlS.x = a;
490}
491
492void GlobalStructMallocFree() {
493 int *a = malloc(12);
494 GlS.x = a;
495 free(GlS.x);
496}
Anna Zaksf8b1c312012-02-10 01:11:03 +0000497
Anna Zaksad901a62012-02-16 22:26:15 +0000498char *ArrayG[12];
499
500void globalArrayTest() {
501 char *p = (char*)malloc(12);
502 ArrayG[0] = p;
503}
504
Anna Zaksac593002012-02-16 03:40:57 +0000505// Make sure that we properly handle a pointer stored into a local struct/array.
506typedef struct _StructWithPtr {
507 int *memP;
508} StructWithPtr;
509
510static StructWithPtr arrOfStructs[10];
511
512void testMalloc() {
513 int *x = malloc(12);
514 StructWithPtr St;
515 St.memP = x;
516 arrOfStructs[0] = St;
517}
518
519StructWithPtr testMalloc2() {
520 int *x = malloc(12);
521 StructWithPtr St;
522 St.memP = x;
523 return St;
524}
525
526int *testMalloc3() {
527 int *x = malloc(12);
528 int *y = x;
529 return y;
530}
531
Anna Zaksd8a8a3b2012-02-17 22:35:34 +0000532void testElemRegion1() {
533 char *x = (void*)malloc(2);
534 int *ix = (int*)x;
535 free(&(x[0]));
536}
537
538void testElemRegion2(int **pp) {
539 int *p = malloc(12);
540 *pp = p;
541 free(pp[0]);
542}
543
544void testElemRegion3(int **pp) {
545 int *p = malloc(12);
546 *pp = p;
547 free(*pp);
548}
Anna Zaks4fb54872012-02-11 21:02:35 +0000549// Region escape testing.
550
551unsigned takePtrToPtr(int **p);
552void PassTheAddrOfAllocatedData(int f) {
553 int *p = malloc(12);
554 // We don't know what happens after the call. Should stop tracking here.
555 if (takePtrToPtr(&p))
556 f++;
557 free(p); // no warning
558}
559
560struct X {
561 int *p;
562};
563unsigned takePtrToStruct(struct X *s);
564int ** foo2(int *g, int f) {
565 int *p = malloc(12);
566 struct X *px= malloc(sizeof(struct X));
567 px->p = p;
568 // We don't know what happens after this call. Should not track px nor p.
569 if (takePtrToStruct(px))
570 f++;
571 free(p);
572 return 0;
573}
574
575struct X* RegInvalidationDetect1(struct X *s2) {
576 struct X *px= malloc(sizeof(struct X));
577 px->p = 0;
578 px = s2;
Anna Zaks3d7c44e2012-03-21 19:45:08 +0000579 return px; // expected-warning {{Memory is never released; potential leak}}
Anna Zaks4fb54872012-02-11 21:02:35 +0000580}
581
582struct X* RegInvalidationGiveUp1() {
583 int *p = malloc(12);
584 struct X *px= malloc(sizeof(struct X));
585 px->p = p;
586 return px;
587}
588
589int **RegInvalidationDetect2(int **pp) {
590 int *p = malloc(12);
591 pp = &p;
592 pp++;
Anna Zaks3d7c44e2012-03-21 19:45:08 +0000593 return 0;// expected-warning {{Memory is never released; potential leak}}
Anna Zaks4fb54872012-02-11 21:02:35 +0000594}
Anna Zaksf8b1c312012-02-10 01:11:03 +0000595
Anna Zaksf8b1c312012-02-10 01:11:03 +0000596extern void exit(int) __attribute__ ((__noreturn__));
597void mallocExit(int *g) {
598 struct xx *p = malloc(12);
Anna Zaksda046772012-02-11 21:02:40 +0000599 if (g != 0)
600 exit(1);
Anna Zaksf8b1c312012-02-10 01:11:03 +0000601 free(p);
602 return;
603}
604
Anna Zaksf8b1c312012-02-10 01:11:03 +0000605extern void __assert_fail (__const char *__assertion, __const char *__file,
606 unsigned int __line, __const char *__function)
607 __attribute__ ((__noreturn__));
608#define assert(expr) \
609 ((expr) ? (void)(0) : __assert_fail (#expr, __FILE__, __LINE__, __func__))
610void mallocAssert(int *g) {
611 struct xx *p = malloc(12);
612
Anna Zaksda046772012-02-11 21:02:40 +0000613 assert(g != 0);
Anna Zaksf8b1c312012-02-10 01:11:03 +0000614 free(p);
615 return;
616}
617
Anna Zaks15d0ae12012-02-11 23:46:36 +0000618void doNotInvalidateWhenPassedToSystemCalls(char *s) {
619 char *p = malloc(12);
620 strlen(p);
621 strcpy(p, s); // expected-warning {{leak}}
622}
623
Anna Zaksf0dfc9c2012-02-17 22:35:31 +0000624// Rely on the CString checker evaluation of the strcpy API to convey that the result of strcpy is equal to p.
625void symbolLostWithStrcpy(char *s) {
626 char *p = malloc(12);
627 p = strcpy(p, s);
628 free(p);
629}
630
631
632// The same test as the one above, but with what is actually generated on a mac.
633static __inline char *
634__inline_strcpy_chk (char *restrict __dest, const char *restrict __src)
635{
636 return __builtin___strcpy_chk (__dest, __src, __builtin_object_size (__dest, 2 > 1));
637}
638
639void symbolLostWithStrcpy_InlineStrcpyVersion(char *s) {
640 char *p = malloc(12);
641 p = ((__builtin_object_size (p, 0) != (size_t) -1) ? __builtin___strcpy_chk (p, s, __builtin_object_size (p, 2 > 1)) : __inline_strcpy_chk (p, s));
642 free(p);
643}
Anna Zaksd9ab7bb2012-02-22 02:36:01 +0000644
645// Here we are returning a pointer one past the allocated value. An idiom which
646// can be used for implementing special malloc. The correct uses of this might
647// be rare enough so that we could keep this as a warning.
648static void *specialMalloc(int n){
649 int *p;
650 p = malloc( n+8 );
651 if( p ){
652 p[0] = n;
653 p++;
654 }
655 return p;
656}
657
658// Potentially, the user could free the struct by performing pointer arithmetic on the return value.
659// This is a variation of the specialMalloc issue, though probably would be more rare in correct code.
660int *specialMallocWithStruct() {
661 struct StructWithInt *px= malloc(sizeof(struct StructWithInt));
662 return &(px->g);
663}
664
Anna Zaks60a1fa42012-02-22 03:14:20 +0000665// Test various allocation/deallocation functions.
Anna Zaks60a1fa42012-02-22 03:14:20 +0000666void testStrdup(const char *s, unsigned validIndex) {
667 char *s2 = strdup(s);
Anna Zaks3d7c44e2012-03-21 19:45:08 +0000668 s2[validIndex + 1] = 'b';// expected-warning {{Memory is never released; potential leak}}
Anna Zaks60a1fa42012-02-22 03:14:20 +0000669}
670
671int testStrndup(const char *s, unsigned validIndex, unsigned size) {
672 char *s2 = strndup(s, size);
673 s2 [validIndex + 1] = 'b';
674 if (s2[validIndex] != 'a')
Anna Zaksca8e36e2012-02-23 21:38:21 +0000675 return 0;
Anna Zaks60a1fa42012-02-22 03:14:20 +0000676 else
Anna Zaks3d7c44e2012-03-21 19:45:08 +0000677 return 1;// expected-warning {{Memory is never released; potential leak}}
Anna Zaks60a1fa42012-02-22 03:14:20 +0000678}
679
Anna Zaks87cb5be2012-02-22 19:24:52 +0000680void testStrdupContentIsDefined(const char *s, unsigned validIndex) {
681 char *s2 = strdup(s);
682 char result = s2[1];// no warning
683 free(s2);
684}
685
Anna Zaksca23eb22012-02-29 18:42:47 +0000686// ----------------------------------------------------------------------------
Anna Zaks0d389b82012-02-23 01:05:27 +0000687// Test the system library functions to which the pointer can escape.
Anna Zaksca23eb22012-02-29 18:42:47 +0000688// This tests false positive suppression.
Anna Zaks0d389b82012-02-23 01:05:27 +0000689
690// For now, we assume memory passed to pthread_specific escapes.
691// TODO: We could check that if a new pthread binding is set, the existing
692// binding must be freed; otherwise, a memory leak can occur.
693void testPthereadSpecificEscape(pthread_key_t key) {
694 void *buf = malloc(12);
695 pthread_setspecific(key, buf); // no warning
696}
697
Anna Zaksca23eb22012-02-29 18:42:47 +0000698// PR12101: Test funopen().
699static int releasePtr(void *_ctx) {
700 free(_ctx);
701 return 0;
702}
703FILE *useFunOpen() {
704 void *ctx = malloc(sizeof(int));
705 FILE *f = funopen(ctx, 0, 0, 0, releasePtr); // no warning
706 if (f == 0) {
707 free(ctx);
708 }
709 return f;
710}
711FILE *useFunOpenNoReleaseFunction() {
712 void *ctx = malloc(sizeof(int));
713 FILE *f = funopen(ctx, 0, 0, 0, 0);
714 if (f == 0) {
715 free(ctx);
716 }
717 return f; // expected-warning{{leak}}
718}
719
720// Test setbuf, setvbuf.
721int my_main_no_warning() {
722 char *p = malloc(100);
723 setvbuf(stdout, p, 0, 100);
724 return 0;
725}
726int my_main_no_warning2() {
727 char *p = malloc(100);
728 setbuf(__stdoutp, p);
729 return 0;
730}
731int my_main_warn(FILE *f) {
732 char *p = malloc(100);
733 setvbuf(f, p, 0, 100);
734 return 0;// expected-warning {{leak}}
735}
736
Ted Kremeneka99f8742012-03-05 23:06:19 +0000737// <rdar://problem/10978247>.
738// some people use stack allocated memory as an optimization to avoid
739// a heap allocation for small work sizes. This tests the analyzer's
740// understanding that the malloc'ed memory is not the same as stackBuffer.
741void radar10978247(int myValueSize) {
742 char stackBuffer[128];
743 char *buffer;
744
745 if (myValueSize <= sizeof(stackBuffer))
746 buffer = stackBuffer;
747 else
748 buffer = malloc(myValueSize);
749
750 // do stuff with the buffer
751 if (buffer != stackBuffer)
752 free(buffer);
753}
754
755void radar10978247_positive(int myValueSize) {
756 char stackBuffer[128];
757 char *buffer;
758
759 if (myValueSize <= sizeof(stackBuffer))
760 buffer = stackBuffer;
761 else
762 buffer = malloc(myValueSize);
763
764 // do stuff with the buffer
765 if (buffer == stackBuffer) // expected-warning {{leak}}
766 return;
767}
768
Ted Kremenek8f40afb2012-04-26 05:08:26 +0000769// <rdar://problem/11269741> Previously this triggered a false positive
770// because malloc() is known to return uninitialized memory and the binding
771// of 'o' to 'p->n' was not getting propertly handled. Now we report a leak.
772struct rdar11269741_a_t {
773 struct rdar11269741_b_t {
774 int m;
775 } n;
776};
777
778int rdar11269741(struct rdar11269741_b_t o)
779{
780 struct rdar11269741_a_t *p = (struct rdar11269741_a_t *) malloc(sizeof(*p));
781 p->n = o;
782 return p->n.m; // expected-warning {{leak}}
783}
784
Anna Zakse55a14a2012-05-03 02:13:56 +0000785// Pointer arithmetic, returning an ElementRegion.
786void *radar11329382(unsigned bl) {
787 void *ptr = malloc (16);
788 ptr = ptr + (2 - bl);
789 return ptr; // no warning
790}
791
Anna Zaks33e4a1d2012-05-01 21:10:29 +0000792void __assert_rtn(const char *, const char *, int, const char *) __attribute__((__noreturn__));
793int strcmp(const char *, const char *);
794char *a (void);
795void radar11270219(void) {
796 char *x = a(), *y = a();
797 (__builtin_expect(!(x && y), 0) ? __assert_rtn(__func__, "/Users/zaks/tmp/ex.c", 24, "x && y") : (void)0);
798 strcmp(x, y); // no warning
799}
800
Anna Zaks93c5a242012-05-02 00:05:20 +0000801void radar_11358224_test_double_assign_ints_positive_2()
802{
803 void *ptr = malloc(16);
804 ptr = ptr; // expected-warning {{leak}}
805}
806
Anna Zaksaca0ac52012-05-03 23:50:28 +0000807// Assume that functions which take a function pointer can free memory even if
808// they are defined in system headers and take the const pointer to the
809// allocated memory. (radar://11160612)
810int const_ptr_and_callback(int, const char*, int n, void(*)(void*));
811void r11160612_1() {
812 char *x = malloc(12);
813 const_ptr_and_callback(0, x, 12, free); // no - warning
814}
815
816// Null is passed as callback.
817void r11160612_2() {
818 char *x = malloc(12);
819 const_ptr_and_callback(0, x, 12, 0); // expected-warning {{leak}}
820}
821
822// Callback is passed to a function defined in a system header.
823void r11160612_4() {
824 char *x = malloc(12);
825 sqlite3_bind_text_my(0, x, 12, free); // no - warning
826}
827
Anna Zaksb79d8622012-05-03 23:50:33 +0000828// Passing callbacks in a struct.
829void r11160612_5(StWithCallback St) {
830 void *x = malloc(12);
831 dealocateMemWhenDoneByVal(x, St);
832}
833void r11160612_6(StWithCallback St) {
834 void *x = malloc(12);
835 dealocateMemWhenDoneByRef(&St, x);
836}
837
Anna Zaks84d43842012-05-04 17:37:16 +0000838int mySub(int, int);
839int myAdd(int, int);
840int fPtr(unsigned cond, int x) {
841 return (cond ? mySub : myAdd)(x, x);
842}
843
Anna Zakse17fdb22012-06-07 03:57:32 +0000844// Test anti-aliasing.
Anna Zaksda046772012-02-11 21:02:40 +0000845
Anna Zaksf8b1c312012-02-10 01:11:03 +0000846void dependsOnValueOfPtr(int *g, unsigned f) {
847 int *p;
848
849 if (f) {
850 p = g;
851 } else {
852 p = malloc(12);
853 }
854
855 if (p != g)
856 free(p);
857 else
Anna Zakse17fdb22012-06-07 03:57:32 +0000858 return; // no warning
Anna Zaksf8b1c312012-02-10 01:11:03 +0000859 return;
860}
861
Anna Zakse17fdb22012-06-07 03:57:32 +0000862int CMPRegionHeapToStack() {
863 int x = 0;
864 int *x1 = malloc(8);
865 int *x2 = &x;
Anna Zaksadccc3f2012-06-08 00:04:40 +0000866 clang_analyzer_eval(x1 == x2); // expected-warning{{FALSE}}
Anna Zakse17fdb22012-06-07 03:57:32 +0000867 free(x1);
868 return x;
869}
870
871int CMPRegionHeapToHeap2() {
872 int x = 0;
873 int *x1 = malloc(8);
874 int *x2 = malloc(8);
875 int *x4 = x1;
876 int *x5 = x2;
Anna Zaksadccc3f2012-06-08 00:04:40 +0000877 clang_analyzer_eval(x4 == x5); // expected-warning{{FALSE}}
Anna Zakse17fdb22012-06-07 03:57:32 +0000878 free(x1);
879 free(x2);
880 return x;
881}
882
883int CMPRegionHeapToHeap() {
884 int x = 0;
885 int *x1 = malloc(8);
886 int *x4 = x1;
887 if (x1 == x4) {
888 free(x1);
889 return 5/x; // expected-warning{{Division by zero}}
890 }
891 return x;// expected-warning{{This statement is never executed}}
892}
893
894int HeapAssignment() {
895 int m = 0;
896 int *x = malloc(4);
897 int *y = x;
898 *x = 5;
Anna Zaksadccc3f2012-06-08 00:04:40 +0000899 clang_analyzer_eval(*x != *y); // expected-warning{{FALSE}}
Anna Zakse17fdb22012-06-07 03:57:32 +0000900 free(x);
901 return 0;
902}
903
Anna Zaks783f0082012-06-07 20:18:08 +0000904int *retPtr();
905int *retPtrMightAlias(int *x);
906int cmpHeapAllocationToUnknown() {
907 int zero = 0;
908 int *yBefore = retPtr();
909 int *m = malloc(8);
910 int *yAfter = retPtrMightAlias(m);
Anna Zaksadccc3f2012-06-08 00:04:40 +0000911 clang_analyzer_eval(yBefore == m); // expected-warning{{FALSE}}
912 clang_analyzer_eval(yAfter == m); // expected-warning{{FALSE}}
Anna Zaks783f0082012-06-07 20:18:08 +0000913 free(m);
914 return 0;
915}
916
Anna Zaksca23eb22012-02-29 18:42:47 +0000917// ----------------------------------------------------------------------------
Anna Zaksac593002012-02-16 03:40:57 +0000918// False negatives.
919
920// TODO: This requires tracking symbols stored inside the structs/arrays.
921void testMalloc5() {
922 StructWithPtr St;
923 StructWithPtr *pSt = &St;
924 pSt->memP = malloc(12);
925}
Anna Zaksad901a62012-02-16 22:26:15 +0000926
Anna Zaksd9ab7bb2012-02-22 02:36:01 +0000927// TODO: This is another false negative.
928void testMallocWithParam(int **p) {
929 *p = (int*) malloc(sizeof(int));
930 *p = 0;
931}
932
933void testMallocWithParam_2(int **p) {
934 *p = (int*) malloc(sizeof(int));
935}
936
Anna Zaksad901a62012-02-16 22:26:15 +0000937// TODO: This should produce a warning, similar to the previous issue.
938void localArrayTest() {
939 char *p = (char*)malloc(12);
940 char *ArrayL[12];
941 ArrayL[0] = p;
942}
943
Ted Kremenek140d0c62012-05-01 21:58:29 +0000944// Test double assignment through integers.
945static long glob;
946void test_double_assign_ints()
947{
948 void *ptr = malloc (16); // no-warning
949 glob = (long)(unsigned long)ptr;
950}
951
952void test_double_assign_ints_positive()
953{
954 void *ptr = malloc(16);
955 (void*)(long)(unsigned long)ptr; // expected-warning {{unused}} expected-warning {{leak}}
956}
957
Jordan Rose1bf908d2012-06-16 00:09:20 +0000958
959void testCGContextNoLeak()
960{
961 void *ptr = malloc(16);
962 CGContextRef context = CGBitmapContextCreate(ptr);
963
964 // Because you can get the data back out like this, even much later,
965 // CGBitmapContextCreate is one of our "stop-tracking" exceptions.
966 free(CGBitmapContextGetData(context));
967}
968
969void testCGContextLeak()
970{
971 void *ptr = malloc(16);
972 CGContextRef context = CGBitmapContextCreate(ptr);
973 // However, this time we're just leaking the data, because the context
974 // object doesn't escape and it hasn't been freed in this function.
975}
976