1 // RUN: %clang_cc1 -analyze -analyzer-checker=core,alpha.deadcode.UnreachableCode,alpha.core.CastSize,unix.Malloc,debug.ExprInspection -analyzer-store=region -verify %s 2 3 #include "Inputs/system-header-simulator.h" 4 5 void clang_analyzer_eval(int); 6 7 typedef __typeof(sizeof(int)) size_t; 8 void *malloc(size_t); 9 void *alloca(size_t); 10 void *valloc(size_t); 11 void free(void *); 12 void *realloc(void *ptr, size_t size); 13 void *reallocf(void *ptr, size_t size); 14 void *calloc(size_t nmemb, size_t size); 15 char *strdup(const char *s); 16 char *strndup(const char *s, size_t n); 17 int memcmp(const void *s1, const void *s2, size_t n); 18 19 void myfoo(int *p); 20 void myfooint(int p); 21 char *fooRetPtr(); 22 23 void f1() { 24 int *p = malloc(12); 25 return; // expected-warning{{Potential leak of memory pointed to by 'p'}} 26 } 27 28 void f2() { 29 int *p = malloc(12); 30 free(p); 31 free(p); // expected-warning{{Attempt to free released memory}} 32 } 33 34 void f2_realloc_0() { 35 int *p = malloc(12); 36 realloc(p,0); 37 realloc(p,0); // expected-warning{{Attempt to free released memory}} 38 } 39 40 void f2_realloc_1() { 41 int *p = malloc(12); 42 int *q = realloc(p,0); // no-warning 43 } 44 45 void reallocNotNullPtr(unsigned sizeIn) { 46 unsigned size = 12; 47 char *p = (char*)malloc(size); 48 if (p) { 49 char *q = (char*)realloc(p, sizeIn); 50 char x = *q; // expected-warning {{Potential leak of memory pointed to by 'q'}} 51 } 52 } 53 54 void allocaTest() { 55 int *p = alloca(sizeof(int)); 56 } // no warn 57 58 void allocaBuiltinTest() { 59 int *p = __builtin_alloca(sizeof(int)); 60 } // no warn 61 62 int *realloctest1() { 63 int *q = malloc(12); 64 q = realloc(q, 20); 65 return q; // no warning - returning the allocated value 66 } 67 68 // p should be freed if realloc fails. 69 void reallocFails() { 70 char *p = malloc(12); 71 char *r = realloc(p, 12+1); 72 if (!r) { 73 free(p); 74 } else { 75 free(r); 76 } 77 } 78 79 void reallocSizeZero1() { 80 char *p = malloc(12); 81 char *r = realloc(p, 0); 82 if (!r) { 83 free(p); // expected-warning {{Attempt to free released memory}} 84 } else { 85 free(r); 86 } 87 } 88 89 void reallocSizeZero2() { 90 char *p = malloc(12); 91 char *r = realloc(p, 0); 92 if (!r) { 93 free(p); // expected-warning {{Attempt to free released memory}} 94 } else { 95 free(r); 96 } 97 free(p); // expected-warning {{Attempt to free released memory}} 98 } 99 100 void reallocSizeZero3() { 101 char *p = malloc(12); 102 char *r = realloc(p, 0); 103 free(r); 104 } 105 106 void reallocSizeZero4() { 107 char *r = realloc(0, 0); 108 free(r); 109 } 110 111 void reallocSizeZero5() { 112 char *r = realloc(0, 0); 113 } 114 115 void reallocPtrZero1() { 116 char *r = realloc(0, 12); 117 } // expected-warning {{Potential leak of memory pointed to by 'r'}} 118 119 void reallocPtrZero2() { 120 char *r = realloc(0, 12); 121 if (r) 122 free(r); 123 } 124 125 void reallocPtrZero3() { 126 char *r = realloc(0, 12); 127 free(r); 128 } 129 130 void reallocRadar6337483_1() { 131 char *buf = malloc(100); 132 buf = (char*)realloc(buf, 0x1000000); 133 if (!buf) { 134 return;// expected-warning {{Potential leak of memory pointed to by}} 135 } 136 free(buf); 137 } 138 139 void reallocRadar6337483_2() { 140 char *buf = malloc(100); 141 char *buf2 = (char*)realloc(buf, 0x1000000); 142 if (!buf2) { 143 ; 144 } else { 145 free(buf2); 146 } 147 } // expected-warning {{Potential leak of memory pointed to by}} 148 149 void reallocRadar6337483_3() { 150 char * buf = malloc(100); 151 char * tmp; 152 tmp = (char*)realloc(buf, 0x1000000); 153 if (!tmp) { 154 free(buf); 155 return; 156 } 157 buf = tmp; 158 free(buf); 159 } 160 161 void reallocRadar6337483_4() { 162 char *buf = malloc(100); 163 char *buf2 = (char*)realloc(buf, 0x1000000); 164 if (!buf2) { 165 return; // expected-warning {{Potential leak of memory pointed to by}} 166 } else { 167 free(buf2); 168 } 169 } 170 171 int *reallocfTest1() { 172 int *q = malloc(12); 173 q = reallocf(q, 20); 174 return q; // no warning - returning the allocated value 175 } 176 177 void reallocfRadar6337483_4() { 178 char *buf = malloc(100); 179 char *buf2 = (char*)reallocf(buf, 0x1000000); 180 if (!buf2) { 181 return; // no warning - reallocf frees even on failure 182 } else { 183 free(buf2); 184 } 185 } 186 187 void reallocfRadar6337483_3() { 188 char * buf = malloc(100); 189 char * tmp; 190 tmp = (char*)reallocf(buf, 0x1000000); 191 if (!tmp) { 192 free(buf); // expected-warning {{Attempt to free released memory}} 193 return; 194 } 195 buf = tmp; 196 free(buf); 197 } 198 199 void reallocfPtrZero1() { 200 char *r = reallocf(0, 12); 201 } // expected-warning {{Potential leak of memory pointed to by}} 202 203 204 // This case tests that storing malloc'ed memory to a static variable which is 205 // then returned is not leaked. In the absence of known contracts for functions 206 // or inter-procedural analysis, this is a conservative answer. 207 int *f3() { 208 static int *p = 0; 209 p = malloc(12); 210 return p; // no-warning 211 } 212 213 // This case tests that storing malloc'ed memory to a static global variable 214 // which is then returned is not leaked. In the absence of known contracts for 215 // functions or inter-procedural analysis, this is a conservative answer. 216 static int *p_f4 = 0; 217 int *f4() { 218 p_f4 = malloc(12); 219 return p_f4; // no-warning 220 } 221 222 int *f5() { 223 int *q = malloc(12); 224 q = realloc(q, 20); 225 return q; // no-warning 226 } 227 228 void f6() { 229 int *p = malloc(12); 230 if (!p) 231 return; // no-warning 232 else 233 free(p); 234 } 235 236 void f6_realloc() { 237 int *p = malloc(12); 238 if (!p) 239 return; // no-warning 240 else 241 realloc(p,0); 242 } 243 244 245 char *doit2(); 246 void pr6069() { 247 char *buf = doit2(); 248 free(buf); 249 } 250 251 void pr6293() { 252 free(0); 253 } 254 255 void f7() { 256 char *x = (char*) malloc(4); 257 free(x); 258 x[0] = 'a'; // expected-warning{{Use of memory after it is freed}} 259 } 260 261 void f8() { 262 char *x = (char*) malloc(4); 263 free(x); 264 char *y = strndup(x, 4); // expected-warning{{Use of memory after it is freed}} 265 } 266 267 void f7_realloc() { 268 char *x = (char*) malloc(4); 269 realloc(x,0); 270 x[0] = 'a'; // expected-warning{{Use of memory after it is freed}} 271 } 272 273 void PR6123() { 274 int *x = malloc(11); // expected-warning{{Cast a region whose size is not a multiple of the destination type size}} 275 } 276 277 void PR7217() { 278 int *buf = malloc(2); // expected-warning{{Cast a region whose size is not a multiple of the destination type size}} 279 buf[1] = 'c'; // not crash 280 } 281 282 void cast_emtpy_struct() { 283 struct st { 284 }; 285 286 struct st *s = malloc(sizeof(struct st)); // no-warning 287 free(s); 288 } 289 290 void cast_struct_1() { 291 struct st { 292 int i[100]; 293 char j[]; 294 }; 295 296 struct st *s = malloc(sizeof(struct st)); // no-warning 297 free(s); 298 } 299 300 void cast_struct_2() { 301 struct st { 302 int i[100]; 303 char j[0]; 304 }; 305 306 struct st *s = malloc(sizeof(struct st)); // no-warning 307 free(s); 308 } 309 310 void cast_struct_3() { 311 struct st { 312 int i[100]; 313 char j[1]; 314 }; 315 316 struct st *s = malloc(sizeof(struct st)); // no-warning 317 free(s); 318 } 319 320 void cast_struct_4() { 321 struct st { 322 int i[100]; 323 char j[2]; 324 }; 325 326 struct st *s = malloc(sizeof(struct st)); // no-warning 327 free(s); 328 } 329 330 void cast_struct_5() { 331 struct st { 332 char i[200]; 333 char j[1]; 334 }; 335 336 struct st *s = malloc(sizeof(struct st) - sizeof(char)); // no-warning 337 free(s); 338 } 339 340 void cast_struct_warn_1() { 341 struct st { 342 int i[100]; 343 char j[2]; 344 }; 345 346 struct st *s = malloc(sizeof(struct st) + 2); // expected-warning{{Cast a region whose size is not a multiple of the destination type size}} 347 free(s); 348 } 349 350 void cast_struct_warn_2() { 351 struct st { 352 int i[100]; 353 char j[2]; 354 }; 355 356 struct st *s = malloc(2); // expected-warning{{Cast a region whose size is not a multiple of the destination type size}} 357 free(s); 358 } 359 360 void cast_struct_flex_array_1() { 361 struct st { 362 int i[100]; 363 char j[]; 364 }; 365 366 struct st *s = malloc(sizeof(struct st) + 3); // no-warning 367 free(s); 368 } 369 370 void cast_struct_flex_array_2() { 371 struct st { 372 int i[100]; 373 char j[0]; 374 }; 375 376 struct st *s = malloc(sizeof(struct st) + 3); // no-warning 377 free(s); 378 } 379 380 void cast_struct_flex_array_3() { 381 struct st { 382 int i[100]; 383 char j[1]; 384 }; 385 386 struct st *s = malloc(sizeof(struct st) + 3); // no-warning 387 free(s); 388 } 389 390 void cast_struct_flex_array_4() { 391 struct foo { 392 char f[32]; 393 }; 394 struct st { 395 char i[100]; 396 struct foo data[]; 397 }; 398 399 struct st *s = malloc(sizeof(struct st) + 3 * sizeof(struct foo)); // no-warning 400 free(s); 401 } 402 403 void cast_struct_flex_array_5() { 404 struct foo { 405 char f[32]; 406 }; 407 struct st { 408 char i[100]; 409 struct foo data[0]; 410 }; 411 412 struct st *s = malloc(sizeof(struct st) + 3 * sizeof(struct foo)); // no-warning 413 free(s); 414 } 415 416 void cast_struct_flex_array_6() { 417 struct foo { 418 char f[32]; 419 }; 420 struct st { 421 char i[100]; 422 struct foo data[1]; 423 }; 424 425 struct st *s = malloc(sizeof(struct st) + 3 * sizeof(struct foo)); // no-warning 426 free(s); 427 } 428 429 void cast_struct_flex_array_warn_1() { 430 struct foo { 431 char f[32]; 432 }; 433 struct st { 434 char i[100]; 435 struct foo data[]; 436 }; 437 438 struct st *s = malloc(3 * sizeof(struct st) + 3 * sizeof(struct foo)); // expected-warning{{Cast a region whose size is not a multiple of the destination type size}} 439 free(s); 440 } 441 442 void cast_struct_flex_array_warn_2() { 443 struct foo { 444 char f[32]; 445 }; 446 struct st { 447 char i[100]; 448 struct foo data[0]; 449 }; 450 451 struct st *s = malloc(3 * sizeof(struct st) + 3 * sizeof(struct foo)); // expected-warning{{Cast a region whose size is not a multiple of the destination type size}} 452 free(s); 453 } 454 455 void cast_struct_flex_array_warn_3() { 456 struct foo { 457 char f[32]; 458 }; 459 struct st { 460 char i[100]; 461 struct foo data[1]; 462 }; 463 464 struct st *s = malloc(3 * sizeof(struct st) + 3 * sizeof(struct foo)); // expected-warning{{Cast a region whose size is not a multiple of the destination type size}} 465 free(s); 466 } 467 468 void cast_struct_flex_array_warn_4() { 469 struct st { 470 int i[100]; 471 int j[]; 472 }; 473 474 struct st *s = malloc(sizeof(struct st) + 3); // expected-warning{{Cast a region whose size is not a multiple of the destination type size}} 475 free(s); 476 } 477 478 void cast_struct_flex_array_warn_5() { 479 struct st { 480 int i[100]; 481 int j[0]; 482 }; 483 484 struct st *s = malloc(sizeof(struct st) + 3); // expected-warning{{Cast a region whose size is not a multiple of the destination type size}} 485 free(s); 486 } 487 488 void cast_struct_flex_array_warn_6() { 489 struct st { 490 int i[100]; 491 int j[1]; 492 }; 493 494 struct st *s = malloc(sizeof(struct st) + 3); // expected-warning{{Cast a region whose size is not a multiple of the destination type size}} 495 free(s); 496 } 497 498 void mallocCastToVoid() { 499 void *p = malloc(2); 500 const void *cp = p; // not crash 501 free(p); 502 } 503 504 void mallocCastToFP() { 505 void *p = malloc(2); 506 void (*fp)() = p; // not crash 507 free(p); 508 } 509 510 // This tests that malloc() buffers are undefined by default 511 char mallocGarbage () { 512 char *buf = malloc(2); 513 char result = buf[1]; // expected-warning{{undefined}} 514 free(buf); 515 return result; 516 } 517 518 // This tests that calloc() buffers need to be freed 519 void callocNoFree () { 520 char *buf = calloc(2,2); 521 return; // expected-warning{{Potential leak of memory pointed to by 'buf'}} 522 } 523 524 // These test that calloc() buffers are zeroed by default 525 char callocZeroesGood () { 526 char *buf = calloc(2,2); 527 char result = buf[3]; // no-warning 528 if (buf[1] == 0) { 529 free(buf); 530 } 531 return result; // no-warning 532 } 533 534 char callocZeroesBad () { 535 char *buf = calloc(2,2); 536 char result = buf[3]; // no-warning 537 if (buf[1] != 0) { 538 free(buf); // expected-warning{{never executed}} 539 } 540 return result; // expected-warning{{Potential leak of memory pointed to by 'buf'}} 541 } 542 543 void nullFree() { 544 int *p = 0; 545 free(p); // no warning - a nop 546 } 547 548 void paramFree(int *p) { 549 myfoo(p); 550 free(p); // no warning 551 myfoo(p); // expected-warning {{Use of memory after it is freed}} 552 } 553 554 int* mallocEscapeRet() { 555 int *p = malloc(12); 556 return p; // no warning 557 } 558 559 void mallocEscapeFoo() { 560 int *p = malloc(12); 561 myfoo(p); 562 return; // no warning 563 } 564 565 void mallocEscapeFree() { 566 int *p = malloc(12); 567 myfoo(p); 568 free(p); 569 } 570 571 void mallocEscapeFreeFree() { 572 int *p = malloc(12); 573 myfoo(p); 574 free(p); 575 free(p); // expected-warning{{Attempt to free released memory}} 576 } 577 578 void mallocEscapeFreeUse() { 579 int *p = malloc(12); 580 myfoo(p); 581 free(p); 582 myfoo(p); // expected-warning{{Use of memory after it is freed}} 583 } 584 585 int *myalloc(); 586 void myalloc2(int **p); 587 588 void mallocEscapeFreeCustomAlloc() { 589 int *p = malloc(12); 590 myfoo(p); 591 free(p); 592 p = myalloc(); 593 free(p); // no warning 594 } 595 596 void mallocEscapeFreeCustomAlloc2() { 597 int *p = malloc(12); 598 myfoo(p); 599 free(p); 600 myalloc2(&p); 601 free(p); // no warning 602 } 603 604 void mallocBindFreeUse() { 605 int *x = malloc(12); 606 int *y = x; 607 free(y); 608 myfoo(x); // expected-warning{{Use of memory after it is freed}} 609 } 610 611 void mallocEscapeMalloc() { 612 int *p = malloc(12); 613 myfoo(p); 614 p = malloc(12); 615 } // expected-warning{{Potential leak of memory pointed to by}} 616 617 void mallocMalloc() { 618 int *p = malloc(12); 619 p = malloc(12); 620 } // expected-warning {{Potential leak of memory pointed to by}} 621 622 void mallocFreeMalloc() { 623 int *p = malloc(12); 624 free(p); 625 p = malloc(12); 626 free(p); 627 } 628 629 void mallocFreeUse_params() { 630 int *p = malloc(12); 631 free(p); 632 myfoo(p); //expected-warning{{Use of memory after it is freed}} 633 } 634 635 void mallocFreeUse_params2() { 636 int *p = malloc(12); 637 free(p); 638 myfooint(*p); //expected-warning{{Use of memory after it is freed}} 639 } 640 641 void mallocFailedOrNot() { 642 int *p = malloc(12); 643 if (!p) 644 free(p); 645 else 646 free(p); 647 } 648 649 struct StructWithInt { 650 int g; 651 }; 652 653 int *mallocReturnFreed() { 654 int *p = malloc(12); 655 free(p); 656 return p; // expected-warning {{Use of memory after it is freed}} 657 } 658 659 int useAfterFreeStruct() { 660 struct StructWithInt *px= malloc(sizeof(struct StructWithInt)); 661 px->g = 5; 662 free(px); 663 return px->g; // expected-warning {{Use of memory after it is freed}} 664 } 665 666 void nonSymbolAsFirstArg(int *pp, struct StructWithInt *p); 667 668 void mallocEscapeFooNonSymbolArg() { 669 struct StructWithInt *p = malloc(sizeof(struct StructWithInt)); 670 nonSymbolAsFirstArg(&p->g, p); 671 return; // no warning 672 } 673 674 void mallocFailedOrNotLeak() { 675 int *p = malloc(12); 676 if (p == 0) 677 return; // no warning 678 else 679 return; // expected-warning {{Potential leak of memory pointed to by}} 680 } 681 682 void mallocAssignment() { 683 char *p = malloc(12); 684 p = fooRetPtr(); 685 } // expected-warning {{leak}} 686 687 int vallocTest() { 688 char *mem = valloc(12); 689 return 0; // expected-warning {{Potential leak of memory pointed to by}} 690 } 691 692 void vallocEscapeFreeUse() { 693 int *p = valloc(12); 694 myfoo(p); 695 free(p); 696 myfoo(p); // expected-warning{{Use of memory after it is freed}} 697 } 698 699 int *Gl; 700 struct GlStTy { 701 int *x; 702 }; 703 704 struct GlStTy GlS = {0}; 705 706 void GlobalFree() { 707 free(Gl); 708 } 709 710 void GlobalMalloc() { 711 Gl = malloc(12); 712 } 713 714 void GlobalStructMalloc() { 715 int *a = malloc(12); 716 GlS.x = a; 717 } 718 719 void GlobalStructMallocFree() { 720 int *a = malloc(12); 721 GlS.x = a; 722 free(GlS.x); 723 } 724 725 char *ArrayG[12]; 726 727 void globalArrayTest() { 728 char *p = (char*)malloc(12); 729 ArrayG[0] = p; 730 } 731 732 // Make sure that we properly handle a pointer stored into a local struct/array. 733 typedef struct _StructWithPtr { 734 int *memP; 735 } StructWithPtr; 736 737 static StructWithPtr arrOfStructs[10]; 738 739 void testMalloc() { 740 int *x = malloc(12); 741 StructWithPtr St; 742 St.memP = x; 743 arrOfStructs[0] = St; // no-warning 744 } 745 746 StructWithPtr testMalloc2() { 747 int *x = malloc(12); 748 StructWithPtr St; 749 St.memP = x; 750 return St; // no-warning 751 } 752 753 int *testMalloc3() { 754 int *x = malloc(12); 755 int *y = x; 756 return y; // no-warning 757 } 758 759 void testStructLeak() { 760 StructWithPtr St; 761 St.memP = malloc(12); 762 return; // expected-warning {{Potential leak of memory pointed to by 'St.memP'}} 763 } 764 765 void testElemRegion1() { 766 char *x = (void*)malloc(2); 767 int *ix = (int*)x; 768 free(&(x[0])); 769 } 770 771 void testElemRegion2(int **pp) { 772 int *p = malloc(12); 773 *pp = p; 774 free(pp[0]); 775 } 776 777 void testElemRegion3(int **pp) { 778 int *p = malloc(12); 779 *pp = p; 780 free(*pp); 781 } 782 // Region escape testing. 783 784 unsigned takePtrToPtr(int **p); 785 void PassTheAddrOfAllocatedData(int f) { 786 int *p = malloc(12); 787 // We don't know what happens after the call. Should stop tracking here. 788 if (takePtrToPtr(&p)) 789 f++; 790 free(p); // no warning 791 } 792 793 struct X { 794 int *p; 795 }; 796 unsigned takePtrToStruct(struct X *s); 797 int ** foo2(int *g, int f) { 798 int *p = malloc(12); 799 struct X *px= malloc(sizeof(struct X)); 800 px->p = p; 801 // We don't know what happens after this call. Should not track px nor p. 802 if (takePtrToStruct(px)) 803 f++; 804 free(p); 805 return 0; 806 } 807 808 struct X* RegInvalidationDetect1(struct X *s2) { 809 struct X *px= malloc(sizeof(struct X)); 810 px->p = 0; 811 px = s2; 812 return px; // expected-warning {{Potential leak of memory pointed to by}} 813 } 814 815 struct X* RegInvalidationGiveUp1() { 816 int *p = malloc(12); 817 struct X *px= malloc(sizeof(struct X)); 818 px->p = p; 819 return px; 820 } 821 822 int **RegInvalidationDetect2(int **pp) { 823 int *p = malloc(12); 824 pp = &p; 825 pp++; 826 return 0;// expected-warning {{Potential leak of memory pointed to by}} 827 } 828 829 extern void exit(int) __attribute__ ((__noreturn__)); 830 void mallocExit(int *g) { 831 struct xx *p = malloc(12); 832 if (g != 0) 833 exit(1); 834 free(p); 835 return; 836 } 837 838 extern void __assert_fail (__const char *__assertion, __const char *__file, 839 unsigned int __line, __const char *__function) 840 __attribute__ ((__noreturn__)); 841 #define assert(expr) \ 842 ((expr) ? (void)(0) : __assert_fail (#expr, __FILE__, __LINE__, __func__)) 843 void mallocAssert(int *g) { 844 struct xx *p = malloc(12); 845 846 assert(g != 0); 847 free(p); 848 return; 849 } 850 851 void doNotInvalidateWhenPassedToSystemCalls(char *s) { 852 char *p = malloc(12); 853 strlen(p); 854 strcpy(p, s); 855 strcpy(s, p); 856 strcpy(p, p); 857 memcpy(p, s, 1); 858 memcpy(s, p, 1); 859 memcpy(p, p, 1); 860 } // expected-warning {{leak}} 861 862 // Treat source buffer contents as escaped. 863 void escapeSourceContents(char *s) { 864 char *p = malloc(12); 865 memcpy(s, &p, 12); // no warning 866 867 void *p1 = malloc(7); 868 char *a; 869 memcpy(&a, &p1, sizeof a); 870 // FIXME: No warning due to limitations imposed by current modelling of 871 // 'memcpy' (regions metadata is not copied). 872 873 int *ptrs[2]; 874 int *allocated = (int *)malloc(4); 875 memcpy(&ptrs[0], &allocated, sizeof(int *)); 876 // FIXME: No warning due to limitations imposed by current modelling of 877 // 'memcpy' (regions metadata is not copied). 878 } 879 880 void invalidateDestinationContents() { 881 int *null = 0; 882 int *p = (int *)malloc(4); 883 memcpy(&p, &null, sizeof(int *)); 884 885 int *ptrs1[2]; // expected-warning {{Potential leak of memory pointed to by}} 886 ptrs1[0] = (int *)malloc(4); 887 memcpy(ptrs1, &null, sizeof(int *)); 888 889 int *ptrs2[2]; // expected-warning {{Potential memory leak}} 890 ptrs2[0] = (int *)malloc(4); 891 memcpy(&ptrs2[1], &null, sizeof(int *)); 892 893 int *ptrs3[2]; // expected-warning {{Potential memory leak}} 894 ptrs3[0] = (int *)malloc(4); 895 memcpy(&ptrs3[0], &null, sizeof(int *)); 896 } // expected-warning {{Potential memory leak}} 897 898 // Rely on the CString checker evaluation of the strcpy API to convey that the result of strcpy is equal to p. 899 void symbolLostWithStrcpy(char *s) { 900 char *p = malloc(12); 901 p = strcpy(p, s); 902 free(p); 903 } 904 905 906 // The same test as the one above, but with what is actually generated on a mac. 907 static __inline char * 908 __inline_strcpy_chk (char *restrict __dest, const char *restrict __src) 909 { 910 return __builtin___strcpy_chk (__dest, __src, __builtin_object_size (__dest, 2 > 1)); 911 } 912 913 void symbolLostWithStrcpy_InlineStrcpyVersion(char *s) { 914 char *p = malloc(12); 915 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)); 916 free(p); 917 } 918 919 // Here we are returning a pointer one past the allocated value. An idiom which 920 // can be used for implementing special malloc. The correct uses of this might 921 // be rare enough so that we could keep this as a warning. 922 static void *specialMalloc(int n){ 923 int *p; 924 p = malloc( n+8 ); 925 if( p ){ 926 p[0] = n; 927 p++; 928 } 929 return p; 930 } 931 932 // Potentially, the user could free the struct by performing pointer arithmetic on the return value. 933 // This is a variation of the specialMalloc issue, though probably would be more rare in correct code. 934 int *specialMallocWithStruct() { 935 struct StructWithInt *px= malloc(sizeof(struct StructWithInt)); 936 return &(px->g); 937 } 938 939 // Test various allocation/deallocation functions. 940 void testStrdup(const char *s, unsigned validIndex) { 941 char *s2 = strdup(s); 942 s2[validIndex + 1] = 'b'; 943 } // expected-warning {{Potential leak of memory pointed to by}} 944 945 int testStrndup(const char *s, unsigned validIndex, unsigned size) { 946 char *s2 = strndup(s, size); 947 s2 [validIndex + 1] = 'b'; 948 if (s2[validIndex] != 'a') 949 return 0; 950 else 951 return 1;// expected-warning {{Potential leak of memory pointed to by}} 952 } 953 954 void testStrdupContentIsDefined(const char *s, unsigned validIndex) { 955 char *s2 = strdup(s); 956 char result = s2[1];// no warning 957 free(s2); 958 } 959 960 // ---------------------------------------------------------------------------- 961 // Test the system library functions to which the pointer can escape. 962 // This tests false positive suppression. 963 964 // For now, we assume memory passed to pthread_specific escapes. 965 // TODO: We could check that if a new pthread binding is set, the existing 966 // binding must be freed; otherwise, a memory leak can occur. 967 void testPthereadSpecificEscape(pthread_key_t key) { 968 void *buf = malloc(12); 969 pthread_setspecific(key, buf); // no warning 970 } 971 972 // PR12101: Test funopen(). 973 static int releasePtr(void *_ctx) { 974 free(_ctx); 975 return 0; 976 } 977 FILE *useFunOpen() { 978 void *ctx = malloc(sizeof(int)); 979 FILE *f = funopen(ctx, 0, 0, 0, releasePtr); // no warning 980 if (f == 0) { 981 free(ctx); 982 } 983 return f; 984 } 985 FILE *useFunOpenNoReleaseFunction() { 986 void *ctx = malloc(sizeof(int)); 987 FILE *f = funopen(ctx, 0, 0, 0, 0); 988 if (f == 0) { 989 free(ctx); 990 } 991 return f; // expected-warning{{leak}} 992 } 993 994 static int readNothing(void *_ctx, char *buf, int size) { 995 return 0; 996 } 997 FILE *useFunOpenReadNoRelease() { 998 void *ctx = malloc(sizeof(int)); 999 FILE *f = funopen(ctx, readNothing, 0, 0, 0); 1000 if (f == 0) { 1001 free(ctx); 1002 } 1003 return f; // expected-warning{{leak}} 1004 } 1005 1006 // Test setbuf, setvbuf. 1007 int my_main_no_warning() { 1008 char *p = malloc(100); 1009 setvbuf(stdout, p, 0, 100); 1010 return 0; 1011 } 1012 int my_main_no_warning2() { 1013 char *p = malloc(100); 1014 setbuf(__stdoutp, p); 1015 return 0; 1016 } 1017 int my_main_warn(FILE *f) { 1018 char *p = malloc(100); 1019 setvbuf(f, p, 0, 100); 1020 return 0;// expected-warning {{leak}} 1021 } 1022 1023 // <rdar://problem/10978247>. 1024 // some people use stack allocated memory as an optimization to avoid 1025 // a heap allocation for small work sizes. This tests the analyzer's 1026 // understanding that the malloc'ed memory is not the same as stackBuffer. 1027 void radar10978247(int myValueSize) { 1028 char stackBuffer[128]; 1029 char *buffer; 1030 1031 if (myValueSize <= sizeof(stackBuffer)) 1032 buffer = stackBuffer; 1033 else 1034 buffer = malloc(myValueSize); 1035 1036 // do stuff with the buffer 1037 if (buffer != stackBuffer) 1038 free(buffer); 1039 } 1040 1041 void radar10978247_positive(int myValueSize) { 1042 char stackBuffer[128]; 1043 char *buffer; 1044 1045 if (myValueSize <= sizeof(stackBuffer)) 1046 buffer = stackBuffer; 1047 else 1048 buffer = malloc(myValueSize); 1049 1050 // do stuff with the buffer 1051 if (buffer == stackBuffer) 1052 return; 1053 else 1054 return; // expected-warning {{leak}} 1055 } 1056 // <rdar://problem/11269741> Previously this triggered a false positive 1057 // because malloc() is known to return uninitialized memory and the binding 1058 // of 'o' to 'p->n' was not getting propertly handled. Now we report a leak. 1059 struct rdar11269741_a_t { 1060 struct rdar11269741_b_t { 1061 int m; 1062 } n; 1063 }; 1064 1065 int rdar11269741(struct rdar11269741_b_t o) 1066 { 1067 struct rdar11269741_a_t *p = (struct rdar11269741_a_t *) malloc(sizeof(*p)); 1068 p->n = o; 1069 return p->n.m; // expected-warning {{leak}} 1070 } 1071 1072 // Pointer arithmetic, returning an ElementRegion. 1073 void *radar11329382(unsigned bl) { 1074 void *ptr = malloc (16); 1075 ptr = ptr + (2 - bl); 1076 return ptr; // no warning 1077 } 1078 1079 void __assert_rtn(const char *, const char *, int, const char *) __attribute__((__noreturn__)); 1080 int strcmp(const char *, const char *); 1081 char *a (void); 1082 void radar11270219(void) { 1083 char *x = a(), *y = a(); 1084 (__builtin_expect(!(x && y), 0) ? __assert_rtn(__func__, "/Users/zaks/tmp/ex.c", 24, "x && y") : (void)0); 1085 strcmp(x, y); // no warning 1086 } 1087 1088 void radar_11358224_test_double_assign_ints_positive_2() 1089 { 1090 void *ptr = malloc(16); 1091 ptr = ptr; 1092 } // expected-warning {{leak}} 1093 1094 // Assume that functions which take a function pointer can free memory even if 1095 // they are defined in system headers and take the const pointer to the 1096 // allocated memory. (radar://11160612) 1097 int const_ptr_and_callback(int, const char*, int n, void(*)(void*)); 1098 void r11160612_1() { 1099 char *x = malloc(12); 1100 const_ptr_and_callback(0, x, 12, free); // no - warning 1101 } 1102 1103 // Null is passed as callback. 1104 void r11160612_2() { 1105 char *x = malloc(12); 1106 const_ptr_and_callback(0, x, 12, 0); 1107 } // expected-warning {{leak}} 1108 1109 // Callback is passed to a function defined in a system header. 1110 void r11160612_4() { 1111 char *x = malloc(12); 1112 sqlite3_bind_text_my(0, x, 12, free); // no - warning 1113 } 1114 1115 // Passing callbacks in a struct. 1116 void r11160612_5(StWithCallback St) { 1117 void *x = malloc(12); 1118 dealocateMemWhenDoneByVal(x, St); 1119 } 1120 void r11160612_6(StWithCallback St) { 1121 void *x = malloc(12); 1122 dealocateMemWhenDoneByRef(&St, x); 1123 } 1124 1125 int mySub(int, int); 1126 int myAdd(int, int); 1127 int fPtr(unsigned cond, int x) { 1128 return (cond ? mySub : myAdd)(x, x); 1129 } 1130 1131 // Test anti-aliasing. 1132 1133 void dependsOnValueOfPtr(int *g, unsigned f) { 1134 int *p; 1135 1136 if (f) { 1137 p = g; 1138 } else { 1139 p = malloc(12); 1140 } 1141 1142 if (p != g) 1143 free(p); 1144 else 1145 return; // no warning 1146 return; 1147 } 1148 1149 int CMPRegionHeapToStack() { 1150 int x = 0; 1151 int *x1 = malloc(8); 1152 int *x2 = &x; 1153 clang_analyzer_eval(x1 == x2); // expected-warning{{FALSE}} 1154 free(x1); 1155 return x; 1156 } 1157 1158 int CMPRegionHeapToHeap2() { 1159 int x = 0; 1160 int *x1 = malloc(8); 1161 int *x2 = malloc(8); 1162 int *x4 = x1; 1163 int *x5 = x2; 1164 clang_analyzer_eval(x4 == x5); // expected-warning{{FALSE}} 1165 free(x1); 1166 free(x2); 1167 return x; 1168 } 1169 1170 int CMPRegionHeapToHeap() { 1171 int x = 0; 1172 int *x1 = malloc(8); 1173 int *x4 = x1; 1174 if (x1 == x4) { 1175 free(x1); 1176 return 5/x; // expected-warning{{Division by zero}} 1177 } 1178 return x;// expected-warning{{This statement is never executed}} 1179 } 1180 1181 int HeapAssignment() { 1182 int m = 0; 1183 int *x = malloc(4); 1184 int *y = x; 1185 *x = 5; 1186 clang_analyzer_eval(*x != *y); // expected-warning{{FALSE}} 1187 free(x); 1188 return 0; 1189 } 1190 1191 int *retPtr(); 1192 int *retPtrMightAlias(int *x); 1193 int cmpHeapAllocationToUnknown() { 1194 int zero = 0; 1195 int *yBefore = retPtr(); 1196 int *m = malloc(8); 1197 int *yAfter = retPtrMightAlias(m); 1198 clang_analyzer_eval(yBefore == m); // expected-warning{{FALSE}} 1199 clang_analyzer_eval(yAfter == m); // expected-warning{{FALSE}} 1200 free(m); 1201 return 0; 1202 } 1203 1204 void localArrayTest() { 1205 char *p = (char*)malloc(12); 1206 char *ArrayL[12]; 1207 ArrayL[0] = p; 1208 } // expected-warning {{leak}} 1209 1210 void localStructTest() { 1211 StructWithPtr St; 1212 StructWithPtr *pSt = &St; 1213 pSt->memP = malloc(12); 1214 } // expected-warning{{Potential leak of memory pointed to by}} 1215 1216 #ifdef __INTPTR_TYPE__ 1217 // Test double assignment through integers. 1218 typedef __INTPTR_TYPE__ intptr_t; 1219 typedef unsigned __INTPTR_TYPE__ uintptr_t; 1220 1221 static intptr_t glob; 1222 void test_double_assign_ints() 1223 { 1224 void *ptr = malloc (16); // no-warning 1225 glob = (intptr_t)(uintptr_t)ptr; 1226 } 1227 1228 void test_double_assign_ints_positive() 1229 { 1230 void *ptr = malloc(16); 1231 (void*)(intptr_t)(uintptr_t)ptr; // expected-warning {{unused}} 1232 } // expected-warning {{leak}} 1233 #endif 1234 1235 void testCGContextNoLeak() 1236 { 1237 void *ptr = malloc(16); 1238 CGContextRef context = CGBitmapContextCreate(ptr); 1239 1240 // Because you can get the data back out like this, even much later, 1241 // CGBitmapContextCreate is one of our "stop-tracking" exceptions. 1242 free(CGBitmapContextGetData(context)); 1243 } 1244 1245 void testCGContextLeak() 1246 { 1247 void *ptr = malloc(16); 1248 CGContextRef context = CGBitmapContextCreate(ptr); 1249 // However, this time we're just leaking the data, because the context 1250 // object doesn't escape and it hasn't been freed in this function. 1251 } 1252 1253 // Allow xpc context to escape. radar://11635258 1254 // TODO: Would be great if we checked that the finalize_connection_context actually releases it. 1255 static void finalize_connection_context(void *ctx) { 1256 int *context = ctx; 1257 free(context); 1258 } 1259 void foo (xpc_connection_t peer) { 1260 int *ctx = calloc(1, sizeof(int)); 1261 xpc_connection_set_context(peer, ctx); 1262 xpc_connection_set_finalizer_f(peer, finalize_connection_context); 1263 xpc_connection_resume(peer); 1264 } 1265 1266 // Make sure we catch errors when we free in a function which does not allocate memory. 1267 void freeButNoMalloc(int *p, int x){ 1268 if (x) { 1269 free(p); 1270 //user forgot a return here. 1271 } 1272 free(p); // expected-warning {{Attempt to free released memory}} 1273 } 1274 1275 struct HasPtr { 1276 char *p; 1277 }; 1278 1279 char* reallocButNoMalloc(struct HasPtr *a, int c, int size) { 1280 int *s; 1281 char *b = realloc(a->p, size); 1282 char *m = realloc(a->p, size); // expected-warning {{Attempt to free released memory}} 1283 return a->p; 1284 } 1285 1286 // We should not warn in this case since the caller will presumably free a->p in all cases. 1287 int reallocButNoMallocPR13674(struct HasPtr *a, int c, int size) { 1288 int *s; 1289 char *b = realloc(a->p, size); 1290 if (b == 0) 1291 return -1; 1292 a->p = b; 1293 return 0; 1294 } 1295 1296 // Test realloc with no visible malloc. 1297 void *test(void *ptr) { 1298 void *newPtr = realloc(ptr, 4); 1299 if (newPtr == 0) { 1300 if (ptr) 1301 free(ptr); // no-warning 1302 } 1303 return newPtr; 1304 } 1305 1306 1307 char *testLeakWithinReturn(char *str) { 1308 return strdup(strdup(str)); // expected-warning{{leak}} 1309 } 1310 1311 void passConstPtr(const char * ptr); 1312 1313 void testPassConstPointer() { 1314 char * string = malloc(sizeof(char)*10); 1315 passConstPtr(string); 1316 return; // expected-warning {{leak}} 1317 } 1318 1319 void testPassConstPointerIndirectly() { 1320 char *p = malloc(1); 1321 p++; 1322 memcmp(p, p, sizeof(&p)); 1323 return; // expected-warning {{leak}} 1324 } 1325 1326 void testPassConstPointerIndirectlyStruct() { 1327 struct HasPtr hp; 1328 hp.p = malloc(10); 1329 memcmp(&hp, &hp, sizeof(hp)); 1330 return; // expected-warning {{Potential leak of memory pointed to by 'hp.p'}} 1331 } 1332 1333 void testPassToSystemHeaderFunctionIndirectlyStruct() { 1334 SomeStruct ss; 1335 ss.p = malloc(1); 1336 fakeSystemHeaderCall(&ss); // invalidates ss, making ss.p unreachable 1337 // Technically a false negative here -- we know the system function won't free 1338 // ss.p, but nothing else will either! 1339 } // no-warning 1340 1341 void testPassToSystemHeaderFunctionIndirectlyStructFree() { 1342 SomeStruct ss; 1343 ss.p = malloc(1); 1344 fakeSystemHeaderCall(&ss); // invalidates ss, making ss.p unreachable 1345 free(ss.p); 1346 } // no-warning 1347 1348 void testPassToSystemHeaderFunctionIndirectlyArray() { 1349 int *p[1]; 1350 p[0] = malloc(sizeof(int)); 1351 fakeSystemHeaderCallIntPtr(p); // invalidates p, making p[0] unreachable 1352 // Technically a false negative here -- we know the system function won't free 1353 // p[0], but nothing else will either! 1354 } // no-warning 1355 1356 void testPassToSystemHeaderFunctionIndirectlyArrayFree() { 1357 int *p[1]; 1358 p[0] = malloc(sizeof(int)); 1359 fakeSystemHeaderCallIntPtr(p); // invalidates p, making p[0] unreachable 1360 free(p[0]); 1361 } // no-warning 1362 1363 int *testOffsetAllocate(size_t size) { 1364 int *memoryBlock = (int *)malloc(size + sizeof(int)); 1365 return &memoryBlock[1]; // no-warning 1366 } 1367 1368 void testOffsetDeallocate(int *memoryBlock) { 1369 free(&memoryBlock[-1]); // no-warning 1370 } 1371 1372 void testOffsetOfRegionFreed() { 1373 __int64_t * array = malloc(sizeof(__int64_t)*2); 1374 array += 1; 1375 free(&array[0]); // expected-warning{{Argument to free() is offset by 8 bytes from the start of memory allocated by malloc()}} 1376 } 1377 1378 void testOffsetOfRegionFreed2() { 1379 __int64_t *p = malloc(sizeof(__int64_t)*2); 1380 p += 1; 1381 free(p); // expected-warning{{Argument to free() is offset by 8 bytes from the start of memory allocated by malloc()}} 1382 } 1383 1384 void testOffsetOfRegionFreed3() { 1385 char *r = malloc(sizeof(char)); 1386 r = r - 10; 1387 free(r); // expected-warning {{Argument to free() is offset by -10 bytes from the start of memory allocated by malloc()}} 1388 } 1389 1390 void testOffsetOfRegionFreedAfterFunctionCall() { 1391 int *p = malloc(sizeof(int)*2); 1392 p += 1; 1393 myfoo(p); 1394 free(p); // expected-warning{{Argument to free() is offset by 4 bytes from the start of memory allocated by malloc()}} 1395 } 1396 1397 void testFixManipulatedPointerBeforeFree() { 1398 int * array = malloc(sizeof(int)*2); 1399 array += 1; 1400 free(&array[-1]); // no-warning 1401 } 1402 1403 void testFixManipulatedPointerBeforeFree2() { 1404 char *r = malloc(sizeof(char)); 1405 r = r + 10; 1406 free(r-10); // no-warning 1407 } 1408 1409 void freeOffsetPointerPassedToFunction() { 1410 __int64_t *p = malloc(sizeof(__int64_t)*2); 1411 p[1] = 0; 1412 p += 1; 1413 myfooint(*p); // not passing the pointer, only a value pointed by pointer 1414 free(p); // expected-warning {{Argument to free() is offset by 8 bytes from the start of memory allocated by malloc()}} 1415 } 1416 1417 int arbitraryInt(); 1418 void freeUnknownOffsetPointer() { 1419 char *r = malloc(sizeof(char)); 1420 r = r + arbitraryInt(); // unable to reason about what the offset might be 1421 free(r); // no-warning 1422 } 1423 1424 void testFreeNonMallocPointerWithNoOffset() { 1425 char c; 1426 char *r = &c; 1427 r = r + 10; 1428 free(r-10); // expected-warning {{Argument to free() is the address of the local variable 'c', which is not memory allocated by malloc()}} 1429 } 1430 1431 void testFreeNonMallocPointerWithOffset() { 1432 char c; 1433 char *r = &c; 1434 free(r+1); // expected-warning {{Argument to free() is the address of the local variable 'c', which is not memory allocated by malloc()}} 1435 } 1436 1437 void testOffsetZeroDoubleFree() { 1438 int *array = malloc(sizeof(int)*2); 1439 int *p = &array[0]; 1440 free(p); 1441 free(&array[0]); // expected-warning{{Attempt to free released memory}} 1442 } 1443 1444 void testOffsetPassedToStrlen() { 1445 char * string = malloc(sizeof(char)*10); 1446 string += 1; 1447 int length = strlen(string); // expected-warning {{Potential leak of memory pointed to by 'string'}} 1448 } 1449 1450 void testOffsetPassedToStrlenThenFree() { 1451 char * string = malloc(sizeof(char)*10); 1452 string += 1; 1453 int length = strlen(string); 1454 free(string); // expected-warning {{Argument to free() is offset by 1 byte from the start of memory allocated by malloc()}} 1455 } 1456 1457 void testOffsetPassedAsConst() { 1458 char * string = malloc(sizeof(char)*10); 1459 string += 1; 1460 passConstPtr(string); 1461 free(string); // expected-warning {{Argument to free() is offset by 1 byte from the start of memory allocated by malloc()}} 1462 } 1463 1464 char **_vectorSegments; 1465 int _nVectorSegments; 1466 1467 void poolFreeC(void* s) { 1468 free(s); // no-warning 1469 } 1470 void freeMemory() { 1471 while (_nVectorSegments) { 1472 poolFreeC(_vectorSegments[_nVectorSegments++]); 1473 } 1474 } 1475 1476 // PR16730 1477 void testReallocEscaped(void **memory) { 1478 *memory = malloc(47); 1479 char *new_memory = realloc(*memory, 47); 1480 if (new_memory != 0) { 1481 *memory = new_memory; 1482 } 1483 } 1484 1485 // PR16558 1486 void *smallocNoWarn(size_t size) { 1487 if (size == 0) { 1488 return malloc(1); // this branch is never called 1489 } 1490 else { 1491 return malloc(size); 1492 } 1493 } 1494 1495 char *dupstrNoWarn(const char *s) { 1496 const int len = strlen(s); 1497 char *p = (char*) smallocNoWarn(len + 1); 1498 strcpy(p, s); // no-warning 1499 return p; 1500 } 1501 1502 void *smallocWarn(size_t size) { 1503 if (size == 2) { 1504 return malloc(1); 1505 } 1506 else { 1507 return malloc(size); 1508 } 1509 } 1510 1511 char *dupstrWarn(const char *s) { 1512 const int len = strlen(s); 1513 char *p = (char*) smallocWarn(len + 1); 1514 strcpy(p, s); // expected-warning{{String copy function overflows destination buffer}} 1515 return p; 1516 } 1517 1518 int *radar15580979() { 1519 int *data = (int *)malloc(32); 1520 int *p = data ?: (int*)malloc(32); // no warning 1521 return p; 1522 } 1523 1524 // ---------------------------------------------------------------------------- 1525 // False negatives. 1526 1527 void testMallocWithParam(int **p) { 1528 *p = (int*) malloc(sizeof(int)); 1529 *p = 0; // FIXME: should warn here 1530 } 1531 1532 void testMallocWithParam_2(int **p) { 1533 *p = (int*) malloc(sizeof(int)); // no-warning 1534 } 1535 1536 void testPassToSystemHeaderFunctionIndirectly() { 1537 int *p = malloc(4); 1538 p++; 1539 fakeSystemHeaderCallInt(p); 1540 // FIXME: This is a leak: if we think a system function won't free p, it 1541 // won't free (p-1) either. 1542 } 1543