1// RUN: %clang_cc1 -analyze -analyzer-checker=core,osx.cocoa.RetainCount -analyzer-store=region -Wno-objc-root-class -verify %s 2 3 4//===----------------------------------------------------------------------===// 5// The following code is reduced using delta-debugging from 6// Foundation.h (Mac OS X). 7// 8// It includes the basic definitions for the test cases below. 9// Not directly including Foundation.h directly makes this test case 10// both svelte and portable to non-Mac platforms. 11//===----------------------------------------------------------------------===// 12 13typedef const void * CFTypeRef; 14typedef const struct __CFString * CFStringRef; 15typedef const struct __CFAllocator * CFAllocatorRef; 16extern const CFAllocatorRef kCFAllocatorDefault; 17extern CFTypeRef CFRetain(CFTypeRef cf); 18void CFRelease(CFTypeRef cf); 19typedef const struct __CFDictionary * CFDictionaryRef; 20const void *CFDictionaryGetValue(CFDictionaryRef theDict, const void *key); 21extern CFStringRef CFStringCreateWithFormat(CFAllocatorRef alloc, CFDictionaryRef formatOptions, CFStringRef format, ...); 22typedef signed char BOOL; 23typedef int NSInteger; 24typedef unsigned int NSUInteger; 25typedef struct objc_selector *SEL; 26@class NSString, Protocol; 27extern void NSLog(NSString *format, ...) __attribute__((format(__NSString__, 1, 2))); 28typedef NSInteger NSComparisonResult; 29typedef struct _NSZone NSZone; 30@class NSInvocation, NSMethodSignature, NSCoder, NSString, NSEnumerator; 31@protocol NSObject 32- (BOOL)isEqual:(id)object; 33- (oneway void)release; 34- (Class)class; 35- (id)retain; 36@end 37@protocol NSCopying 38- (id)copyWithZone:(NSZone *)zone; 39@end 40@protocol NSMutableCopying 41- (id)mutableCopyWithZone:(NSZone *)zone; 42@end 43@protocol NSCoding 44- (void)encodeWithCoder:(NSCoder *)aCoder; 45@end 46@interface NSObject <NSObject> {} 47- (id)init; 48+ (id)alloc; 49+ (Class)class; 50- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait; 51@end 52extern id NSAllocateObject(Class aClass, NSUInteger extraBytes, NSZone *zone); 53typedef struct {} NSFastEnumerationState; 54@protocol NSFastEnumeration 55- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id *)stackbuf count:(NSUInteger)len; 56@end 57@class NSString; 58typedef struct _NSRange {} NSRange; 59@interface NSArray : NSObject <NSCopying, NSMutableCopying, NSCoding, NSFastEnumeration> 60- (NSUInteger)count; 61@end 62@interface NSMutableArray : NSArray 63- (void)addObject:(id)anObject; 64- (id)initWithCapacity:(NSUInteger)numItems; 65@end 66typedef unsigned short unichar; 67@class NSData, NSArray, NSDictionary, NSCharacterSet, NSData, NSURL, NSError, NSLocale; 68typedef NSUInteger NSStringCompareOptions; 69@interface NSString : NSObject <NSCopying, NSMutableCopying, NSCoding> - (NSUInteger)length; 70- (NSComparisonResult)compare:(NSString *)string; 71- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask; 72- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask range:(NSRange)compareRange; 73- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask range:(NSRange)compareRange locale:(id)locale; 74- (NSComparisonResult)caseInsensitiveCompare:(NSString *)string; 75- (NSArray *)componentsSeparatedByCharactersInSet:(NSCharacterSet *)separator; 76@end 77@interface NSSimpleCString : NSString {} @end 78@interface NSConstantString : NSSimpleCString @end 79extern void *_NSConstantStringClassReference; 80 81//===----------------------------------------------------------------------===// 82// Test cases. 83//===----------------------------------------------------------------------===// 84 85// <rdar://problem/6062730> 86// The analyzer doesn't perform any inter-procedural analysis, so delegates 87// involving [NSObject performSelector...] tend to lead to false positives. 88// For now the analyzer just stops tracking the reference count of the 89// receiver until we have better support for delegates. 90 91@interface test_6062730 : NSObject 92+ (void)postNotification:(NSString *)str; 93- (void)foo; 94- (void)bar; 95@end 96 97@implementation test_6062730 98- (void) foo { 99 NSString *str = [[NSString alloc] init]; // no-warning 100 [test_6062730 performSelectorOnMainThread:@selector(postNotification:) withObject:str waitUntilDone:1]; 101} 102 103- (void) bar { 104 NSString *str = [[NSString alloc] init]; // no-warning 105 [[self class] performSelectorOnMainThread:@selector(postNotification:) withObject:str waitUntilDone:1]; 106} 107 108+ (void) postNotification:(NSString *)str { 109 [str release]; // no-warning 110} 111@end 112 113 114@interface ObjectThatRequiresDelegate : NSObject 115- (id)initWithDelegate:(id)delegate; 116- (id)initWithNumber:(int)num delegate:(id)delegate; 117@end 118 119 120@interface DelegateRequirerTest 121@end 122@implementation DelegateRequirerTest 123 124- (void)test { 125 (void)[[ObjectThatRequiresDelegate alloc] initWithDelegate:self]; 126 (void)[[ObjectThatRequiresDelegate alloc] initWithNumber:0 delegate:self]; 127 // no leak warnings -- these objects could be released in callback methods 128} 129 130@end 131