diff options
-rw-r--r-- | lib/StaticAnalyzer/Checkers/ObjCSelfInitChecker.cpp | 9 | ||||
-rw-r--r-- | test/Analysis/self-init.m | 25 |
2 files changed, 32 insertions, 2 deletions
diff --git a/lib/StaticAnalyzer/Checkers/ObjCSelfInitChecker.cpp b/lib/StaticAnalyzer/Checkers/ObjCSelfInitChecker.cpp index 713459fdab..485ae77242 100644 --- a/lib/StaticAnalyzer/Checkers/ObjCSelfInitChecker.cpp +++ b/lib/StaticAnalyzer/Checkers/ObjCSelfInitChecker.cpp @@ -123,9 +123,10 @@ static SelfFlagEnum getSelfFlags(SVal val, CheckerContext &C) { static void addSelfFlag(ProgramStateRef state, SVal val, SelfFlagEnum flag, CheckerContext &C) { // We tag the symbol that the SVal wraps. - if (SymbolRef sym = val.getAsSymbol()) + if (SymbolRef sym = val.getAsSymbol()) { state = state->set<SelfFlag>(sym, getSelfFlags(val, state) | flag); - C.addTransition(state); + C.addTransition(state); + } } static bool hasSelfFlag(SVal val, SelfFlagEnum flag, CheckerContext &C) { @@ -303,6 +304,10 @@ void ObjCSelfInitChecker::checkPostCall(const CallEvent &CE, void ObjCSelfInitChecker::checkLocation(SVal location, bool isLoad, const Stmt *S, CheckerContext &C) const { + if (!shouldRunOnFunctionOrMethod(dyn_cast<NamedDecl>( + C.getCurrentAnalysisDeclContext()->getDecl()))) + return; + // Tag the result of a load from 'self' so that we can easily know that the // value is the object that 'self' points to. ProgramStateRef state = C.getState(); diff --git a/test/Analysis/self-init.m b/test/Analysis/self-init.m index b0c51a2b37..d8e8888287 100644 --- a/test/Analysis/self-init.m +++ b/test/Analysis/self-init.m @@ -281,3 +281,28 @@ typedef signed char BOOL; } @end +// Test for radar://12838705. +@interface ABCClass : NSObject +@property (nonatomic, strong) NSString *foo; +@property (nonatomic, strong) NSString *bar; +@property (nonatomic, strong) NSString *baz; +@end + +@implementation ABCClass +@synthesize foo = foo_; +@synthesize bar = bar_; +@synthesize baz = baz_; + +- (id)initWithABC:(ABCClass *)abc { + self = [super init]; + baz_ = abc->baz_; + return self; +} + +- (ABCClass *)abcWithFoo:(NSString *)foo { + ABCClass *copy = [[ABCClass alloc] initWithABC:self]; + return copy; +} + +@end + |