diff options
author | Anna Zaks <ganna@apple.com> | 2012-04-16 21:51:09 +0000 |
---|---|---|
committer | Anna Zaks <ganna@apple.com> | 2012-04-16 21:51:09 +0000 |
commit | 9a70cddef6850f302615b4f5d27f16ec45926ca6 (patch) | |
tree | 74f72ea8fb7f56e18dfffded85490a6a921f571d /test | |
parent | ffce11b95aad43cae18ac8700c026f0d6f62dfa2 (diff) |
[analyzer] Fix a false alarm in SelfInitChecker (radar://11235991).
Along with it, fix a couple of other corner cases and add more tests.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@154866 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test')
-rw-r--r-- | test/Analysis/self-init.m | 61 |
1 files changed, 57 insertions, 4 deletions
diff --git a/test/Analysis/self-init.m b/test/Analysis/self-init.m index 3db42e9cf5..d515173343 100644 --- a/test/Analysis/self-init.m +++ b/test/Analysis/self-init.m @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -analyze -analyzer-checker=osx.cocoa.SelfInit %s -verify +// RUN: %clang_cc1 -analyze -analyzer-checker=osx.cocoa.SelfInit -fobjc-default-synthesize-properties %s -verify @class NSZone, NSCoder; @protocol NSObject- (id)self; @@ -48,9 +48,7 @@ void log(void *obj); extern void *somePtr; @class MyObj; -static id _commonInit(MyObj *self) { - return self; -} +extern id _commonInit(MyObj *self); @interface MyObj : NSObject { id myivar; @@ -59,6 +57,7 @@ static id _commonInit(MyObj *self) { -(id)_init; -(id)initWithSomething:(int)x; -(void)doSomething; ++(id)commonInitMember:(id)s; @end @interface MyProxyObj : NSProxy {} @@ -90,6 +89,14 @@ static id _commonInit(MyObj *self) { return self; } +-(id)init4_w { + [super init]; + if (self) { + log(&self); + } + return self; // expected-warning {{Returning 'self' while it is not set to the result of '[(super or self) init...]'}} +} + - (id)initWithSomething:(int)x { if ((self = [super init])) myint = x; @@ -157,6 +164,12 @@ static id _commonInit(MyObj *self) { return self; } +-(id)init14_w { + [super init]; + self = _commonInit(self); + return self; // expected-warning {{Returning 'self' while it is not set to the result of '[(super or self) init...]'}} +} + -(id)init15 { if (!(self = [super init])) return 0; @@ -176,6 +189,28 @@ static id _commonInit(MyObj *self) { return 0; } +-(id)init18 { + self = [super init]; + self = _commonInit(self); + return self; +} + ++(id)commonInitMember:(id)s { + return s; +} + +-(id)init19 { + self = [super init]; + self = [MyObj commonInitMember:self]; + return self; +} + +-(id)init19_w { + [super init]; + self = [MyObj commonInitMember:self]; + return self; // expected-warning {{Returning 'self'}} +} + -(void)doSomething {} @end @@ -201,3 +236,21 @@ static id _commonInit(MyObj *self) { } @end +// Test radar:11235991 - passing self to a call to super. +@protocol MyDelegate +@end +@interface Object : NSObject +- (id) initWithObject: (id)i; +@end +@interface Derived: Object <MyDelegate> +- (id) initWithInt: (int)t; +@property (nonatomic, retain, readwrite) Object *size; +@end +@implementation Derived +- (id) initWithInt: (int)t { + if ((self = [super initWithObject:self])) { + _size = [[Object alloc] init]; + } + return self; +} +@end |