130 lines · plain
1// RUN: %clang_analyze_cc1 -analyzer-checker=core,osx.cocoa.RetainCount -Wno-objc-root-class -verify %s2// expected-no-diagnostics3 4//===----------------------------------------------------------------------===//5// The following code is reduced using delta-debugging from6// 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 NSObject32- (BOOL)isEqual:(id)object;33- (oneway void)release;34- (Class)class;35- (id)retain;36@end37@protocol NSCopying38- (id)copyWithZone:(NSZone *)zone;39@end40@protocol NSMutableCopying41- (id)mutableCopyWithZone:(NSZone *)zone;42@end43@protocol NSCoding44- (void)encodeWithCoder:(NSCoder *)aCoder;45@end46@interface NSObject <NSObject> {}47- (id)init;48+ (id)alloc;49+ (Class)class;50- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;51@end52extern id NSAllocateObject(Class aClass, NSUInteger extraBytes, NSZone *zone);53typedef struct {} NSFastEnumerationState;54@protocol NSFastEnumeration55- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id *)stackbuf count:(NSUInteger)len;56@end57@class NSString;58typedef struct _NSRange {} NSRange;59@interface NSArray : NSObject <NSCopying, NSMutableCopying, NSCoding, NSFastEnumeration>60- (NSUInteger)count;61@end62@interface NSMutableArray : NSArray63- (void)addObject:(id)anObject;64- (id)initWithCapacity:(NSUInteger)numItems;65@end66typedef 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@end77@interface NSSimpleCString : NSString {} @end78@interface NSConstantString : NSSimpleCString @end79extern void *_NSConstantStringClassReference;80 81//===----------------------------------------------------------------------===//82// Test cases.83//===----------------------------------------------------------------------===//84 85// The analyzer doesn't perform any inter-procedural analysis, so delegates86// involving [NSObject performSelector...] tend to lead to false positives.87// For now the analyzer just stops tracking the reference count of the88// receiver until we have better support for delegates.89 90@interface test_6062730 : NSObject91+ (void)postNotification:(NSString *)str;92- (void)foo;93- (void)bar;94@end95 96@implementation test_606273097- (void) foo {98 NSString *str = [[NSString alloc] init]; // no-warning99 [test_6062730 performSelectorOnMainThread:@selector(postNotification:) withObject:str waitUntilDone:1];100}101 102- (void) bar {103 NSString *str = [[NSString alloc] init]; // no-warning104 [[self class] performSelectorOnMainThread:@selector(postNotification:) withObject:str waitUntilDone:1];105}106 107+ (void) postNotification:(NSString *)str {108 [str release]; // no-warning109}110@end111 112 113@interface ObjectThatRequiresDelegate : NSObject114- (id)initWithDelegate:(id)delegate;115- (id)initWithNumber:(int)num delegate:(id)delegate;116@end117 118 119@interface DelegateRequirerTest120@end121@implementation DelegateRequirerTest122 123- (void)test {124 (void)[[ObjectThatRequiresDelegate alloc] initWithDelegate:self];125 (void)[[ObjectThatRequiresDelegate alloc] initWithNumber:0 delegate:self];126 // no leak warnings -- these objects could be released in callback methods127}128 129@end130