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