Home | History | Annotate | Download | only in Analysis
      1 // RUN: %clang_cc1 -analyze -analyzer-checker=core,alpha.core,osx.cocoa.Dealloc %s -verify
      2 
      3 // Tests for the checker which checks missing/extra ivar 'release' calls 
      4 // in dealloc.
      5 
      6 @interface NSObject
      7 - (void)release;
      8 - (void)dealloc;
      9 @end
     10 
     11 @interface MyClass : NSObject {
     12 @private
     13   id _X;
     14   id _Y;
     15   id _Z;
     16   id _K;
     17   id _L;
     18   id _N;
     19   id _M;
     20   id _P;
     21   id _Q;
     22   id _R;
     23   id _S;
     24   id _V;
     25   id _W;
     26 
     27   MyClass *_other;
     28 
     29   id _nonPropertyIvar;
     30 }
     31 @property(retain) id X;
     32 @property(retain) id Y;
     33 @property(assign) id Z;
     34 @property(assign) id K;
     35 @property(weak) id L;
     36 @property(readonly) id N;
     37 @property(retain) id M;
     38 @property(weak) id P;
     39 @property(weak) id Q;
     40 @property(retain) id R;
     41 @property(weak, readonly) id S;
     42 
     43 @property(assign, readonly) id T; // Shadowed in class extension
     44 @property(assign) id U;
     45 
     46 @property(retain) id V;
     47 @property(retain) id W;
     48 -(id) O;
     49 -(void) setO: (id) arg;
     50 @end
     51 
     52 @interface MyClass ()
     53 // Shadows T to make it readwrite internally but readonly externally.
     54 @property(assign, readwrite) id T;
     55 @end
     56 
     57 @implementation MyClass
     58 @synthesize X = _X;
     59 @synthesize Y = _Y;
     60 @synthesize Z = _Z;
     61 @synthesize K = _K;
     62 @synthesize L = _L;
     63 @synthesize N = _N;
     64 @synthesize M = _M;
     65 @synthesize Q = _Q;
     66 @synthesize R = _R;
     67 @synthesize V = _V;
     68 @synthesize W = _W;
     69 
     70 -(id) O{ return 0; }
     71 -(void) setO:(id)arg { }
     72 
     73 
     74 -(void) releaseInHelper {
     75   [_R release]; // no-warning
     76   _R = @"Hi";
     77 }
     78 
     79 - (void)dealloc
     80 {
     81 
     82   [_X release];
     83   [_Z release]; // expected-warning{{The '_Z' ivar in 'MyClass' was synthesized for an assign, readwrite property but was released in 'dealloc'}}
     84   [_T release]; // no-warning
     85 
     86   [_other->_Z release]; // no-warning
     87   [_N release];
     88 
     89   self.M = 0; // This will release '_M'
     90   [self setV:0]; // This will release '_V'
     91   [self setW:@"newW"]; // This will release '_W', but retain the new value
     92 
     93   [_S release]; // expected-warning {{The '_S' ivar in 'MyClass' was synthesized for a weak property but was released in 'dealloc'}}
     94 
     95   self.O = 0; // no-warning
     96 
     97   [_Q release]; // expected-warning {{The '_Q' ivar in 'MyClass' was synthesized for a weak property but was released in 'dealloc'}}
     98 
     99   self.P = 0;
    100 
    101   [self releaseInHelper];
    102 
    103   [_nonPropertyIvar release]; // no-warning
    104 
    105   // Silly, but not an error.
    106   if (!_U)
    107     [_U release];
    108 
    109   [super dealloc];
    110   // expected-warning@-1{{The '_Y' ivar in 'MyClass' was retained by a synthesized property but not released before '[super dealloc]'}}
    111   // expected-warning@-2{{The '_W' ivar in 'MyClass' was retained by a synthesized property but not released before '[super dealloc]'}}
    112 
    113 }
    114 
    115 @end
    116 
    117