summaryrefslogtreecommitdiffstats
path: root/clang/test/Analysis/objc
diff options
context:
space:
mode:
authorAnna Zaks <ganna@apple.com>2012-12-05 01:14:37 +0000
committerAnna Zaks <ganna@apple.com>2012-12-05 01:14:37 +0000
commit25dd07c112e94b58949a59407d31d8c7a369b0f8 (patch)
treedbb8d602a39c0fe4c2246774d4e9cc7447e4c211 /clang/test/Analysis/objc
parent5df82f215599a9844270f1a97490fe8653035fdd (diff)
downloadbcm5719-llvm-25dd07c112e94b58949a59407d31d8c7a369b0f8.tar.gz
bcm5719-llvm-25dd07c112e94b58949a59407d31d8c7a369b0f8.zip
[analyzer] Implement an opt-in variant of direct ivar assignment.
This will only check the direct ivar assignments in the annotated methods. llvm-svn: 169349
Diffstat (limited to 'clang/test/Analysis/objc')
-rw-r--r--clang/test/Analysis/objc/direct-ivar-assignment-in-annotated-functions.m56
1 files changed, 56 insertions, 0 deletions
diff --git a/clang/test/Analysis/objc/direct-ivar-assignment-in-annotated-functions.m b/clang/test/Analysis/objc/direct-ivar-assignment-in-annotated-functions.m
new file mode 100644
index 00000000000..7a90fb4dacd
--- /dev/null
+++ b/clang/test/Analysis/objc/direct-ivar-assignment-in-annotated-functions.m
@@ -0,0 +1,56 @@
+// 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_assignmemt")));
+ - (void) someMethodNotAnnaotated: (MyClass*)In;
+@end
+
+
+@interface TestProperty :AnnotatedClass {
+ 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 ivar, implemented setter
+ @property (readonly) id nonSynth; // non synthesized, explicitly implemented to return ivar with expected name
+ @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}}
+ }
+ - (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
OpenPOWER on IntegriCloud