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