Daniel Dunbar | a572887 | 2009-12-15 20:14:24 +0000 | [diff] [blame] | 1 | // RUN: %clang_cc1 -analyze -analyzer-experimental-internal-checks -analyzer-constraints=basic -analyzer-store=basic -checker-cfref -fobjc-gc -verify %s |
| 2 | // RUN: %clang_cc1 -analyze -analyzer-experimental-internal-checks -analyzer-constraints=range -analyzer-store=basic -checker-cfref -fobjc-gc -verify %s |
| 3 | // RUN: %clang_cc1 -analyze -analyzer-experimental-internal-checks -analyzer-constraints=basic -analyzer-store=basic -checker-cfref -fobjc-gc -verify %s |
| 4 | // RUN: %clang_cc1 -analyze -analyzer-experimental-internal-checks -analyzer-constraints=range -analyzer-store=region -checker-cfref -fobjc-gc -verify %s |
Ted Kremenek | d3d4f57 | 2009-02-23 01:29:25 +0000 | [diff] [blame] | 5 | |
| 6 | typedef const void * CFTypeRef; |
| 7 | typedef const struct __CFString * CFStringRef; |
| 8 | typedef const struct __CFAllocator * CFAllocatorRef; |
| 9 | typedef const struct __CFDictionary * CFDictionaryRef; |
| 10 | CFTypeRef CFMakeCollectable(CFTypeRef cf) ; |
| 11 | extern CFStringRef CFStringCreateWithFormat(CFAllocatorRef alloc, CFDictionaryRef formatOptions, CFStringRef format, ...); |
| 12 | typedef signed char BOOL; |
| 13 | typedef unsigned int NSUInteger; |
| 14 | typedef struct _NSZone NSZone; |
| 15 | @class NSInvocation, NSMethodSignature, NSCoder, NSString, NSEnumerator; |
| 16 | @protocol NSObject |
| 17 | - (BOOL)isEqual:(id)object; |
| 18 | - (id)autorelease; |
| 19 | @end |
| 20 | @protocol NSCopying |
| 21 | - (id)copyWithZone:(NSZone *)zone; |
| 22 | @end @protocol NSMutableCopying |
| 23 | - (id)mutableCopyWithZone:(NSZone *)zone; |
| 24 | @end |
| 25 | @protocol |
| 26 | NSCoding |
| 27 | - (void)encodeWithCoder:(NSCoder *)aCoder; |
| 28 | @end |
| 29 | @interface NSObject <NSObject> {} |
| 30 | - (id)init; |
| 31 | + (id)alloc; |
| 32 | @end |
| 33 | enum { NSASCIIStringEncoding = 1, NSNEXTSTEPStringEncoding = 2, NSJapaneseEUCStringEncoding = 3, NSUTF8StringEncoding = 4, NSISOLatin1StringEncoding = 5, NSSymbolStringEncoding = 6, NSNonLossyASCIIStringEncoding = 7, NSShiftJISStringEncoding = 8, NSISOLatin2StringEncoding = 9, NSUnicodeStringEncoding = 10, NSWindowsCP1251StringEncoding = 11, NSWindowsCP1252StringEncoding = 12, NSWindowsCP1253StringEncoding = 13, NSWindowsCP1254StringEncoding = 14, NSWindowsCP1250StringEncoding = 15, NSISO2022JPStringEncoding = 21, NSMacOSRomanStringEncoding = 30, NSUTF16StringEncoding = NSUnicodeStringEncoding, NSUTF16BigEndianStringEncoding = 0x90000100, NSUTF16LittleEndianStringEncoding = 0x94000100, NSUTF32StringEncoding = 0x8c000100, NSUTF32BigEndianStringEncoding = 0x98000100, NSUTF32LittleEndianStringEncoding = 0x9c000100 }; |
| 34 | typedef NSUInteger NSStringEncoding; |
| 35 | @interface NSString : NSObject <NSCopying, NSMutableCopying, NSCoding> |
| 36 | - (NSUInteger)length; |
| 37 | - (id)initWithBytesNoCopy:(void *)bytes length:(NSUInteger)len encoding:(NSStringEncoding)encoding freeWhenDone:(BOOL)freeBuffer; |
| 38 | @end |
| 39 | @interface NSAutoreleasePool : NSObject {} |
| 40 | - (void)drain; |
| 41 | @end |
| 42 | extern NSString * const NSXMLParserErrorDomain ; |
| 43 | |
| 44 | // The actual test case. UTIL_AUTORELEASE_CF_AS_ID is a macro that doesn't |
| 45 | // actually do what it was intended to. |
| 46 | |
| 47 | #define NSSTRINGWRAPPER(bytes,len) \ |
| 48 | [[[NSString alloc] initWithBytesNoCopy: (void*)(bytes) length: (len) encoding: NSUTF8StringEncoding freeWhenDone: (BOOL)0] autorelease] |
| 49 | |
| 50 | #define UTIL_AUTORELEASE_CF_AS_ID(cf) ( (((void*)0) == (cf)) ? ((void*)0) : [(id) CFMakeCollectable( (CFTypeRef) cf) autorelease] ) |
| 51 | |
| 52 | #define UTIL_AUTORELEASE_CF_AS_ID_WITHOUT_TEST(cf) ( [(id) CFMakeCollectable( (CFTypeRef) cf) autorelease] ) |
| 53 | |
| 54 | static char *lorem = "fooBarBaz"; |
| 55 | |
Chris Lattner | e030358 | 2010-01-09 20:43:19 +0000 | [diff] [blame^] | 56 | void NSLog(NSString *, ...); |
| 57 | |
Ted Kremenek | d3d4f57 | 2009-02-23 01:29:25 +0000 | [diff] [blame] | 58 | int main (int argc, const char * argv[]) { |
| 59 | NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; |
| 60 | NSString *tmp1 = NSSTRINGWRAPPER(lorem, 6); // no-warning |
| 61 | NSString *tmp2 = UTIL_AUTORELEASE_CF_AS_ID( CFStringCreateWithFormat(((void*)0), ((void*)0), ((CFStringRef) __builtin___CFStringMakeConstantString ("" "lorem: %@" "")), tmp1) ); // expected-warning 2 {{leak}} |
| 62 | NSString *tmp3 = UTIL_AUTORELEASE_CF_AS_ID_WITHOUT_TEST( CFStringCreateWithFormat(((void*)0), ((void*)0), ((CFStringRef) __builtin___CFStringMakeConstantString ("" "lorem: %@" "")), tmp1) ); |
| 63 | NSLog(@"tmp2: %@ tmp3: %@", tmp2, tmp3); |
| 64 | [pool drain]; |
| 65 | return 0; |
| 66 | } |