Home | History | Annotate | Download | only in Analysis
      1 // RUN: %clang_cc1 -analyze -analyzer-checker=core,core.experimental -analyzer-constraints=basic -analyzer-store=basic -fobjc-gc -verify %s
      2 // RUN: %clang_cc1 -analyze -analyzer-checker=core,core.experimental -analyzer-constraints=range -analyzer-store=basic -fobjc-gc -verify %s
      3 // RUN: %clang_cc1 -analyze -analyzer-checker=core,core.experimental -analyzer-constraints=basic -analyzer-store=basic -fobjc-gc -verify %s
      4 // RUN: %clang_cc1 -analyze -analyzer-checker=core,core.experimental -analyzer-constraints=range -analyzer-store=region -fobjc-gc -verify %s
      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 
     56 void NSLog(NSString *, ...);
     57 
     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 }
     67