1*67e74705SXin Li// RUN: %clang_cc1 -triple i386-apple-darwin10 -analyze -analyzer-checker=core,osx.cocoa.NilArg,osx.cocoa.RetainCount,alpha.core -analyzer-store=region -analyzer-constraints=range -verify -Wno-objc-root-class %s 2*67e74705SXin Li// RUN: %clang_cc1 -triple i386-apple-darwin10 -analyze -analyzer-checker=core,osx.cocoa.NilArg,osx.cocoa.RetainCount,alpha.core -analyzer-store=region -analyzer-constraints=range -analyzer-config mode=shallow -verify -Wno-objc-root-class %s 3*67e74705SXin Li// RUN: %clang_cc1 -DTEST_64 -triple x86_64-apple-darwin10 -analyze -analyzer-checker=core,osx.cocoa.NilArg,osx.cocoa.RetainCount,alpha.core -analyzer-store=region -analyzer-constraints=range -verify -Wno-objc-root-class %s 4*67e74705SXin Li// RUN: %clang_cc1 -DOSATOMIC_USE_INLINED -triple i386-apple-darwin10 -analyze -analyzer-checker=core,osx.cocoa.NilArg,osx.cocoa.RetainCount,alpha.core -analyzer-store=region -analyzer-constraints=range -verify -Wno-objc-root-class %s 5*67e74705SXin Li 6*67e74705SXin Li//===----------------------------------------------------------------------===// 7*67e74705SXin Li// The following code is reduced using delta-debugging from 8*67e74705SXin Li// Foundation.h (Mac OS X). 9*67e74705SXin Li// 10*67e74705SXin Li// It includes the basic definitions for the test cases below. 11*67e74705SXin Li// Not directly including Foundation.h directly makes this test case 12*67e74705SXin Li// both svelte and portable to non-Mac platforms. 13*67e74705SXin Li//===----------------------------------------------------------------------===// 14*67e74705SXin Li 15*67e74705SXin Li#ifdef TEST_64 16*67e74705SXin Litypedef long long int64_t; 17*67e74705SXin Li_Bool OSAtomicCompareAndSwap64Barrier( int64_t __oldValue, int64_t __newValue, volatile int64_t *__theValue ); 18*67e74705SXin Li#define COMPARE_SWAP_BARRIER OSAtomicCompareAndSwap64Barrier 19*67e74705SXin Litypedef int64_t intptr_t; 20*67e74705SXin Li#else 21*67e74705SXin Litypedef int int32_t; 22*67e74705SXin Li_Bool OSAtomicCompareAndSwap32Barrier( int32_t __oldValue, int32_t __newValue, volatile int32_t *__theValue ); 23*67e74705SXin Li#define COMPARE_SWAP_BARRIER OSAtomicCompareAndSwap32Barrier 24*67e74705SXin Litypedef int32_t intptr_t; 25*67e74705SXin Li#endif 26*67e74705SXin Li 27*67e74705SXin Litypedef const void * CFTypeRef; 28*67e74705SXin Litypedef const struct __CFString * CFStringRef; 29*67e74705SXin Litypedef const struct __CFAllocator * CFAllocatorRef; 30*67e74705SXin Liextern const CFAllocatorRef kCFAllocatorDefault; 31*67e74705SXin Liextern CFTypeRef CFRetain(CFTypeRef cf); 32*67e74705SXin Livoid CFRelease(CFTypeRef cf); 33*67e74705SXin Litypedef const struct __CFDictionary * CFDictionaryRef; 34*67e74705SXin Liconst void *CFDictionaryGetValue(CFDictionaryRef theDict, const void *key); 35*67e74705SXin Liextern CFStringRef CFStringCreateWithFormat(CFAllocatorRef alloc, CFDictionaryRef formatOptions, CFStringRef format, ...); 36*67e74705SXin Litypedef signed char BOOL; 37*67e74705SXin Litypedef int NSInteger; 38*67e74705SXin Litypedef unsigned int NSUInteger; 39*67e74705SXin Li@class NSString, Protocol; 40*67e74705SXin Liextern void NSLog(NSString *format, ...) __attribute__((format(__NSString__, 1, 2))); 41*67e74705SXin Litypedef NSInteger NSComparisonResult; 42*67e74705SXin Litypedef struct _NSZone NSZone; 43*67e74705SXin Li@class NSInvocation, NSMethodSignature, NSCoder, NSString, NSEnumerator; 44*67e74705SXin Li@protocol NSObject 45*67e74705SXin Li- (BOOL)isEqual:(id)object; 46*67e74705SXin Li- (oneway void)release; 47*67e74705SXin Li- (id)retain; 48*67e74705SXin Li- (id)autorelease; 49*67e74705SXin Li@end 50*67e74705SXin Li@protocol NSCopying 51*67e74705SXin Li- (id)copyWithZone:(NSZone *)zone; 52*67e74705SXin Li@end 53*67e74705SXin Li@protocol NSMutableCopying 54*67e74705SXin Li- (id)mutableCopyWithZone:(NSZone *)zone; 55*67e74705SXin Li@end 56*67e74705SXin Li@protocol NSCoding 57*67e74705SXin Li- (void)encodeWithCoder:(NSCoder *)aCoder; 58*67e74705SXin Li@end 59*67e74705SXin Li@interface NSObject <NSObject> {} 60*67e74705SXin Li- (id)init; 61*67e74705SXin Li+ (id)alloc; 62*67e74705SXin Li@end 63*67e74705SXin Liextern id NSAllocateObject(Class aClass, NSUInteger extraBytes, NSZone *zone); 64*67e74705SXin Litypedef struct {} NSFastEnumerationState; 65*67e74705SXin Li@protocol NSFastEnumeration 66*67e74705SXin Li- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id *)stackbuf count:(NSUInteger)len; 67*67e74705SXin Li@end 68*67e74705SXin Li@class NSString; 69*67e74705SXin Litypedef struct _NSRange {} NSRange; 70*67e74705SXin Li@interface NSArray : NSObject <NSCopying, NSMutableCopying, NSCoding, NSFastEnumeration> 71*67e74705SXin Li- (NSUInteger)count; 72*67e74705SXin Li@end 73*67e74705SXin Li@interface NSMutableArray : NSArray 74*67e74705SXin Li- (void)addObject:(id)anObject; 75*67e74705SXin Li- (id)initWithCapacity:(NSUInteger)numItems; 76*67e74705SXin Li@end 77*67e74705SXin Litypedef unsigned short unichar; 78*67e74705SXin Li@class NSData, NSArray, NSDictionary, NSCharacterSet, NSData, NSURL, NSError, NSLocale; 79*67e74705SXin Litypedef NSUInteger NSStringCompareOptions; 80*67e74705SXin Li@interface NSString : NSObject <NSCopying, NSMutableCopying, NSCoding> - (NSUInteger)length; 81*67e74705SXin Li- (NSComparisonResult)compare:(NSString *)string; 82*67e74705SXin Li- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask; 83*67e74705SXin Li- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask range:(NSRange)compareRange; 84*67e74705SXin Li- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask range:(NSRange)compareRange locale:(id)locale; 85*67e74705SXin Li- (NSComparisonResult)caseInsensitiveCompare:(NSString *)string; 86*67e74705SXin Li- (NSArray *)componentsSeparatedByCharactersInSet:(NSCharacterSet *)separator; 87*67e74705SXin Li+ (id)stringWithFormat:(NSString *)format, ... __attribute__((format(__NSString__, 1, 2))); 88*67e74705SXin Li@end 89*67e74705SXin Li@interface NSSimpleCString : NSString {} @end 90*67e74705SXin Li@interface NSConstantString : NSSimpleCString @end 91*67e74705SXin Liextern void *_NSConstantStringClassReference; 92*67e74705SXin Li 93*67e74705SXin Li//===----------------------------------------------------------------------===// 94*67e74705SXin Li// Test cases. 95*67e74705SXin Li//===----------------------------------------------------------------------===// 96*67e74705SXin Li 97*67e74705SXin LiNSComparisonResult f1(NSString* s) { 98*67e74705SXin Li NSString *aString = 0; 99*67e74705SXin Li return [s compare:aString]; // expected-warning {{Argument to 'NSString' method 'compare:' cannot be nil}} 100*67e74705SXin Li} 101*67e74705SXin Li 102*67e74705SXin LiNSComparisonResult f2(NSString* s) { 103*67e74705SXin Li NSString *aString = 0; 104*67e74705SXin Li return [s caseInsensitiveCompare:aString]; // expected-warning {{Argument to 'NSString' method 'caseInsensitiveCompare:' cannot be nil}} 105*67e74705SXin Li} 106*67e74705SXin Li 107*67e74705SXin LiNSComparisonResult f3(NSString* s, NSStringCompareOptions op) { 108*67e74705SXin Li NSString *aString = 0; 109*67e74705SXin Li return [s compare:aString options:op]; // expected-warning {{Argument to 'NSString' method 'compare:options:' cannot be nil}} 110*67e74705SXin Li} 111*67e74705SXin Li 112*67e74705SXin LiNSComparisonResult f4(NSString* s, NSStringCompareOptions op, NSRange R) { 113*67e74705SXin Li NSString *aString = 0; 114*67e74705SXin Li return [s compare:aString options:op range:R]; // expected-warning {{Argument to 'NSString' method 'compare:options:range:' cannot be nil}} 115*67e74705SXin Li} 116*67e74705SXin Li 117*67e74705SXin LiNSComparisonResult f5(NSString* s, NSStringCompareOptions op, NSRange R) { 118*67e74705SXin Li NSString *aString = 0; 119*67e74705SXin Li return [s compare:aString options:op range:R locale:0]; // expected-warning {{Argument to 'NSString' method 'compare:options:range:locale:' cannot be nil}} 120*67e74705SXin Li} 121*67e74705SXin Li 122*67e74705SXin LiNSArray *f6(NSString* s) { 123*67e74705SXin Li return [s componentsSeparatedByCharactersInSet:0]; // expected-warning {{Argument to 'NSString' method 'componentsSeparatedByCharactersInSet:' cannot be nil}} 124*67e74705SXin Li} 125*67e74705SXin Li 126*67e74705SXin LiNSString* f7(NSString* s1, NSString* s2, NSString* s3) { 127*67e74705SXin Li 128*67e74705SXin Li NSString* s4 = (NSString*) 129*67e74705SXin Li CFStringCreateWithFormat(kCFAllocatorDefault, 0, // expected-warning{{leak}} 130*67e74705SXin Li (CFStringRef) __builtin___CFStringMakeConstantString("%@ %@ (%@)"), 131*67e74705SXin Li s1, s2, s3); 132*67e74705SXin Li 133*67e74705SXin Li CFRetain(s4); 134*67e74705SXin Li return s4; 135*67e74705SXin Li} 136*67e74705SXin Li 137*67e74705SXin LiNSMutableArray* f8() { 138*67e74705SXin Li 139*67e74705SXin Li NSString* s = [[NSString alloc] init]; 140*67e74705SXin Li NSMutableArray* a = [[NSMutableArray alloc] initWithCapacity:2]; 141*67e74705SXin Li [a addObject:s]; 142*67e74705SXin Li [s release]; // no-warning 143*67e74705SXin Li return a; 144*67e74705SXin Li} 145*67e74705SXin Li 146*67e74705SXin Livoid f9() { 147*67e74705SXin Li 148*67e74705SXin Li NSString* s = [[NSString alloc] init]; 149*67e74705SXin Li NSString* q = s; 150*67e74705SXin Li [s release]; 151*67e74705SXin Li [q release]; // expected-warning {{used after it is released}} 152*67e74705SXin Li} 153*67e74705SXin Li 154*67e74705SXin LiNSString* f10() { 155*67e74705SXin Li static NSString* s = 0; 156*67e74705SXin Li if (!s) s = [[NSString alloc] init]; 157*67e74705SXin Li return s; // no-warning 158*67e74705SXin Li} 159*67e74705SXin Li 160*67e74705SXin Li// Test case for regression reported in <rdar://problem/6452745>. 161*67e74705SXin Li// Essentially 's' should not be considered allocated on the false branch. 162*67e74705SXin Li// This exercises the 'EvalAssume' logic in GRTransferFuncs (CFRefCount.cpp). 163*67e74705SXin LiNSString* f11(CFDictionaryRef dict, const char* key) { 164*67e74705SXin Li NSString* s = (NSString*) CFDictionaryGetValue(dict, key); 165*67e74705SXin Li [s retain]; 166*67e74705SXin Li if (s) { 167*67e74705SXin Li [s release]; 168*67e74705SXin Li } 169*67e74705SXin Li return 0; 170*67e74705SXin Li} 171*67e74705SXin Li 172*67e74705SXin Li// Test case for passing a tracked object by-reference to a function we 173*67e74705SXin Li// don't understand. 174*67e74705SXin Livoid unknown_function_f12(NSString** s); 175*67e74705SXin Livoid f12() { 176*67e74705SXin Li NSString *string = [[NSString alloc] init]; 177*67e74705SXin Li unknown_function_f12(&string); // no-warning 178*67e74705SXin Li} 179*67e74705SXin Li 180*67e74705SXin Li// Test double release of CFString (PR 4014). 181*67e74705SXin Livoid f13(void) { 182*67e74705SXin Li CFStringRef ref = CFStringCreateWithFormat(kCFAllocatorDefault, ((void*)0), ((CFStringRef) __builtin___CFStringMakeConstantString ("" "%d" "")), 100); 183*67e74705SXin Li CFRelease(ref); 184*67e74705SXin Li CFRelease(ref); // expected-warning{{Reference-counted object is used after it is released}} 185*67e74705SXin Li} 186*67e74705SXin Li 187*67e74705SXin Li@interface MyString : NSString 188*67e74705SXin Li@end 189*67e74705SXin Li 190*67e74705SXin Livoid f14(MyString *s) { 191*67e74705SXin Li [s compare:0]; // expected-warning {{Argument to 'MyString' method 'compare:' cannot be nil}} 192*67e74705SXin Li} 193*67e74705SXin Li 194*67e74705SXin Li// Test regular use of -autorelease 195*67e74705SXin Li@interface TestAutorelease 196*67e74705SXin Li-(NSString*) getString; 197*67e74705SXin Li@end 198*67e74705SXin Li@implementation TestAutorelease 199*67e74705SXin Li-(NSString*) getString { 200*67e74705SXin Li NSString *str = [[NSString alloc] init]; 201*67e74705SXin Li return [str autorelease]; // no-warning 202*67e74705SXin Li} 203*67e74705SXin Li- (void)m1 204*67e74705SXin Li{ 205*67e74705SXin Li NSString *s = [[NSString alloc] init]; // expected-warning{{leak}} 206*67e74705SXin Li [s retain]; 207*67e74705SXin Li [s autorelease]; 208*67e74705SXin Li} 209*67e74705SXin Li- (void)m2 210*67e74705SXin Li{ 211*67e74705SXin Li NSString *s = [[[NSString alloc] init] autorelease]; // expected-warning{{leak}} 212*67e74705SXin Li [s retain]; 213*67e74705SXin Li} 214*67e74705SXin Li- (void)m3 215*67e74705SXin Li{ 216*67e74705SXin Li NSString *s = [[[NSString alloc] init] autorelease]; 217*67e74705SXin Li [s retain]; 218*67e74705SXin Li [s autorelease]; 219*67e74705SXin Li} 220*67e74705SXin Li- (void)m4 221*67e74705SXin Li{ 222*67e74705SXin Li NSString *s = [[NSString alloc] init]; // expected-warning{{leak}} 223*67e74705SXin Li [s retain]; 224*67e74705SXin Li} 225*67e74705SXin Li- (void)m5 226*67e74705SXin Li{ 227*67e74705SXin Li NSString *s = [[NSString alloc] init]; 228*67e74705SXin Li [s autorelease]; 229*67e74705SXin Li} 230*67e74705SXin Li@end 231*67e74705SXin Li 232*67e74705SXin Li@interface C1 : NSObject {} 233*67e74705SXin Li- (NSString*) getShared; 234*67e74705SXin Li+ (C1*) sharedInstance; 235*67e74705SXin Li@end 236*67e74705SXin Li@implementation C1 : NSObject {} 237*67e74705SXin Li- (NSString*) getShared { 238*67e74705SXin Li static NSString* s = 0; 239*67e74705SXin Li if (!s) s = [[NSString alloc] init]; 240*67e74705SXin Li return s; // no-warning 241*67e74705SXin Li} 242*67e74705SXin Li+ (C1 *)sharedInstance { 243*67e74705SXin Li static C1 *sharedInstance = 0; 244*67e74705SXin Li if (!sharedInstance) { 245*67e74705SXin Li sharedInstance = [[C1 alloc] init]; 246*67e74705SXin Li } 247*67e74705SXin Li return sharedInstance; // no-warning 248*67e74705SXin Li} 249*67e74705SXin Li@end 250*67e74705SXin Li 251*67e74705SXin Li@interface SharedClass : NSObject 252*67e74705SXin Li+ (id)sharedInstance; 253*67e74705SXin Li- (id)notShared; 254*67e74705SXin Li@end 255*67e74705SXin Li 256*67e74705SXin Li@implementation SharedClass 257*67e74705SXin Li 258*67e74705SXin Li- (id)_init { 259*67e74705SXin Li if ((self = [super init])) { 260*67e74705SXin Li NSLog(@"Bar"); 261*67e74705SXin Li } 262*67e74705SXin Li return self; 263*67e74705SXin Li} 264*67e74705SXin Li 265*67e74705SXin Li- (id)notShared { 266*67e74705SXin Li return [[SharedClass alloc] _init]; // expected-warning{{leak}} 267*67e74705SXin Li} 268*67e74705SXin Li 269*67e74705SXin Li+ (id)sharedInstance { 270*67e74705SXin Li static SharedClass *_sharedInstance = 0; 271*67e74705SXin Li if (!_sharedInstance) { 272*67e74705SXin Li _sharedInstance = [[SharedClass alloc] _init]; 273*67e74705SXin Li } 274*67e74705SXin Li return _sharedInstance; // no-warning 275*67e74705SXin Li} 276*67e74705SXin Li@end 277*67e74705SXin Li 278*67e74705SXin Liid testSharedClassFromFunction() { 279*67e74705SXin Li return [[SharedClass alloc] _init]; // no-warning 280*67e74705SXin Li} 281*67e74705SXin Li 282*67e74705SXin Li#if !(defined(OSATOMIC_USE_INLINED) && OSATOMIC_USE_INLINED) 283*67e74705SXin Li// Test OSCompareAndSwap 284*67e74705SXin Li_Bool OSAtomicCompareAndSwapPtr( void *__oldValue, void *__newValue, void * volatile *__theValue ); 285*67e74705SXin Liextern BOOL objc_atomicCompareAndSwapPtr(id predicate, id replacement, volatile id *objectLocation); 286*67e74705SXin Li#else 287*67e74705SXin Li// Test that the body farm models are still used even when a body is available. 288*67e74705SXin Li_Bool opaque_OSAtomicCompareAndSwapPtr( void *__oldValue, void *__newValue, void * volatile *__theValue ); 289*67e74705SXin Li_Bool OSAtomicCompareAndSwapPtr( void *__oldValue, void *__newValue, void * volatile *__theValue ) { 290*67e74705SXin Li return opaque_OSAtomicCompareAndSwapPtr(__oldValue, __newValue, __theValue); 291*67e74705SXin Li} 292*67e74705SXin Li 293*67e74705SXin Liextern BOOL opaque_objc_atomicCompareAndSwapPtr(id predicate, id replacement, volatile id *objectLocation); 294*67e74705SXin Liextern BOOL objc_atomicCompareAndSwapPtr(id predicate, id replacement, volatile id *objectLocation) { 295*67e74705SXin Li return opaque_objc_atomicCompareAndSwapPtr(predicate, replacement, objectLocation); 296*67e74705SXin Li} 297*67e74705SXin Li#endif 298*67e74705SXin Li 299*67e74705SXin Livoid testOSCompareAndSwap() { 300*67e74705SXin Li NSString *old = 0; 301*67e74705SXin Li NSString *s = [[NSString alloc] init]; // no-warning 302*67e74705SXin Li if (!OSAtomicCompareAndSwapPtr(0, s, (void**) &old)) 303*67e74705SXin Li [s release]; 304*67e74705SXin Li else 305*67e74705SXin Li [old release]; 306*67e74705SXin Li} 307*67e74705SXin Li 308*67e74705SXin Livoid testOSCompareAndSwapXXBarrier_local() { 309*67e74705SXin Li NSString *old = 0; 310*67e74705SXin Li NSString *s = [[NSString alloc] init]; // no-warning 311*67e74705SXin Li if (!COMPARE_SWAP_BARRIER((intptr_t) 0, (intptr_t) s, (intptr_t*) &old)) 312*67e74705SXin Li [s release]; 313*67e74705SXin Li else 314*67e74705SXin Li [old release]; 315*67e74705SXin Li} 316*67e74705SXin Li 317*67e74705SXin Livoid testOSCompareAndSwapXXBarrier_local_no_direct_release() { 318*67e74705SXin Li NSString *old = 0; 319*67e74705SXin Li NSString *s = [[NSString alloc] init]; // no-warning 320*67e74705SXin Li if (!COMPARE_SWAP_BARRIER((intptr_t) 0, (intptr_t) s, (intptr_t*) &old)) 321*67e74705SXin Li return; 322*67e74705SXin Li else 323*67e74705SXin Li [old release]; 324*67e74705SXin Li} 325*67e74705SXin Li 326*67e74705SXin Liint testOSCompareAndSwapXXBarrier_id(Class myclass, id xclass) { 327*67e74705SXin Li if (COMPARE_SWAP_BARRIER(0, (intptr_t) myclass, (intptr_t*) &xclass)) 328*67e74705SXin Li return 1; 329*67e74705SXin Li return 0; 330*67e74705SXin Li} 331*67e74705SXin Li 332*67e74705SXin Livoid test_objc_atomicCompareAndSwap_local() { 333*67e74705SXin Li NSString *old = 0; 334*67e74705SXin Li NSString *s = [[NSString alloc] init]; // no-warning 335*67e74705SXin Li if (!objc_atomicCompareAndSwapPtr(0, s, &old)) 336*67e74705SXin Li [s release]; 337*67e74705SXin Li else 338*67e74705SXin Li [old release]; 339*67e74705SXin Li} 340*67e74705SXin Li 341*67e74705SXin Livoid test_objc_atomicCompareAndSwap_local_no_direct_release() { 342*67e74705SXin Li NSString *old = 0; 343*67e74705SXin Li NSString *s = [[NSString alloc] init]; // no-warning 344*67e74705SXin Li if (!objc_atomicCompareAndSwapPtr(0, s, &old)) 345*67e74705SXin Li return; 346*67e74705SXin Li else 347*67e74705SXin Li [old release]; 348*67e74705SXin Li} 349*67e74705SXin Li 350*67e74705SXin Livoid test_objc_atomicCompareAndSwap_parameter(NSString **old) { 351*67e74705SXin Li NSString *s = [[NSString alloc] init]; // no-warning 352*67e74705SXin Li if (!objc_atomicCompareAndSwapPtr(0, s, old)) 353*67e74705SXin Li [s release]; 354*67e74705SXin Li else 355*67e74705SXin Li [*old release]; 356*67e74705SXin Li} 357*67e74705SXin Li 358*67e74705SXin Livoid test_objc_atomicCompareAndSwap_parameter_no_direct_release(NSString **old) { 359*67e74705SXin Li NSString *s = [[NSString alloc] init]; // expected-warning{{leak}} 360*67e74705SXin Li if (!objc_atomicCompareAndSwapPtr(0, s, old)) 361*67e74705SXin Li return; 362*67e74705SXin Li else 363*67e74705SXin Li [*old release]; 364*67e74705SXin Li} 365*67e74705SXin Li 366*67e74705SXin Li 367*67e74705SXin Li// Test stringWithFormat (<rdar://problem/6815234>) 368*67e74705SXin Livoid test_stringWithFormat() { 369*67e74705SXin Li NSString *string = [[NSString stringWithFormat:@"%ld", (long) 100] retain]; 370*67e74705SXin Li [string release]; 371*67e74705SXin Li [string release]; // expected-warning{{Incorrect decrement of the reference count}} 372*67e74705SXin Li} 373*67e74705SXin Li 374*67e74705SXin Li// Test isTrackedObjectType(). 375*67e74705SXin Litypedef NSString* WonkyTypedef; 376*67e74705SXin Li@interface TestIsTracked 377*67e74705SXin Li+ (WonkyTypedef)newString; 378*67e74705SXin Li@end 379*67e74705SXin Li 380*67e74705SXin Livoid test_isTrackedObjectType(void) { 381*67e74705SXin Li NSString *str = [TestIsTracked newString]; // expected-warning{{Potential leak}} 382*67e74705SXin Li} 383*67e74705SXin Li 384*67e74705SXin Li// Test isTrackedCFObjectType(). 385*67e74705SXin Li@interface TestIsCFTracked 386*67e74705SXin Li+ (CFStringRef) badNewCFString; 387*67e74705SXin Li+ (CFStringRef) newCFString; 388*67e74705SXin Li@end 389*67e74705SXin Li 390*67e74705SXin Li@implementation TestIsCFTracked 391*67e74705SXin Li+ (CFStringRef) newCFString { 392*67e74705SXin Li return CFStringCreateWithFormat(kCFAllocatorDefault, ((void*)0), ((CFStringRef) __builtin___CFStringMakeConstantString ("" "%d" "")), 100); // no-warning 393*67e74705SXin Li} 394*67e74705SXin Li+ (CFStringRef) badNewCFString { 395*67e74705SXin Li return CFStringCreateWithFormat(kCFAllocatorDefault, ((void*)0), ((CFStringRef) __builtin___CFStringMakeConstantString ("" "%d" "")), 100); // expected-warning{{leak}} 396*67e74705SXin Li} 397*67e74705SXin Li 398*67e74705SXin Li// Test @synchronized 399*67e74705SXin Livoid test_synchronized(id x) { 400*67e74705SXin Li @synchronized(x) { 401*67e74705SXin Li NSString *string = [[NSString stringWithFormat:@"%ld", (long) 100] retain]; // expected-warning {{leak}} 402*67e74705SXin Li } 403*67e74705SXin Li} 404*67e74705SXin Li@end 405*67e74705SXin Li 406*67e74705SXin Livoid testOSCompareAndSwapXXBarrier_parameter(NSString **old) { 407*67e74705SXin Li NSString *s = [[NSString alloc] init]; // no-warning 408*67e74705SXin Li if (!COMPARE_SWAP_BARRIER((intptr_t) 0, (intptr_t) s, (intptr_t*) old)) 409*67e74705SXin Li [s release]; 410*67e74705SXin Li else 411*67e74705SXin Li [*old release]; 412*67e74705SXin Li} 413*67e74705SXin Li 414*67e74705SXin Livoid testOSCompareAndSwapXXBarrier_parameter_no_direct_release(NSString **old) { 415*67e74705SXin Li NSString *s = [[NSString alloc] init]; // no-warning 416*67e74705SXin Li if (!COMPARE_SWAP_BARRIER((intptr_t) 0, (intptr_t) s, (intptr_t*) old)) 417*67e74705SXin Li [s release]; 418*67e74705SXin Li else 419*67e74705SXin Li return; 420*67e74705SXin Li} 421*67e74705SXin Li 422*67e74705SXin Li@interface AlwaysInlineBodyFarmBodies : NSObject { 423*67e74705SXin Li NSString *_value; 424*67e74705SXin Li} 425*67e74705SXin Li - (NSString *)_value; 426*67e74705SXin Li - (void)callValue; 427*67e74705SXin Li@end 428*67e74705SXin Li 429*67e74705SXin Li@implementation AlwaysInlineBodyFarmBodies 430*67e74705SXin Li 431*67e74705SXin Li- (NSString *)_value { 432*67e74705SXin Li if (!_value) { 433*67e74705SXin Li NSString *s = [[NSString alloc] init]; 434*67e74705SXin Li if (!OSAtomicCompareAndSwapPtr(0, s, (void**)&_value)) { 435*67e74705SXin Li [s release]; 436*67e74705SXin Li } 437*67e74705SXin Li } 438*67e74705SXin Li return _value; 439*67e74705SXin Li} 440*67e74705SXin Li 441*67e74705SXin Li- (void)callValue { 442*67e74705SXin Li [self _value]; 443*67e74705SXin Li} 444*67e74705SXin Li@end