malloc.mm revision ca23eb212c78ac5bc62d0881635579dbe7095639
1// RUN: %clang_cc1 -analyze -analyzer-checker=core,unix.Malloc -analyzer-store=region -verify %s 2#include "system-header-simulator-objc.h" 3 4typedef __typeof(sizeof(int)) size_t; 5void *malloc(size_t); 6void free(void *); 7 8// Done with headers. Start testing. 9void testNSDatafFreeWhenDoneNoError(NSUInteger dataLength) { 10 unsigned char *data = (unsigned char *)malloc(42); 11 NSData *nsdata = [NSData dataWithBytesNoCopy:data length:dataLength]; 12 free(data); // no warning 13} 14 15void testNSDataFreeWhenDoneYES(NSUInteger dataLength) { 16 unsigned char *data = (unsigned char *)malloc(42); 17 NSData *nsdata = [NSData dataWithBytesNoCopy:data length:dataLength freeWhenDone:1]; // no-warning 18} 19 20void testNSDataFreeWhenDoneYES2(NSUInteger dataLength) { 21 unsigned char *data = (unsigned char *)malloc(42); 22 NSData *nsdata = [[NSData alloc] initWithBytesNoCopy:data length:dataLength freeWhenDone:1]; // no-warning 23} 24 25 26void testNSStringFreeWhenDoneYES(NSUInteger dataLength) { 27 unsigned char *data = (unsigned char *)malloc(42); 28 NSString *nsstr = [[NSString alloc] initWithBytesNoCopy:data length:dataLength encoding:NSUTF8StringEncoding freeWhenDone:1]; // no-warning 29} 30 31void testNSStringFreeWhenDoneYES2(NSUInteger dataLength) { 32 unichar *data = (unichar*)malloc(42); 33 NSString *nsstr = [[NSString alloc] initWithCharactersNoCopy:data length:dataLength freeWhenDone:1]; // no-warning 34} 35 36 37void testNSDataFreeWhenDoneNO(NSUInteger dataLength) { 38 unsigned char *data = (unsigned char *)malloc(42); 39 NSData *nsdata = [NSData dataWithBytesNoCopy:data length:dataLength freeWhenDone:0]; // expected-warning{{leak}} 40} 41 42void testNSDataFreeWhenDoneNO2(NSUInteger dataLength) { 43 unsigned char *data = (unsigned char *)malloc(42); 44 NSData *nsdata = [[NSData alloc] initWithBytesNoCopy:data length:dataLength freeWhenDone:0]; // expected-warning{{leak}} 45} 46 47 48void testNSStringFreeWhenDoneNO(NSUInteger dataLength) { 49 unsigned char *data = (unsigned char *)malloc(42); 50 NSString *nsstr = [[NSString alloc] initWithBytesNoCopy:data length:dataLength encoding:NSUTF8StringEncoding freeWhenDone:0]; // expected-warning{{leak}} 51} 52 53void testNSStringFreeWhenDoneNO2(NSUInteger dataLength) { 54 unichar *data = (unichar*)malloc(42); 55 NSString *nsstr = [[NSString alloc] initWithCharactersNoCopy:data length:dataLength freeWhenDone:0]; // expected-warning{{leak}} 56} 57 58// TODO: False Negative. 59void testNSDatafFreeWhenDoneFN(NSUInteger dataLength) { 60 unsigned char *data = (unsigned char *)malloc(42); 61 NSData *nsdata = [NSData dataWithBytesNoCopy:data length:dataLength freeWhenDone:1]; 62 free(data); // false negative 63} 64 65// Test CF/NS...NoCopy. PR12100: Pointers can escape when custom deallocators are provided. 66void testNSDatafFreeWhenDone(NSUInteger dataLength) { 67 CFStringRef str; 68 char *bytes = (char*)malloc(12); 69 str = CFStringCreateWithCStringNoCopy(0, bytes, NSNEXTSTEPStringEncoding, 0); // no warning 70 CFRelease(str); // default allocator also frees bytes 71} 72 73void stringWithExternalContentsExample(void) { 74#define BufferSize 1000 75 CFMutableStringRef mutStr; 76 UniChar *myBuffer; 77 78 myBuffer = (UniChar *)malloc(BufferSize * sizeof(UniChar)); 79 80 mutStr = CFStringCreateMutableWithExternalCharactersNoCopy(0, myBuffer, 0, BufferSize, kCFAllocatorNull); // expected-warning{{leak}} 81 82 CFRelease(mutStr); 83 //free(myBuffer); 84} 85 86// PR12101 : pointers can escape through custom deallocators set on creation of a container. 87void TestCallbackReleasesMemory(CFDictionaryKeyCallBacks keyCallbacks) { 88 void *key = malloc(12); 89 void *val = malloc(12); 90 CFMutableDictionaryRef x = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &keyCallbacks, &kCFTypeDictionaryValueCallBacks); 91 CFDictionarySetValue(x, key, val); 92 return;// no-warning 93} 94