Home | History | Annotate | Download | only in Analysis
      1 // RUN: %clang_cc1 -analyze -analyzer-checker=alpha.osx.cocoa.DirectIvarAssignment -verify -fblocks %s
      2 
      3 typedef signed char BOOL;
      4 @protocol NSObject  - (BOOL)isEqual:(id)object; @end
      5 @interface NSObject <NSObject> {}
      6 +(id)alloc;
      7 -(id)init;
      8 -(id)autorelease;
      9 -(id)copy;
     10 -(id)retain;
     11 @end
     12 
     13 @interface MyClass;
     14 @end
     15 @interface TestProperty :NSObject {
     16   MyClass *_Z;
     17   id _nonSynth;
     18 }
     19 
     20   @property (assign, nonatomic) MyClass* A; // explicitely synthesized, not implemented, non-default ivar name
     21 
     22   @property (assign) MyClass* X;  // automatically synthesized, not implemented
     23 
     24   @property (assign, nonatomic) MyClass* Y; // automatically synthesized, implemented
     25 
     26   @property (assign, nonatomic) MyClass* Z; // non-synthesized ivar, implemented setter
     27   @property (readonly) id nonSynth;  // non-synthesized, explicitly implemented to return ivar with expected name
     28   
     29   - (id) initWithPtr:(MyClass*) value;
     30   - (id) myInitWithPtr:(MyClass*) value;
     31   - (void) someMethod: (MyClass*)In;
     32 @end
     33 
     34 @implementation TestProperty
     35   @synthesize A = __A;
     36   
     37   - (id) initWithPtr: (MyClass*) value {
     38     _Y = value; // no-warning
     39     return self;
     40   }
     41 
     42   - (id) copyWithPtrY: (TestProperty*) value {
     43     TestProperty *another = [[TestProperty alloc] init];
     44     another->_Y = value->_Y; // no-warning
     45     return another;
     46   }
     47 
     48   - (id) myInitWithPtr: (MyClass*) value {
     49     _Y = value; // no-warning
     50     return self;
     51   }
     52   
     53   - (void) setY:(MyClass*) NewValue {
     54     _Y = NewValue; // no-warning
     55   }
     56 
     57   - (void) setZ:(MyClass*) NewValue {
     58     _Z = NewValue; // no-warning
     59   }
     60 
     61   - (id)nonSynth {
     62       return _nonSynth;
     63   }
     64 
     65   - (void) someMethod: (MyClass*)In {
     66     (__A) = In; // expected-warning {{Direct assignment to an instance variable backing a property; use the setter instead}}
     67     _X = In; // expected-warning {{Direct assignment to an instance variable backing a property; use the setter instead}}
     68     _Y = In; // expected-warning {{Direct assignment to an instance variable backing a property; use the setter instead}}
     69     _Z = In; // expected-warning {{Direct assignment to an instance variable backing a property; use the setter instead}}
     70     _nonSynth = 0; // expected-warning {{Direct assignment to an instance variable backing a property; use the setter instead}}
     71   }
     72 @end