Home | History | Annotate | Download | only in Analysis
      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