diff options
author | Ted Kremenek <kremenek@apple.com> | 2008-05-06 23:07:13 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2008-05-06 23:07:13 +0000 |
commit | a22cc2f6a6381b1bfa27a1ca640b2a606bd09e54 (patch) | |
tree | 8346ee15466c29bfbb300eab4b6091cf33491831 | |
parent | 69c827f9484f7b30ceec30875c13dad524709064 (diff) |
Don't report leaks for autoreleased objects.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@50777 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Analysis/CFRefCount.cpp | 63 | ||||
-rw-r--r-- | test/Analysis-Apple/CFDate.m | 23 |
2 files changed, 23 insertions, 63 deletions
diff --git a/lib/Analysis/CFRefCount.cpp b/lib/Analysis/CFRefCount.cpp index 32cf6ed6b0..b0eddf505d 100644 --- a/lib/Analysis/CFRefCount.cpp +++ b/lib/Analysis/CFRefCount.cpp @@ -634,10 +634,15 @@ RetainSummaryManager::getInstanceMethodSummary(IdentifierInfo* ClsName, if (I != ObjCInstMethSummaries.end()) return I->second; + return 0; + +#if 0 + return 0; + // Don't track anything if using GC. if (isGCEnabled()) - return 0; - + return 0; + // Inspect the class name and selecrtor to determine if this method // creates new objects. const char* cls = ClsName->getName(); @@ -673,6 +678,7 @@ RetainSummaryManager::getInstanceMethodSummary(IdentifierInfo* ClsName, RetainSummary* Summ = getPersistentSummary(RetEffect::MakeOwned()); ObjCInstMethSummaries[S] = Summ; return Summ; +#endif } void RetainSummaryManager::InitializeInstMethSummaries() { @@ -1969,6 +1975,7 @@ PathDiagnosticPiece* CFRefReport::VisitNode(ExplodedNode<ValueState>* N, return P; } + PathDiagnosticPiece* CFRefReport::getEndPath(BugReporter& BR, ExplodedNode<ValueState>* EndN) { @@ -2057,54 +2064,26 @@ PathDiagnosticPiece* CFRefReport::getEndPath(BugReporter& BR, // Look in the *trimmed* graph at the immediate predecessor of EndN. Does // it occur on the same line? + + PathDiagnosticPiece::DisplayHint Hint = PathDiagnosticPiece::Above; assert (!EndN->pred_empty()); // Not possible to have 0 predecessors. - N = *(EndN->pred_begin()); + ExplodedNode<ValueState> *Pred = *(EndN->pred_begin()); + ProgramPoint PredPos = Pred->getLocation(); - do { - ProgramPoint P = N->getLocation(); + if (PostStmt* PredPS = dyn_cast<PostStmt>(&PredPos)) { - if (!isa<PostStmt>(P)) - break; + Stmt* SPred = PredPS->getStmt(); // Predecessor at same line? - - Stmt* SPred = cast<PostStmt>(P).getStmt(); - - if (SMgr.getLogicalLineNumber(SPred->getLocStart()) != EndLine) - break; - - // The predecessor (where the object was not yet leaked) is a statement - // on the same line. Get the first successor statement that appears - // on a different line. For this operation, we can traverse the - // non-trimmed graph. - - N = getEndNode(); // This is the node where the leak occured in the - // original graph. - - while (!N->succ_empty()) { - - N = *(N->succ_begin()); - ProgramPoint P = N->getLocation(); - - if (!isa<PostStmt>(P)) - continue; - - Stmt* SSucc = cast<PostStmt>(P).getStmt(); - - if (SMgr.getLogicalLineNumber(SSucc->getLocStart()) != EndLine) { - S = SSucc; - break; - } - } + if (SMgr.getLogicalLineNumber(SPred->getLocStart()) != EndLine) { + Hint = PathDiagnosticPiece::Below; + S = SPred; + } } - while (false); - - // Construct the location. - - FullSourceLoc L(S->getLocStart(), SMgr); // Generate the diagnostic. + FullSourceLoc L( S->getLocStart(), SMgr); std::ostringstream os; os << "Object allocated on line " << AllocLine; @@ -2115,7 +2094,7 @@ PathDiagnosticPiece* CFRefReport::getEndPath(BugReporter& BR, os << " is no longer referenced after this point and has a retain count of +" << RetCount << " (object leaked)."; - return new PathDiagnosticPiece(L, os.str()); + return new PathDiagnosticPiece(L, os.str(), Hint); } void UseAfterRelease::EmitWarnings(BugReporter& BR) { diff --git a/test/Analysis-Apple/CFDate.m b/test/Analysis-Apple/CFDate.m index e71b1a08fa..89660b2714 100644 --- a/test/Analysis-Apple/CFDate.m +++ b/test/Analysis-Apple/CFDate.m @@ -90,26 +90,7 @@ CFDateRef f6(int x) { CFDateRef f7() { CFDateRef date = CFDateCreate(NULL, CFAbsoluteTimeGetCurrent()); - CFRetain(date); - date = CFDateCreate(NULL, CFAbsoluteTimeGetCurrent()); //expected-warning{{leak}} + CFRetain(date); //expected-warning{{leak}} + date = CFDateCreate(NULL, CFAbsoluteTimeGetCurrent()); return date; } - -NSDate* f8(int x) { - - NSDate* date = [NSDate date]; - - if (x) [date retain]; - - return date; // expected-warning{{leak}} -} - -NSDate* f9(int x) { - - NSDate* date = [NSDate dateWithString:@"2001-03-24 10:45:32 +0600"]; - - if (x) [date retain]; - - return date; // expected-warning{{leak}} -} - |