1*e5dd7070Spatrick // C, C++ test()2*e5dd7070Spatrickvoid test() { 3*e5dd7070Spatrick int *p = (int *)malloc(sizeof(int)); 4*e5dd7070Spatrick delete p; // warn 5*e5dd7070Spatrick } 6*e5dd7070Spatrick 7*e5dd7070Spatrick // C, C++ 8*e5dd7070Spatrick void __attribute((ownership_returns(malloc))) *user_malloc(size_t); 9*e5dd7070Spatrick test()10*e5dd7070Spatrickvoid test() { 11*e5dd7070Spatrick int *p = (int *)user_malloc(sizeof(int)); 12*e5dd7070Spatrick delete p; // warn 13*e5dd7070Spatrick } 14*e5dd7070Spatrick 15*e5dd7070Spatrick // C, C++ test()16*e5dd7070Spatrickvoid test() { 17*e5dd7070Spatrick int *p = new int; 18*e5dd7070Spatrick free(p); // warn 19*e5dd7070Spatrick } 20*e5dd7070Spatrick 21*e5dd7070Spatrick // C, C++ test()22*e5dd7070Spatrickvoid test() { 23*e5dd7070Spatrick int *p = new int[1]; 24*e5dd7070Spatrick realloc(p, sizeof(long)); // warn 25*e5dd7070Spatrick } 26*e5dd7070Spatrick 27*e5dd7070Spatrick // C, C++ 28*e5dd7070Spatrick template <typename T> 29*e5dd7070Spatrick struct SimpleSmartPointer { 30*e5dd7070Spatrick T *ptr; 31*e5dd7070Spatrick SimpleSmartPointerSimpleSmartPointer32*e5dd7070Spatrick explicit SimpleSmartPointer(T *p = 0) : ptr(p) {} ~SimpleSmartPointerSimpleSmartPointer33*e5dd7070Spatrick ~SimpleSmartPointer() { 34*e5dd7070Spatrick delete ptr; // warn 35*e5dd7070Spatrick } 36*e5dd7070Spatrick }; 37*e5dd7070Spatrick test()38*e5dd7070Spatrickvoid test() { 39*e5dd7070Spatrick SimpleSmartPointer<int> a((int *)malloc(4)); 40*e5dd7070Spatrick } 41*e5dd7070Spatrick 42*e5dd7070Spatrick // C++ test()43*e5dd7070Spatrickvoid test() { 44*e5dd7070Spatrick int *p = (int *)operator new(0); 45*e5dd7070Spatrick delete[] p; // warn 46*e5dd7070Spatrick } 47*e5dd7070Spatrick 48*e5dd7070Spatrick // Objective-C, C++ test(NSUInteger dataLength)49*e5dd7070Spatrickvoid test(NSUInteger dataLength) { 50*e5dd7070Spatrick int *p = new int; 51*e5dd7070Spatrick NSData *d = [NSData dataWithBytesNoCopy:p 52*e5dd7070Spatrick length:sizeof(int) freeWhenDone:1]; 53*e5dd7070Spatrick // warn +dataWithBytesNoCopy:length:freeWhenDone: cannot take 54*e5dd7070Spatrick // ownership of memory allocated by 'new' 55*e5dd7070Spatrick } 56*e5dd7070Spatrick 57