diff options
author | Anna Zaks <ganna@apple.com> | 2013-04-10 22:56:30 +0000 |
---|---|---|
committer | Anna Zaks <ganna@apple.com> | 2013-04-10 22:56:30 +0000 |
commit | 3f303be63628acbe5dc5d51a64977bed3ce805f8 (patch) | |
tree | d588aad763299c7520515e9cf0a2459c022534b2 | |
parent | f242b806ac8bc61b9fcdf26ae2dcb57dae52a616 (diff) | |
download | bcm5719-llvm-3f303be63628acbe5dc5d51a64977bed3ce805f8.tar.gz bcm5719-llvm-3f303be63628acbe5dc5d51a64977bed3ce805f8.zip |
[analyzer] Address Jordan’s code review of r 179221
llvm-svn: 179234
-rw-r--r-- | clang/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp index f6168457a26..6163cc19c69 100644 --- a/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp @@ -2138,10 +2138,10 @@ PathDiagnosticPiece *CFRefReportVisitor::VisitNode(const ExplodedNode *N, // treated as interesting. struct AllocationInfo { const ExplodedNode* N; - const MemRegion* R; + const MemRegion *R; const LocationContext *InterestingMethodContext; - AllocationInfo(const ExplodedNode* InN, - const MemRegion* InR, + AllocationInfo(const ExplodedNode *InN, + const MemRegion *InR, const LocationContext *InInterestingMethodContext) : N(InN), R(InR), InterestingMethodContext(InInterestingMethodContext) {} }; @@ -2185,22 +2185,26 @@ GetAllocationSite(ProgramStateManager& StateMgr, const ExplodedNode *N, if (NContext == LeakContext) AllocationNodeInCurrentContext = N; - // If init was called on the given symbol, store the init method's location - // context. - if (Optional<CallEnter> CEP = N->getLocation().getAs<CallEnter>()) { - const Stmt *CE = CEP->getCallExpr(); - if (const ObjCMessageExpr *ME = dyn_cast<ObjCMessageExpr>(CE)) { - SVal RecVal = St->getSVal(ME->getInstanceReceiver(), NContext); - if (RecVal.getAsSymbol() == Sym && ME->getMethodFamily() == OMF_init) - InitMethodContext = CEP->getCalleeContext(); + // Find the last init that was called on the given symbol and store the + // init method's location context. + if (!InitMethodContext) + if (Optional<CallEnter> CEP = N->getLocation().getAs<CallEnter>()) { + const Stmt *CE = CEP->getCallExpr(); + if (const ObjCMessageExpr *ME = dyn_cast<ObjCMessageExpr>(CE)) { + const Stmt *RecExpr = ME->getInstanceReceiver(); + if (RecExpr) { + SVal RecV = St->getSVal(RecExpr, NContext); + if (ME->getMethodFamily() == OMF_init && RecV.getAsSymbol() == Sym) + InitMethodContext = CEP->getCalleeContext(); + } + } } - } N = N->pred_empty() ? NULL : *(N->pred_begin()); } // If we are reporting a leak of the object that was allocated with alloc, - // mark it's init method as interesting. + // mark its init method as interesting. const LocationContext *InterestingMethodContext = 0; if (InitMethodContext) { const ProgramPoint AllocPP = AllocationNode->getLocation(); |