objc_invalidation.m revision 377945cc9e4f23cdbb01ade2a664acd5ff95a888
1// RUN: %clang_cc1 -analyze -analyzer-checker=core,alpha.osx.cocoa.InstanceVariableInvalidation -fobjc-default-synthesize-properties -verify %s 2 3@protocol NSObject 4@end 5@interface NSObject <NSObject> {} 6+(id)alloc; 7+(id)new; 8-(id)init; 9-(id)autorelease; 10-(id)copy; 11- (Class)class; 12-(id)retain; 13@end 14 15@protocol Invalidation1 <NSObject> 16- (void) invalidate __attribute__((annotate("objc_instance_variable_invalidator"))); 17@end 18 19@protocol Invalidation2 <NSObject> 20- (void) invalidate __attribute__((annotate("objc_instance_variable_invalidator"))); 21@end 22 23@protocol Invalidation3 <NSObject> 24- (void) invalidate __attribute__((annotate("objc_instance_variable_invalidator"))); 25@end 26 27@interface Invalidation2Class <Invalidation2> 28@end 29 30@interface Invalidation1Class <Invalidation1> 31@end 32 33@interface SomeInvalidationImplementingObject: NSObject <Invalidation3, Invalidation2> { 34 SomeInvalidationImplementingObject *ObjA; 35} 36@end 37 38@implementation SomeInvalidationImplementingObject 39- (void)invalidate{ 40 ObjA = 0; 41} 42@end 43 44@interface SomeSubclassInvalidatableObject : SomeInvalidationImplementingObject { 45 SomeInvalidationImplementingObject *Obj1; 46 SomeInvalidationImplementingObject *Obj2; 47 SomeInvalidationImplementingObject *Obj3; 48 SomeInvalidationImplementingObject *_Prop1; 49 SomeInvalidationImplementingObject *_Prop4; 50 SomeInvalidationImplementingObject *_propIvar; 51 Invalidation1Class *MultipleProtocols; 52 Invalidation2Class *MultInheritance; 53 SomeInvalidationImplementingObject *_Prop5; // invalidate via getter method 54 55 // No warnings on these. 56 NSObject *NObj1; 57 NSObject *NObj2; 58 NSObject *_NProp1; 59 NSObject *_NpropIvar; 60} 61 62@property (assign) SomeInvalidationImplementingObject* Prop0; 63@property (nonatomic, assign) SomeInvalidationImplementingObject* Prop1; 64@property (assign) SomeInvalidationImplementingObject* Prop2; 65@property (assign) SomeInvalidationImplementingObject* Prop3; 66@property (assign) SomeInvalidationImplementingObject* Prop4; 67@property (assign) SomeInvalidationImplementingObject* Prop5; 68@property (assign) SomeInvalidationImplementingObject *SynthIvarProp; 69 70 71@property (assign) NSObject* NProp0; 72@property (nonatomic, assign) NSObject* NProp1; 73@property (assign) NSObject* NProp2; 74 75-(void)setProp1: (SomeInvalidationImplementingObject*) InO; 76-(void)setNProp1: (NSObject*) InO; 77 78-(void)invalidate; 79 80@end 81 82@implementation SomeSubclassInvalidatableObject 83 84@synthesize Prop2 = _propIvar; 85@synthesize Prop3; 86 87- (void) setProp1: (SomeInvalidationImplementingObject*) InObj { 88 _Prop1 = InObj; 89} 90 91- (void) setProp4: (SomeInvalidationImplementingObject*) InObj { 92 _Prop4 = InObj; 93} 94- (SomeInvalidationImplementingObject*) Prop4 { 95 return _Prop4; 96} 97 98@synthesize NProp2 = _NpropIvar; 99 100- (void) setNProp1: (NSObject*) InObj { 101 _NProp1 = InObj; 102} 103 104- (void) invalidate { 105 [Obj3 invalidate]; 106 self.Prop0 = 0; 107 self.Prop1 = 0; 108 [self setProp2:0]; 109 [self setProp3:0]; 110 self.Prop4 = 0; 111 [[self Prop5] invalidate]; 112 [super invalidate]; 113}// expected-warning {{Instance variable Obj1 needs to be invalidated}} 114 // expected-warning@-1 {{Instance variable Obj2 needs to be invalidated}} 115 // expected-warning@-2 {{Instance variable MultipleProtocols needs to be invalidated}} 116 // expected-warning@-3 {{Instance variable MultInheritance needs to be invalidated}} 117 // expected-warning@-4 {{Property SynthIvarProp needs to be invalidated}} 118@end 119