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