PR2599.m revision c037eac3bda3c636c961aab6377beea3242e81e4
1// RUN: clang-cc -analyze -analyzer-constraints=basic -analyzer-store=basic -checker-cfref -fobjc-gc -verify %s &&
2// RUN: clang-cc -analyze -analyzer-constraints=basic -analyzer-store=basic-old-cast -checker-cfref -fobjc-gc -verify %s &&
3// RUN: clang-cc -analyze -analyzer-constraints=range -analyzer-store=basic -checker-cfref -fobjc-gc -verify %s &&
4// RUN: clang-cc -analyze -analyzer-constraints=range -analyzer-store=basic-old-cast -checker-cfref -fobjc-gc -verify %s &&
5// RUN: clang-cc -analyze -analyzer-constraints=basic -analyzer-store=basic -checker-cfref -fobjc-gc -verify %s &&
6// RUN: clang-cc -analyze -analyzer-constraints=basic -analyzer-store=basic-old-cast -checker-cfref -fobjc-gc -verify %s &&
7// RUN: clang-cc -analyze -analyzer-constraints=range -analyzer-store=region -checker-cfref -fobjc-gc -verify %s
8
9typedef const void * CFTypeRef;
10typedef const struct __CFString * CFStringRef;
11typedef const struct __CFAllocator * CFAllocatorRef;
12typedef const struct __CFDictionary * CFDictionaryRef;
13CFTypeRef CFMakeCollectable(CFTypeRef cf) ;
14extern CFStringRef CFStringCreateWithFormat(CFAllocatorRef alloc, CFDictionaryRef formatOptions, CFStringRef format, ...);
15typedef signed char BOOL;
16typedef unsigned int NSUInteger;
17typedef struct _NSZone NSZone;
18@class NSInvocation, NSMethodSignature, NSCoder, NSString, NSEnumerator;
19@protocol NSObject
20- (BOOL)isEqual:(id)object;
21- (id)autorelease;
22@end
23@protocol NSCopying
24- (id)copyWithZone:(NSZone *)zone;
25@end  @protocol NSMutableCopying
26- (id)mutableCopyWithZone:(NSZone *)zone;
27@end
28@protocol
29NSCoding
30- (void)encodeWithCoder:(NSCoder *)aCoder;
31@end
32@interface NSObject <NSObject> {}
33- (id)init;
34+ (id)alloc;
35@end
36enum { 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  };
37typedef NSUInteger NSStringEncoding;
38@interface NSString : NSObject <NSCopying, NSMutableCopying, NSCoding>
39- (NSUInteger)length;
40- (id)initWithBytesNoCopy:(void *)bytes length:(NSUInteger)len encoding:(NSStringEncoding)encoding freeWhenDone:(BOOL)freeBuffer;
41@end
42@interface NSAutoreleasePool : NSObject {}
43- (void)drain;
44@end
45extern NSString * const NSXMLParserErrorDomain ;
46
47// The actual test case.  UTIL_AUTORELEASE_CF_AS_ID is a macro that doesn't
48// actually do what it was intended to.
49
50#define NSSTRINGWRAPPER(bytes,len) \
51  [[[NSString alloc] initWithBytesNoCopy: (void*)(bytes) length: (len) encoding: NSUTF8StringEncoding freeWhenDone: (BOOL)0] autorelease]
52
53#define UTIL_AUTORELEASE_CF_AS_ID(cf) ( (((void*)0) == (cf)) ? ((void*)0) : [(id) CFMakeCollectable( (CFTypeRef) cf) autorelease] )
54
55#define UTIL_AUTORELEASE_CF_AS_ID_WITHOUT_TEST(cf) ( [(id) CFMakeCollectable( (CFTypeRef) cf) autorelease] )
56
57static char *lorem = "fooBarBaz";
58
59int main (int argc, const char * argv[]) {
60  NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
61  NSString *tmp1 = NSSTRINGWRAPPER(lorem, 6); // no-warning
62  NSString *tmp2 = UTIL_AUTORELEASE_CF_AS_ID( CFStringCreateWithFormat(((void*)0), ((void*)0), ((CFStringRef) __builtin___CFStringMakeConstantString ("" "lorem: %@" "")), tmp1) );  // expected-warning 2 {{leak}}
63  NSString *tmp3 = UTIL_AUTORELEASE_CF_AS_ID_WITHOUT_TEST( CFStringCreateWithFormat(((void*)0), ((void*)0), ((CFStringRef) __builtin___CFStringMakeConstantString ("" "lorem: %@" "")), tmp1) );
64  NSLog(@"tmp2: %@ tmp3: %@", tmp2, tmp3);
65  [pool drain];
66  return 0;
67}
68