xref: /aosp_15_r20/external/clang/test/Analysis/self-init.m (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// RUN: %clang_cc1 -analyze -analyzer-checker=osx.cocoa.SelfInit -analyzer-config ipa=dynamic -fno-builtin %s -verify
2*67e74705SXin Li// RUN: %clang_cc1 -analyze -analyzer-checker=osx.cocoa.SelfInit -fno-builtin %s -verify
3*67e74705SXin Li
4*67e74705SXin Li@class NSZone, NSCoder;
5*67e74705SXin Li@protocol NSObject
6*67e74705SXin Li- (id)self;
7*67e74705SXin Li@end
8*67e74705SXin Li@protocol NSCopying  - (id)copyWithZone:(NSZone *)zone;
9*67e74705SXin Li@end
10*67e74705SXin Li@protocol NSMutableCopying  - (id)mutableCopyWithZone:(NSZone *)zone;
11*67e74705SXin Li@end
12*67e74705SXin Li@protocol NSCoding  - (void)encodeWithCoder:(NSCoder *)aCoder;
13*67e74705SXin Li@end
14*67e74705SXin Li@interface NSObject <NSObject> {}
15*67e74705SXin Li+ (id)allocWithZone:(NSZone *)zone;
16*67e74705SXin Li+ (id)alloc;
17*67e74705SXin Li- (void)dealloc;
18*67e74705SXin Li-(id)class;
19*67e74705SXin Li-(id)init;
20*67e74705SXin Li-(id)release;
21*67e74705SXin Li@end
22*67e74705SXin Li@interface NSProxy <NSObject> {}
23*67e74705SXin Li@end
24*67e74705SXin Li
25*67e74705SXin Li//#import "Foundation/NSObject.h"
26*67e74705SXin Litypedef unsigned NSUInteger;
27*67e74705SXin Litypedef long NSInteger;
28*67e74705SXin Li
29*67e74705SXin Li@interface NSInvocation : NSObject {}
30*67e74705SXin Li- (void)getArgument:(void *)argumentLocation atIndex:(NSInteger)idx;
31*67e74705SXin Li- (void)setArgument:(void *)argumentLocation atIndex:(NSInteger)idx;
32*67e74705SXin Li@end
33*67e74705SXin Li
34*67e74705SXin Li@class NSMethodSignature, NSCoder, NSString, NSEnumerator;
35*67e74705SXin Li@interface NSString : NSObject <NSCopying, NSMutableCopying, NSCoding>
36*67e74705SXin Li- (NSUInteger)length;
37*67e74705SXin Li+ (id)stringWithUTF8String:(const char *)nullTerminatedCString;
38*67e74705SXin Li@end extern NSString * const NSBundleDidLoadNotification;
39*67e74705SXin Li@interface NSAssertionHandler : NSObject {}
40*67e74705SXin Li+ (NSAssertionHandler *)currentHandler;
41*67e74705SXin Li- (void)handleFailureInMethod:(SEL)selector object:(id)object file:(NSString *)fileName lineNumber:(NSInteger)line description:(NSString *)format,...;
42*67e74705SXin Li@end
43*67e74705SXin Liextern NSString * const NSConnectionReplyMode;
44*67e74705SXin Li
45*67e74705SXin Li@interface NSBundle : NSObject
46*67e74705SXin Li+(id)loadNibNamed:(NSString*)s owner:(id)o;
47*67e74705SXin Li@end
48*67e74705SXin Li
49*67e74705SXin Livoid log(void *obj);
50*67e74705SXin Liextern void *somePtr;
51*67e74705SXin Li
52*67e74705SXin Li@class MyObj;
53*67e74705SXin Liextern id _commonInit(MyObj *self);
54*67e74705SXin Li
55*67e74705SXin Li@interface MyObj : NSObject {
56*67e74705SXin Li	id myivar;
57*67e74705SXin Li	int myint;
58*67e74705SXin Li}
59*67e74705SXin Li-(id)_init;
60*67e74705SXin Li-(id)initWithSomething:(int)x;
61*67e74705SXin Li-(void)doSomething;
62*67e74705SXin Li+(id)commonInitMember:(id)s;
63*67e74705SXin Li@end
64*67e74705SXin Li
65*67e74705SXin Li@interface MyProxyObj : NSProxy {}
66*67e74705SXin Li-(id)init;
67*67e74705SXin Li@end
68*67e74705SXin Li
69*67e74705SXin Li@implementation MyObj
70*67e74705SXin Li
71*67e74705SXin Li-(id)init {
72*67e74705SXin Li  do { if (!((somePtr != 0))) { [[NSAssertionHandler currentHandler] handleFailureInMethod:_cmd object:self file:[NSString stringWithUTF8String:"init.m"] lineNumber:21 description:(@"Invalid parameter not satisfying: %s"), ("x != 0"), (0), (0), (0), (0)]; } } while(0);
73*67e74705SXin Li  return [self initWithSomething:0];
74*67e74705SXin Li}
75*67e74705SXin Li
76*67e74705SXin Li-(id)init2 {
77*67e74705SXin Li  self = [self initWithSomething:0];
78*67e74705SXin Li  return self;
79*67e74705SXin Li}
80*67e74705SXin Li
81*67e74705SXin Li-(id)init3 {
82*67e74705SXin Li	log([self class]);
83*67e74705SXin Li	return [self initWithSomething:0];
84*67e74705SXin Li}
85*67e74705SXin Li
86*67e74705SXin Li-(id)init4 {
87*67e74705SXin Li	self = [super init];
88*67e74705SXin Li	if (self) {
89*67e74705SXin Li		log(&self);
90*67e74705SXin Li	}
91*67e74705SXin Li	return self;
92*67e74705SXin Li}
93*67e74705SXin Li
94*67e74705SXin Li-(id)init4_w {
95*67e74705SXin Li  [super init];
96*67e74705SXin Li  if (self) {
97*67e74705SXin Li    log(&self);
98*67e74705SXin Li  }
99*67e74705SXin Li  return self; // expected-warning {{Returning 'self' while it is not set to the result of '[(super or self) init...]'}}
100*67e74705SXin Li}
101*67e74705SXin Li
102*67e74705SXin Li- (id)initWithSomething:(int)x {
103*67e74705SXin Li	if ((self = [super init]))
104*67e74705SXin Li		myint = x;
105*67e74705SXin Li	return self;
106*67e74705SXin Li}
107*67e74705SXin Li
108*67e74705SXin Li-(id)_init {
109*67e74705SXin Li	myivar = 0;
110*67e74705SXin Li	return self;
111*67e74705SXin Li}
112*67e74705SXin Li
113*67e74705SXin Li-(id)init5 {
114*67e74705SXin Li  [NSBundle loadNibNamed:@"Window" owner:self];
115*67e74705SXin Li  return [self initWithSomething:0];
116*67e74705SXin Li}
117*67e74705SXin Li
118*67e74705SXin Li-(id)init6 {
119*67e74705SXin Li  [NSBundle loadNibNamed:@"Window" owner:myivar]; // no-warning
120*67e74705SXin Li  return [self initWithSomething:0];
121*67e74705SXin Li}
122*67e74705SXin Li
123*67e74705SXin Li-(id)init7 {
124*67e74705SXin Li  if (0 != (self = [self _init]))
125*67e74705SXin Li    myivar = 0;
126*67e74705SXin Li  return self;
127*67e74705SXin Li}
128*67e74705SXin Li
129*67e74705SXin Li-(id)init8 {
130*67e74705SXin Li    if ((self = [super init])) {
131*67e74705SXin Li		log(&self);
132*67e74705SXin Li		myivar = 0;
133*67e74705SXin Li    }
134*67e74705SXin Li    return self;
135*67e74705SXin Li}
136*67e74705SXin Li
137*67e74705SXin Li-(id)init9 {
138*67e74705SXin Li  [self doSomething];
139*67e74705SXin Li  return self; // no-warning
140*67e74705SXin Li}
141*67e74705SXin Li
142*67e74705SXin Li-(id)init10 {
143*67e74705SXin Li  myivar = 0; // no-warning
144*67e74705SXin Li  return self;
145*67e74705SXin Li}
146*67e74705SXin Li
147*67e74705SXin Li-(id)init11 {
148*67e74705SXin Li  return self; // no-warning
149*67e74705SXin Li}
150*67e74705SXin Li
151*67e74705SXin Li-(id)init12 {
152*67e74705SXin Li	[super init];
153*67e74705SXin Li	return self; // expected-warning {{Returning 'self'}}
154*67e74705SXin Li}
155*67e74705SXin Li
156*67e74705SXin Li-(id)init13 {
157*67e74705SXin Li	if (self == [super init]) {
158*67e74705SXin Li	  myivar = 0; // expected-warning {{Instance variable used}}
159*67e74705SXin Li	}
160*67e74705SXin Li	return self; // expected-warning {{Returning 'self'}}
161*67e74705SXin Li}
162*67e74705SXin Li
163*67e74705SXin Li-(id)init14 {
164*67e74705SXin Li  if (!(self = _commonInit(self)))
165*67e74705SXin Li    return 0;
166*67e74705SXin Li  return self;
167*67e74705SXin Li}
168*67e74705SXin Li
169*67e74705SXin Li-(id)init14_w {
170*67e74705SXin Li  [super init];
171*67e74705SXin Li  self = _commonInit(self);
172*67e74705SXin Li  return self; // expected-warning {{Returning 'self' while it is not set to the result of '[(super or self) init...]'}}
173*67e74705SXin Li}
174*67e74705SXin Li
175*67e74705SXin Li-(id)init15 {
176*67e74705SXin Li  if (!(self = [super init]))
177*67e74705SXin Li    return 0;
178*67e74705SXin Li  return self;
179*67e74705SXin Li}
180*67e74705SXin Li
181*67e74705SXin Li-(id)init16 {
182*67e74705SXin Li  somePtr = [super init];
183*67e74705SXin Li  self = somePtr;
184*67e74705SXin Li  myivar = 0;
185*67e74705SXin Li  return self;
186*67e74705SXin Li}
187*67e74705SXin Li
188*67e74705SXin Li-(id)init17 {
189*67e74705SXin Li  somePtr = [super init];
190*67e74705SXin Li  myivar = 0; // expected-warning {{Instance variable used}}
191*67e74705SXin Li  return 0;
192*67e74705SXin Li}
193*67e74705SXin Li
194*67e74705SXin Li-(id)init18 {
195*67e74705SXin Li  self = [super init];
196*67e74705SXin Li  self = _commonInit(self);
197*67e74705SXin Li  return self;
198*67e74705SXin Li}
199*67e74705SXin Li
200*67e74705SXin Li+(id)commonInitMember:(id)s {
201*67e74705SXin Li  return s;
202*67e74705SXin Li}
203*67e74705SXin Li
204*67e74705SXin Li-(id)init19 {
205*67e74705SXin Li  self = [super init];
206*67e74705SXin Li  self = [MyObj commonInitMember:self];
207*67e74705SXin Li  return self;
208*67e74705SXin Li}
209*67e74705SXin Li
210*67e74705SXin Li-(id)init19_w {
211*67e74705SXin Li  [super init];
212*67e74705SXin Li  self = [MyObj commonInitMember:self];
213*67e74705SXin Li  return self; // expected-warning {{Returning 'self'}}
214*67e74705SXin Li}
215*67e74705SXin Li
216*67e74705SXin Li-(void)doSomething {}
217*67e74705SXin Li
218*67e74705SXin Li@end
219*67e74705SXin Li
220*67e74705SXin Li@implementation MyProxyObj
221*67e74705SXin Li
222*67e74705SXin Li- (id)init { return self; }
223*67e74705SXin Li
224*67e74705SXin Li@end
225*67e74705SXin Li
226*67e74705SXin Li
227*67e74705SXin Li// Test for radar://10973514 : self should not be invalidated by a method call.
228*67e74705SXin Li@interface Test : NSObject {
229*67e74705SXin Li    NSInvocation *invocation_;
230*67e74705SXin Li}
231*67e74705SXin Li@end
232*67e74705SXin Li@implementation Test
233*67e74705SXin Li-(id) initWithTarget:(id) rec selector:(SEL) cb {
234*67e74705SXin Li  if (self=[super init]) {
235*67e74705SXin Li    [invocation_ setArgument:&self atIndex:2];
236*67e74705SXin Li  }
237*67e74705SXin Li  return self;
238*67e74705SXin Li}
239*67e74705SXin Li@end
240*67e74705SXin Li
241*67e74705SXin Li// Test radar:11235991 - passing self to a call to super.
242*67e74705SXin Li@protocol MyDelegate
243*67e74705SXin Li@end
244*67e74705SXin Li@interface Object : NSObject
245*67e74705SXin Li- (id) initWithObject: (id)i;
246*67e74705SXin Li@end
247*67e74705SXin Li@interface Derived: Object <MyDelegate>
248*67e74705SXin Li- (id) initWithInt: (int)t;
249*67e74705SXin Li@property (nonatomic, retain, readwrite) Object *size;
250*67e74705SXin Li@end
251*67e74705SXin Li@implementation Derived
252*67e74705SXin Li- (id) initWithInt: (int)t {
253*67e74705SXin Li   if ((self = [super initWithObject:self])) {
254*67e74705SXin Li      _size = [[Object alloc] init];
255*67e74705SXin Li   }
256*67e74705SXin Li   return self;
257*67e74705SXin Li}
258*67e74705SXin Li@end
259*67e74705SXin Li
260*67e74705SXin Li// Test for radar://11125870: init constructing a special instance.
261*67e74705SXin Litypedef signed char BOOL;
262*67e74705SXin Li@interface MyClass : NSObject
263*67e74705SXin Li@end
264*67e74705SXin Li@implementation MyClass
265*67e74705SXin Li+ (id)specialInstance {
266*67e74705SXin Li    return [[MyClass alloc] init];
267*67e74705SXin Li}
268*67e74705SXin Li- (id)initSpecially:(BOOL)handleSpecially {
269*67e74705SXin Li    if ((self = [super init])) {
270*67e74705SXin Li        if (handleSpecially) {
271*67e74705SXin Li            self = [MyClass specialInstance];
272*67e74705SXin Li        }
273*67e74705SXin Li    }
274*67e74705SXin Li    return self;
275*67e74705SXin Li}
276*67e74705SXin Li- (id)initSelfSelf {
277*67e74705SXin Li    if ((self = [super init])) {
278*67e74705SXin Li      self = self;
279*67e74705SXin Li    }
280*67e74705SXin Li    return self;
281*67e74705SXin Li}
282*67e74705SXin Li@end
283*67e74705SXin Li
284*67e74705SXin Li// Test for radar://12838705.
285*67e74705SXin Li@interface ABCClass : NSObject
286*67e74705SXin Li@property (nonatomic, strong) NSString *foo;
287*67e74705SXin Li@property (nonatomic, strong) NSString *bar;
288*67e74705SXin Li@property (nonatomic, strong) NSString *baz;
289*67e74705SXin Li@end
290*67e74705SXin Li
291*67e74705SXin Li@implementation ABCClass
292*67e74705SXin Li@synthesize foo = foo_;
293*67e74705SXin Li@synthesize bar = bar_;
294*67e74705SXin Li@synthesize baz = baz_;
295*67e74705SXin Li
296*67e74705SXin Li- (id)initWithABC:(ABCClass *)abc {
297*67e74705SXin Li  self = [super init];
298*67e74705SXin Li  baz_ = abc->baz_;
299*67e74705SXin Li  return self;
300*67e74705SXin Li}
301*67e74705SXin Li
302*67e74705SXin Li- (ABCClass *)abcWithFoo:(NSString *)foo {
303*67e74705SXin Li  ABCClass *copy = [[ABCClass alloc] initWithABC:self];
304*67e74705SXin Li  return copy;
305*67e74705SXin Li}
306*67e74705SXin Li
307*67e74705SXin Li@end
308*67e74705SXin Li
309