Rafael Espindola | ea1ba0a | 2013-09-27 20:21:48 +0000 | [diff] [blame] | 1 | // RUN: %clang_cc1 -analyze -analyzer-checker=alpha.osx.cocoa.DirectIvarAssignmentForAnnotatedFunctions -verify -fblocks %s |
Anna Zaks | 25dd07c | 2012-12-05 01:14:37 +0000 | [diff] [blame] | 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 | |
Anna Zaks | 6519564 | 2013-01-16 01:36:00 +0000 | [diff] [blame] | 16 | @interface AnnotatedClass : NSObject { |
Anna Zaks | 25dd07c | 2012-12-05 01:14:37 +0000 | [diff] [blame] | 17 | } |
Ted Kremenek | c632467 | 2012-12-22 00:34:48 +0000 | [diff] [blame] | 18 | - (void) someMethod: (MyClass*)In __attribute__((annotate("objc_no_direct_instance_variable_assignment"))); |
Anna Zaks | 25dd07c | 2012-12-05 01:14:37 +0000 | [diff] [blame] | 19 | - (void) someMethodNotAnnaotated: (MyClass*)In; |
| 20 | @end |
| 21 | |
| 22 | |
Anna Zaks | 6519564 | 2013-01-16 01:36:00 +0000 | [diff] [blame] | 23 | @interface TestProperty : AnnotatedClass { |
Anna Zaks | 25dd07c | 2012-12-05 01:14:37 +0000 | [diff] [blame] | 24 | MyClass *_Z; |
| 25 | id _nonSynth; |
Anna Zaks | 0e9c941 | 2013-01-17 23:24:58 +0000 | [diff] [blame] | 26 | MyClass* _NotA __attribute__((annotate("objc_allow_direct_instance_variable_assignment"))); |
Anna Zaks | 25dd07c | 2012-12-05 01:14:37 +0000 | [diff] [blame] | 27 | } |
| 28 | |
| 29 | @property (assign, nonatomic) MyClass* A; // explicitely synthesized, not implemented, non-default ivar name |
| 30 | |
| 31 | @property (assign) MyClass* X; // automatically synthesized, not implemented |
| 32 | |
| 33 | @property (assign, nonatomic) MyClass* Y; // automatically synthesized, implemented |
| 34 | |
Alp Toker | d473363 | 2013-12-05 04:47:09 +0000 | [diff] [blame] | 35 | @property (assign, nonatomic) MyClass* Z; // non-synthesized ivar, implemented setter |
| 36 | @property (readonly) id nonSynth; // non-synthesized, explicitly implemented to return ivar with expected name |
Anna Zaks | 0e9c941 | 2013-01-17 23:24:58 +0000 | [diff] [blame] | 37 | |
| 38 | @property (assign) MyClass* NotA; // warnings should be suppressed, backing ivar is annotated |
Anna Zaks | 6519564 | 2013-01-16 01:36:00 +0000 | [diff] [blame] | 39 | @property (assign) MyClass* NotX __attribute__((annotate("objc_allow_direct_instance_variable_assignment"))); // warnings should be suppressed |
| 40 | |
Anna Zaks | 25dd07c | 2012-12-05 01:14:37 +0000 | [diff] [blame] | 41 | @end |
| 42 | |
| 43 | @implementation TestProperty |
| 44 | @synthesize A = __A; |
| 45 | |
| 46 | - (void) someMethod: (MyClass*)In { |
| 47 | (__A) = In; // expected-warning {{Direct assignment to an instance variable backing a property; use the setter instead}} |
| 48 | _X = In; // expected-warning {{Direct assignment to an instance variable backing a property; use the setter instead}} |
| 49 | _Y = In; // expected-warning {{Direct assignment to an instance variable backing a property; use the setter instead}} |
| 50 | _Z = In; // expected-warning {{Direct assignment to an instance variable backing a property; use the setter instead}} |
| 51 | _nonSynth = 0; // expected-warning {{Direct assignment to an instance variable backing a property; use the setter instead}} |
Anna Zaks | 6519564 | 2013-01-16 01:36:00 +0000 | [diff] [blame] | 52 | _NotX = 0; // no-warning |
Anna Zaks | 0e9c941 | 2013-01-17 23:24:58 +0000 | [diff] [blame] | 53 | _NotA = 0; // no-warning |
Anna Zaks | 25dd07c | 2012-12-05 01:14:37 +0000 | [diff] [blame] | 54 | } |
| 55 | - (void) someMethodNotAnnaotated: (MyClass*)In { |
| 56 | (__A) = In; |
| 57 | _X = In; // no-warning |
| 58 | _Y = In; // no-warning |
| 59 | _Z = In; // no-warning |
| 60 | _nonSynth = 0; // no-warning |
| 61 | } |
| 62 | |
| 63 | @end |