PR2599.m revision 65d39251ff57b8e33cf6d3a7fcc6aa1c6f8cdc68
1// RUN: %clang_cc1 -analyze -analyzer-checker=core.experimental -analyzer-constraints=basic -analyzer-store=basic -analyzer-check-objc-mem -fobjc-gc -verify %s 2// RUN: %clang_cc1 -analyze -analyzer-checker=core.experimental -analyzer-constraints=range -analyzer-store=basic -analyzer-check-objc-mem -fobjc-gc -verify %s 3// RUN: %clang_cc1 -analyze -analyzer-checker=core.experimental -analyzer-constraints=basic -analyzer-store=basic -analyzer-check-objc-mem -fobjc-gc -verify %s 4// RUN: %clang_cc1 -analyze -analyzer-checker=core.experimental -analyzer-constraints=range -analyzer-store=region -analyzer-check-objc-mem -fobjc-gc -verify %s 5 6typedef const void * CFTypeRef; 7typedef const struct __CFString * CFStringRef; 8typedef const struct __CFAllocator * CFAllocatorRef; 9typedef const struct __CFDictionary * CFDictionaryRef; 10CFTypeRef CFMakeCollectable(CFTypeRef cf) ; 11extern CFStringRef CFStringCreateWithFormat(CFAllocatorRef alloc, CFDictionaryRef formatOptions, CFStringRef format, ...); 12typedef signed char BOOL; 13typedef unsigned int NSUInteger; 14typedef 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 26NSCoding 27- (void)encodeWithCoder:(NSCoder *)aCoder; 28@end 29@interface NSObject <NSObject> {} 30- (id)init; 31+ (id)alloc; 32@end 33enum { 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 }; 34typedef 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 42extern 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 54static char *lorem = "fooBarBaz"; 55 56void NSLog(NSString *, ...); 57 58int 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} 67