objc_invalidation.m revision 5bf5c2ec54ede5352293e5739e9b44bea2f6b01b
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; // expected-warning{{Ivar needs to be invalidated}}
46  SomeInvalidationImplementingObject *Obj2; // expected-warning{{Ivar needs to be invalidated}}
47  SomeInvalidationImplementingObject *Obj3;
48  SomeInvalidationImplementingObject *_Prop1;
49  SomeInvalidationImplementingObject *_Prop4;
50  SomeInvalidationImplementingObject *_propIvar;
51  Invalidation1Class *MultipleProtocols; // expected-warning{{Ivar needs to be invalidated}}
52  Invalidation2Class *MultInheritance; // expected-warning{{Ivar needs to be invalidated}}
53
54  // No warnings on these.
55  NSObject *NObj1;
56  NSObject *NObj2;
57  NSObject *_NProp1;
58  NSObject *_NpropIvar;
59}
60
61@property (assign) SomeInvalidationImplementingObject* Prop0;
62@property (nonatomic, assign) SomeInvalidationImplementingObject* Prop1;
63@property (assign) SomeInvalidationImplementingObject* Prop2;
64@property (assign) SomeInvalidationImplementingObject* Prop3;
65@property (assign) SomeInvalidationImplementingObject* Prop4;
66@property (assign) NSObject* NProp0;
67@property (nonatomic, assign) NSObject* NProp1;
68@property (assign) NSObject* NProp2;
69
70-(void)setProp1: (SomeInvalidationImplementingObject*) InO;
71-(void)setNProp1: (NSObject*) InO;
72
73-(void)invalidate;
74
75@end
76
77@implementation SomeSubclassInvalidatableObject
78
79@synthesize Prop2 = _propIvar;
80@synthesize Prop3;
81
82- (void) setProp1: (SomeInvalidationImplementingObject*) InObj {
83  _Prop1 = InObj;
84}
85
86- (void) setProp4: (SomeInvalidationImplementingObject*) InObj {
87  _Prop4 = InObj;
88}
89- (SomeInvalidationImplementingObject*) Prop4 {
90  return _Prop4;
91}
92
93@synthesize NProp2 = _NpropIvar;
94
95- (void) setNProp1: (NSObject*) InObj {
96  _NProp1 = InObj;
97}
98
99- (void) invalidate {
100   [Obj3 invalidate];
101   self.Prop1 = 0;
102   [self setProp2:0];
103   [self setProp3:0];
104   self.Prop4 = 0;
105   [super invalidate];
106}
107@end
108