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