[cfe-commits] r151613 - in /cfe/trunk: lib/StaticAnalyzer/Checkers/MacOSKeychainAPIChecker.cpp test/Analysis/keychainAPI.m
Anna Zaks
ganna at apple.com
Mon Feb 27 19:07:06 PST 2012
Author: zaks
Date: Mon Feb 27 21:07:06 2012
New Revision: 151613
URL: http://llvm.org/viewvc/llvm-project?rev=151613&view=rev
Log:
[analyzer] Leaks should be uniqued by the allocation point in the
closest function context (Keychain API).
Modified:
cfe/trunk/lib/StaticAnalyzer/Checkers/MacOSKeychainAPIChecker.cpp
cfe/trunk/test/Analysis/keychainAPI.m
Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/MacOSKeychainAPIChecker.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/MacOSKeychainAPIChecker.cpp?rev=151613&r1=151612&r2=151613&view=diff
==============================================================================
--- cfe/trunk/lib/StaticAnalyzer/Checkers/MacOSKeychainAPIChecker.cpp (original)
+++ cfe/trunk/lib/StaticAnalyzer/Checkers/MacOSKeychainAPIChecker.cpp Mon Feb 27 21:07:06 2012
@@ -503,10 +503,12 @@
C.addTransition(state);
}
+// TODO: This logic is the same as in Malloc checker.
const Stmt *
MacOSKeychainAPIChecker::getAllocationSite(const ExplodedNode *N,
SymbolRef Sym,
CheckerContext &C) const {
+ const LocationContext *LeakContext = N->getLocationContext();
// Walk the ExplodedGraph backwards and find the first node that referred to
// the tracked symbol.
const ExplodedNode *AllocNode = N;
@@ -514,11 +516,16 @@
while (N) {
if (!N->getState()->get<AllocatedData>(Sym))
break;
- AllocNode = N;
+ // Allocation node, is the last node in the current context in which the
+ // symbol was tracked.
+ if (N->getLocationContext() == LeakContext)
+ AllocNode = N;
N = N->pred_empty() ? NULL : *(N->pred_begin());
}
ProgramPoint P = AllocNode->getLocation();
+ if (!isa<StmtPoint>(P))
+ return 0;
return cast<clang::PostStmt>(P).getStmt();
}
@@ -536,10 +543,10 @@
// Most bug reports are cached at the location where they occurred.
// With leaks, we want to unique them by the location where they were
// allocated, and only report a single path.
- const Stmt *AllocStmt = getAllocationSite(N, AP.first, C);
- PathDiagnosticLocation LocUsedForUniqueing =
- PathDiagnosticLocation::createBegin(AllocStmt, C.getSourceManager(),
- N->getLocationContext());
+ PathDiagnosticLocation LocUsedForUniqueing;
+ if (const Stmt *AllocStmt = getAllocationSite(N, AP.first, C))
+ LocUsedForUniqueing = PathDiagnosticLocation::createBegin(AllocStmt,
+ C.getSourceManager(), N->getLocationContext());
BugReport *Report = new BugReport(*BT, os.str(), N, LocUsedForUniqueing);
Report->addVisitor(new SecKeychainBugVisitor(AP.first));
Modified: cfe/trunk/test/Analysis/keychainAPI.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/keychainAPI.m?rev=151613&r1=151612&r2=151613&view=diff
==============================================================================
--- cfe/trunk/test/Analysis/keychainAPI.m (original)
+++ cfe/trunk/test/Analysis/keychainAPI.m Mon Feb 27 21:07:06 2012
@@ -393,8 +393,10 @@
void allocNoFree3() {
UInt32 length = 32;
- void *outData;
+ void *outData;
+ void *outData2;
OSStatus st = my_Allocate_Param(&outData, &length); // expected-warning{{Allocated data is not released}}
+ st = my_Allocate_Param(&outData2, &length); // expected-warning{{Allocated data is not released}}
}
void allocAndFree3(void *attrList) {
@@ -403,6 +405,5 @@
OSStatus st = my_Allocate_Param(&outData, &length);
if (st == noErr)
SecKeychainItemFreeContent(attrList, outData);
-
}
More information about the cfe-commits
mailing list