117 lines · plain
1// RUN: %clang_analyze_cc1 -analyzer-checker=core,alpha.core,osx.cocoa.Dealloc %s -verify2 3// Tests for the checker which checks missing/extra ivar 'release' calls 4// in dealloc.5 6@interface NSObject7- (void)release;8- (void)dealloc;9@end10 11@interface MyClass : NSObject {12@private13 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 extension44@property(assign) id U;45 46@property(retain) id V;47@property(retain) id W;48-(id) O;49-(void) setO: (id) arg;50@end51 52@interface MyClass ()53// Shadows T to make it readwrite internally but readonly externally.54@property(assign, readwrite) id T;55@end56 57@implementation MyClass58@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-warning76 _R = @"Hi";77}78 79- (void)dealloc80{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-warning85 86 [_other->_Z release]; // no-warning87 [_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 value92 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-warning96 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-warning104 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@end116 117