xref: /aosp_15_r20/external/clang/test/Analysis/MissingDealloc.m (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// RUN: %clang_cc1 -analyze -analyzer-checker=osx.cocoa.Dealloc -fblocks -verify %s
2*67e74705SXin Li// RUN: %clang_cc1 -analyze -analyzer-checker=osx.cocoa.Dealloc -fblocks -verify -triple x86_64-apple-darwin10 -fobjc-arc %s
3*67e74705SXin Li
4*67e74705SXin Li#define NON_ARC !__has_feature(objc_arc)
5*67e74705SXin Li
6*67e74705SXin Li// No diagnostics expected under ARC.
7*67e74705SXin Li#if !NON_ARC
8*67e74705SXin Li  // expected-no-diagnostics
9*67e74705SXin Li#endif
10*67e74705SXin Li
11*67e74705SXin Litypedef signed char BOOL;
12*67e74705SXin Li@protocol NSObject
13*67e74705SXin Li- (BOOL)isEqual:(id)object;
14*67e74705SXin Li- (Class)class;
15*67e74705SXin Li@end
16*67e74705SXin Li
17*67e74705SXin Li@interface NSObject <NSObject> {}
18*67e74705SXin Li- (void)dealloc;
19*67e74705SXin Li- (id)init;
20*67e74705SXin Li@end
21*67e74705SXin Li
22*67e74705SXin Litypedef struct objc_selector *SEL;
23*67e74705SXin Li
24*67e74705SXin Li//===------------------------------------------------------------------------===
25*67e74705SXin Li// Do not warn about missing -dealloc method.  Not enough context to know
26*67e74705SXin Li// whether the ivar is retained or not.
27*67e74705SXin Li
28*67e74705SXin Li@interface MissingDeallocWithIvar : NSObject {
29*67e74705SXin Li  NSObject *_ivar;
30*67e74705SXin Li}
31*67e74705SXin Li@end
32*67e74705SXin Li
33*67e74705SXin Li@implementation MissingDeallocWithIvar
34*67e74705SXin Li@end
35*67e74705SXin Li
36*67e74705SXin Li//===------------------------------------------------------------------------===
37*67e74705SXin Li// Do not warn about missing -dealloc method.  These properties are not
38*67e74705SXin Li// retained or synthesized.
39*67e74705SXin Li
40*67e74705SXin Li@interface MissingDeallocWithIntProperty : NSObject
41*67e74705SXin Li@property (assign) int ivar;
42*67e74705SXin Li@end
43*67e74705SXin Li
44*67e74705SXin Li@implementation MissingDeallocWithIntProperty
45*67e74705SXin Li@end
46*67e74705SXin Li
47*67e74705SXin Li@interface MissingDeallocWithSELProperty : NSObject
48*67e74705SXin Li@property (assign) SEL ivar;
49*67e74705SXin Li@end
50*67e74705SXin Li
51*67e74705SXin Li@implementation MissingDeallocWithSELProperty
52*67e74705SXin Li@end
53*67e74705SXin Li
54*67e74705SXin Li//===------------------------------------------------------------------------===
55*67e74705SXin Li// Warn about missing -dealloc method.
56*67e74705SXin Li
57*67e74705SXin Li@interface MissingDeallocWithCopyProperty : NSObject
58*67e74705SXin Li@property (copy) NSObject *ivar;
59*67e74705SXin Li@end
60*67e74705SXin Li
61*67e74705SXin Li#if NON_ARC
62*67e74705SXin Li// expected-warning@+2{{'MissingDeallocWithCopyProperty' lacks a 'dealloc' instance method but must release '_ivar'}}
63*67e74705SXin Li#endif
64*67e74705SXin Li@implementation MissingDeallocWithCopyProperty
65*67e74705SXin Li@end
66*67e74705SXin Li
67*67e74705SXin Li@interface MissingDeallocWithRetainProperty : NSObject
68*67e74705SXin Li@property (retain) NSObject *ivar;
69*67e74705SXin Li@end
70*67e74705SXin Li
71*67e74705SXin Li#if NON_ARC
72*67e74705SXin Li// expected-warning@+2{{'MissingDeallocWithRetainProperty' lacks a 'dealloc' instance method but must release '_ivar'}}
73*67e74705SXin Li#endif
74*67e74705SXin Li@implementation MissingDeallocWithRetainProperty
75*67e74705SXin Li@end
76*67e74705SXin Li
77*67e74705SXin Li@interface MissingDeallocWithMultipleProperties : NSObject
78*67e74705SXin Li@property (retain) NSObject *ivar1;
79*67e74705SXin Li@property (retain) NSObject *ivar2;
80*67e74705SXin Li@end
81*67e74705SXin Li
82*67e74705SXin Li#if NON_ARC
83*67e74705SXin Li// expected-warning@+2{{'MissingDeallocWithMultipleProperties' lacks a 'dealloc' instance method but must release '_ivar1' and others}}
84*67e74705SXin Li#endif
85*67e74705SXin Li@implementation MissingDeallocWithMultipleProperties
86*67e74705SXin Li@end
87*67e74705SXin Li
88*67e74705SXin Li@interface MissingDeallocWithIVarAndRetainProperty : NSObject {
89*67e74705SXin Li  NSObject *_ivar2;
90*67e74705SXin Li}
91*67e74705SXin Li@property (retain) NSObject *ivar1;
92*67e74705SXin Li@end
93*67e74705SXin Li
94*67e74705SXin Li#if NON_ARC
95*67e74705SXin Li// expected-warning@+2{{'MissingDeallocWithIVarAndRetainProperty' lacks a 'dealloc' instance method but must release '_ivar1'}}
96*67e74705SXin Li#endif
97*67e74705SXin Li@implementation MissingDeallocWithIVarAndRetainProperty
98*67e74705SXin Li@end
99*67e74705SXin Li
100*67e74705SXin Li@interface MissingDeallocWithReadOnlyRetainedProperty : NSObject
101*67e74705SXin Li@property (readonly,retain) NSObject *ivar;
102*67e74705SXin Li@end
103*67e74705SXin Li
104*67e74705SXin Li#if NON_ARC
105*67e74705SXin Li// expected-warning@+2{{'MissingDeallocWithReadOnlyRetainedProperty' lacks a 'dealloc' instance method but must release '_ivar'}}
106*67e74705SXin Li#endif
107*67e74705SXin Li@implementation MissingDeallocWithReadOnlyRetainedProperty
108*67e74705SXin Li@end
109*67e74705SXin Li
110*67e74705SXin Li
111*67e74705SXin Li//===------------------------------------------------------------------------===
112*67e74705SXin Li//  Don't warn about iVars that are selectors.
113*67e74705SXin Li
114*67e74705SXin Li@interface TestSELs : NSObject {
115*67e74705SXin Li  SEL a;
116*67e74705SXin Li  SEL b;
117*67e74705SXin Li}
118*67e74705SXin Li
119*67e74705SXin Li@end
120*67e74705SXin Li
121*67e74705SXin Li@implementation TestSELs
122*67e74705SXin Li- (id)init {
123*67e74705SXin Li  if( (self = [super init]) ) {
124*67e74705SXin Li    a = @selector(a);
125*67e74705SXin Li    b = @selector(b);
126*67e74705SXin Li  }
127*67e74705SXin Li
128*67e74705SXin Li  return self;
129*67e74705SXin Li}
130*67e74705SXin Li@end
131*67e74705SXin Li
132*67e74705SXin Li//===------------------------------------------------------------------------===
133*67e74705SXin Li//  Don't warn about iVars that are IBOutlets.
134*67e74705SXin Li
135*67e74705SXin Li@class NSWindow;
136*67e74705SXin Li
137*67e74705SXin Li@interface HasOutlet : NSObject {
138*67e74705SXin LiIBOutlet NSWindow *window;
139*67e74705SXin Li}
140*67e74705SXin Li@end
141*67e74705SXin Li
142*67e74705SXin Li@implementation HasOutlet // no-warning
143*67e74705SXin Li@end
144*67e74705SXin Li
145*67e74705SXin Li//===------------------------------------------------------------------------===
146*67e74705SXin Li// PR 3187: http://llvm.org/bugs/show_bug.cgi?id=3187
147*67e74705SXin Li// - Disable the missing -dealloc check for classes that subclass SenTestCase
148*67e74705SXin Li
149*67e74705SXin Li@class NSString;
150*67e74705SXin Li
151*67e74705SXin Li@interface SenTestCase : NSObject {}
152*67e74705SXin Li@end
153*67e74705SXin Li
154*67e74705SXin Li@interface MyClassTest : SenTestCase {
155*67e74705SXin Li  NSString *resourcePath;
156*67e74705SXin Li}
157*67e74705SXin Li
158*67e74705SXin Li@property (retain) NSObject *ivar;
159*67e74705SXin Li
160*67e74705SXin Li@end
161*67e74705SXin Li
162*67e74705SXin Li@interface NSBundle : NSObject {}
163*67e74705SXin Li+ (NSBundle *)bundleForClass:(Class)aClass;
164*67e74705SXin Li- (NSString *)resourcePath;
165*67e74705SXin Li@end
166*67e74705SXin Li
167*67e74705SXin Li@implementation MyClassTest
168*67e74705SXin Li- (void)setUp {
169*67e74705SXin Li  resourcePath = [[NSBundle bundleForClass:[self class]] resourcePath];
170*67e74705SXin Li}
171*67e74705SXin Li- (void)testXXX {
172*67e74705SXin Li  // do something which uses resourcepath
173*67e74705SXin Li}
174*67e74705SXin Li@end
175*67e74705SXin Li
176*67e74705SXin Li//===------------------------------------------------------------------------===
177*67e74705SXin Li// Don't warn for clases that aren't subclasses of NSObject
178*67e74705SXin Li
179*67e74705SXin Li__attribute__((objc_root_class))
180*67e74705SXin Li@interface NonNSObjectMissingDealloc
181*67e74705SXin Li@property (retain) NSObject *ivar;
182*67e74705SXin Li@end
183*67e74705SXin Li@implementation NonNSObjectMissingDealloc
184*67e74705SXin Li@end
185*67e74705SXin Li
186*67e74705SXin Li// CHECK: 4 warnings generated.
187