1 // RUN: %clang_cc1 -analyze -analyzer-checker=core,unix.Malloc -analyzer-store=region -verify -Wno-objc-root-class -fblocks %s 2 #include "Inputs/system-header-simulator-objc.h" 3 4 @class NSString; 5 typedef __typeof(sizeof(int)) size_t; 6 void *malloc(size_t); 7 void free(void *); 8 9 // RDar10579586 - Test use of malloc() with Objective-C string literal as a 10 // test condition. Not really a malloc() issue, but this also exercises 11 // the check that malloc() returns uninitialized memory. 12 @interface RDar10579586 13 struct rdar0579586_str { 14 char str_c; 15 }; 16 @end 17 18 void rdar10579586(char x); 19 20 @implementation RDar10579586 21 + (NSString *)foobar 22 { 23 struct rdar0579586_str *buffer = ((void*)0); 24 NSString *error = ((void*)0); 25 26 if ((buffer = malloc(sizeof(struct rdar0579586_str))) == ((void*)0)) 27 error = @"buffer allocation failure"; 28 29 if (error != ((void*)0)) 30 return error; 31 32 rdar10579586(buffer->str_c); // expected-warning {{Function call argument is an uninitialized value}} 33 free(buffer); 34 return ((void*)0); 35 } 36 @end 37 38 @interface MyArray : NSObject { 39 id * objects; 40 } 41 @end 42 43 void _ArrayCreate() { 44 MyArray *array = (MyArray *)malloc(12); 45 array = [array init]; 46 free(array); // no-warning 47 } 48 49 void testNSDataTruePositiveLeak() { 50 char *b = (char *)malloc(12); 51 NSData *d = [[NSData alloc] initWithBytes: b length: 12]; // expected-warning {{Potential leak of memory pointed to by 'b'}} 52 } 53 54 id wrapInNSValue() { 55 void *buffer = malloc(4); 56 return [NSValue valueWithPointer:buffer]; // no-warning 57 }