150
|
1 // RUN: %clang_analyze_cc1 -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; // explicitly 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 |