diff options
Diffstat (limited to 'test/Analysis/objc/direct-ivar-assignment-in-annotated-functions.m')
-rw-r--r-- | test/Analysis/objc/direct-ivar-assignment-in-annotated-functions.m | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/test/Analysis/objc/direct-ivar-assignment-in-annotated-functions.m b/test/Analysis/objc/direct-ivar-assignment-in-annotated-functions.m new file mode 100644 index 0000000..f449786 --- /dev/null +++ b/test/Analysis/objc/direct-ivar-assignment-in-annotated-functions.m @@ -0,0 +1,63 @@ +// RUN: %clang_cc1 -analyze -analyzer-checker=alpha.osx.cocoa.DirectIvarAssignmentForAnnotatedFunctions -fobjc-default-synthesize-properties -verify -fblocks %s + +typedef signed char BOOL; +@protocol NSObject - (BOOL)isEqual:(id)object; @end +@interface NSObject <NSObject> {} ++(id)alloc; +-(id)init; +-(id)autorelease; +-(id)copy; +-(id)retain; +@end + +@interface MyClass; +@end + +@interface AnnotatedClass : NSObject { +} + - (void) someMethod: (MyClass*)In __attribute__((annotate("objc_no_direct_instance_variable_assignment"))); + - (void) someMethodNotAnnaotated: (MyClass*)In; +@end + + +@interface TestProperty : AnnotatedClass { + MyClass *_Z; + id _nonSynth; + MyClass* _NotA __attribute__((annotate("objc_allow_direct_instance_variable_assignment"))); +} + + @property (assign, nonatomic) MyClass* A; // explicitely synthesized, not implemented, non-default ivar name + + @property (assign) MyClass* X; // automatically synthesized, not implemented + + @property (assign, nonatomic) MyClass* Y; // automatically synthesized, implemented + + @property (assign, nonatomic) MyClass* Z; // non synthesized ivar, implemented setter + @property (readonly) id nonSynth; // non synthesized, explicitly implemented to return ivar with expected name + + @property (assign) MyClass* NotA; // warnings should be suppressed, backing ivar is annotated + @property (assign) MyClass* NotX __attribute__((annotate("objc_allow_direct_instance_variable_assignment"))); // warnings should be suppressed + + @end + +@implementation TestProperty + @synthesize A = __A; + + - (void) someMethod: (MyClass*)In { + (__A) = In; // expected-warning {{Direct assignment to an instance variable backing a property; use the setter instead}} + _X = In; // expected-warning {{Direct assignment to an instance variable backing a property; use the setter instead}} + _Y = In; // expected-warning {{Direct assignment to an instance variable backing a property; use the setter instead}} + _Z = In; // expected-warning {{Direct assignment to an instance variable backing a property; use the setter instead}} + _nonSynth = 0; // expected-warning {{Direct assignment to an instance variable backing a property; use the setter instead}} + _NotX = 0; // no-warning + _NotA = 0; // no-warning + } + - (void) someMethodNotAnnaotated: (MyClass*)In { + (__A) = In; + _X = In; // no-warning + _Y = In; // no-warning + _Z = In; // no-warning + _nonSynth = 0; // no-warning + } + +@end
\ No newline at end of file |