diff options
author | Anna Zaks <ganna@apple.com> | 2012-09-27 19:45:15 +0000 |
---|---|---|
committer | Anna Zaks <ganna@apple.com> | 2012-09-27 19:45:15 +0000 |
commit | 88a83e3f3bade5497ff371ed5a570b83d9373e3a (patch) | |
tree | 04d4935345e69b33cbb7e6a5e5268630e796def2 /test/Analysis/objc-properties.m | |
parent | ad0ce53c8219456938405b84c5d13341a47e3d94 (diff) | |
download | clang-88a83e3f3bade5497ff371ed5a570b83d9373e3a.tar.gz |
[analyzer] Add an experimental ObjC direct ivar assignment checker.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@164790 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/Analysis/objc-properties.m')
-rw-r--r-- | test/Analysis/objc-properties.m | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/test/Analysis/objc-properties.m b/test/Analysis/objc-properties.m new file mode 100644 index 0000000000..a25791ea88 --- /dev/null +++ b/test/Analysis/objc-properties.m @@ -0,0 +1,56 @@ +// RUN: %clang_cc1 -analyze -analyzer-checker=alpha.osx.cocoa.DirectIvarAssignment -fobjc-default-synthesize-properties -Wno-objc-root-class -verify -fblocks %s + +@interface MyClass; +@end +@interface TestProperty { + MyClass *_Z; + id _nonSynth; +} + + @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, implemented + @property (readonly) id nonSynth; // non synthesized, explicitly implemented to return ivar with expected name + + - (id) initWithPtr:(MyClass*) value; + - (id) myInitWithPtr:(MyClass*) value; + - (void) someMethod: (MyClass*)In; +@end + +@implementation TestProperty + @synthesize A = __A; + + - (id) initWithPtr: (MyClass*) value { + _Y = value; // no-warning + return self; + } + + - (id) myInitWithPtr: (MyClass*) value { + _Y = value; // no-warning + return self; + } + + - (void) setY:(MyClass*) NewValue { + _Y = NewValue; // no-warning + } + + - (void) setZ:(MyClass*) NewValue { + _Z = NewValue; // no-warning + } + + - (id)nonSynth { + return _nonSynth; + } + + - (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}} + } +@end
\ No newline at end of file |