1*67e74705SXin Li// RUN: %clang_cc1 -analyze -analyzer-checker=core,cplusplus.NewDelete -std=c++11 -fblocks -verify %s 2*67e74705SXin Li// RUN: %clang_cc1 -analyze -analyzer-checker=core,cplusplus.NewDelete,cplusplus.NewDeleteLeaks -std=c++11 -DLEAKS -fblocks -verify %s 3*67e74705SXin Li#include "Inputs/system-header-simulator-cxx.h" 4*67e74705SXin Li#include "Inputs/system-header-simulator-objc.h" 5*67e74705SXin Li 6*67e74705SXin Litypedef __typeof__(sizeof(int)) size_t; 7*67e74705SXin Liextern "C" void *malloc(size_t); 8*67e74705SXin Liextern "C" void *alloca(size_t); 9*67e74705SXin Liextern "C" void free(void *); 10*67e74705SXin Li 11*67e74705SXin Li//---------------------------------------------------------------------------- 12*67e74705SXin Li// Check for intersections with unix.Malloc and unix.MallocWithAnnotations 13*67e74705SXin Li// checkers bounded with cplusplus.NewDelete. 14*67e74705SXin Li//---------------------------------------------------------------------------- 15*67e74705SXin Li 16*67e74705SXin Li//----- malloc()/free() are subjects of unix.Malloc and unix.MallocWithAnnotations 17*67e74705SXin Livoid testMallocFreeNoWarn() { 18*67e74705SXin Li int i; 19*67e74705SXin Li free(&i); // no warn 20*67e74705SXin Li 21*67e74705SXin Li int *p1 = (int *)malloc(sizeof(int)); 22*67e74705SXin Li free(++p1); // no warn 23*67e74705SXin Li 24*67e74705SXin Li int *p2 = (int *)malloc(sizeof(int)); 25*67e74705SXin Li free(p2); 26*67e74705SXin Li free(p2); // no warn 27*67e74705SXin Li 28*67e74705SXin Li int *p3 = (int *)malloc(sizeof(int)); // no warn 29*67e74705SXin Li 30*67e74705SXin Li int *p4 = (int *)malloc(sizeof(int)); 31*67e74705SXin Li free(p4); 32*67e74705SXin Li int j = *p4; // no warn 33*67e74705SXin Li 34*67e74705SXin Li int *p5 = (int *)alloca(sizeof(int)); 35*67e74705SXin Li free(p5); // no warn 36*67e74705SXin Li} 37*67e74705SXin Li 38*67e74705SXin Livoid testDeleteMalloced() { 39*67e74705SXin Li int *p1 = (int *)malloc(sizeof(int)); 40*67e74705SXin Li delete p1; // no warn 41*67e74705SXin Li 42*67e74705SXin Li int *p2 = (int *)__builtin_alloca(sizeof(int)); 43*67e74705SXin Li delete p2; // no warn 44*67e74705SXin Li} 45*67e74705SXin Li 46*67e74705SXin Livoid testUseZeroAllocatedMalloced() { 47*67e74705SXin Li int *p1 = (int *)malloc(0); 48*67e74705SXin Li *p1 = 1; // no warn 49*67e74705SXin Li} 50*67e74705SXin Li 51*67e74705SXin Li//----- Test free standard new 52*67e74705SXin Livoid testFreeOpNew() { 53*67e74705SXin Li void *p = operator new(0); 54*67e74705SXin Li free(p); 55*67e74705SXin Li} 56*67e74705SXin Li#ifdef LEAKS 57*67e74705SXin Li// expected-warning@-2 {{Potential leak of memory pointed to by 'p'}} 58*67e74705SXin Li#endif 59*67e74705SXin Li 60*67e74705SXin Livoid testFreeNewExpr() { 61*67e74705SXin Li int *p = new int; 62*67e74705SXin Li free(p); 63*67e74705SXin Li} 64*67e74705SXin Li#ifdef LEAKS 65*67e74705SXin Li// expected-warning@-2 {{Potential leak of memory pointed to by 'p'}} 66*67e74705SXin Li#endif 67*67e74705SXin Li 68*67e74705SXin Livoid testObjcFreeNewed() { 69*67e74705SXin Li int *p = new int; 70*67e74705SXin Li NSData *nsdata = [NSData dataWithBytesNoCopy:p length:sizeof(int) freeWhenDone:1]; 71*67e74705SXin Li#ifdef LEAKS 72*67e74705SXin Li // expected-warning@-2 {{Potential leak of memory pointed to by 'p'}} 73*67e74705SXin Li#endif 74*67e74705SXin Li} 75*67e74705SXin Li 76*67e74705SXin Livoid testFreeAfterDelete() { 77*67e74705SXin Li int *p = new int; 78*67e74705SXin Li delete p; 79*67e74705SXin Li free(p); // expected-warning{{Use of memory after it is freed}} 80*67e74705SXin Li} 81*67e74705SXin Li 82*67e74705SXin Livoid testStandardPlacementNewAfterDelete() { 83*67e74705SXin Li int *p = new int; 84*67e74705SXin Li delete p; 85*67e74705SXin Li p = new(p) int; // expected-warning{{Use of memory after it is freed}} 86*67e74705SXin Li} 87