[cfe-commits] r151592 - in /cfe/trunk: lib/StaticAnalyzer/Checkers/MallocChecker.cpp test/Analysis/malloc-interprocedural.c
Anna Zaks
ganna at apple.com
Mon Feb 27 15:40:56 PST 2012
Author: zaks
Date: Mon Feb 27 17:40:55 2012
New Revision: 151592
URL: http://llvm.org/viewvc/llvm-project?rev=151592&view=rev
Log:
[analyzer] Leaks should be uniqued by the allocation point in the
closest function context.
This prevents us from uniqueing all leaks from the same allocation
helper. radar://10932226
Modified:
cfe/trunk/lib/StaticAnalyzer/Checkers/MallocChecker.cpp
cfe/trunk/test/Analysis/malloc-interprocedural.c
Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/MallocChecker.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/MallocChecker.cpp?rev=151592&r1=151591&r2=151592&view=diff
==============================================================================
--- cfe/trunk/lib/StaticAnalyzer/Checkers/MallocChecker.cpp (original)
+++ cfe/trunk/lib/StaticAnalyzer/Checkers/MallocChecker.cpp Mon Feb 27 17:40:55 2012
@@ -775,6 +775,7 @@
const Stmt *
MallocChecker::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;
@@ -782,12 +783,18 @@
while (N) {
if (!N->getState()->get<RegionState>(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();
- return cast<clang::PostStmt>(P).getStmt();
+ if (!isa<StmtPoint>(P))
+ return 0;
+
+ return cast<StmtPoint>(P).getStmt();
}
void MallocChecker::reportLeak(SymbolRef Sym, ExplodedNode *N,
@@ -806,10 +813,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, Sym, C);
- PathDiagnosticLocation LocUsedForUniqueing =
- PathDiagnosticLocation::createBegin(AllocStmt, C.getSourceManager(),
- N->getLocationContext());
+ PathDiagnosticLocation LocUsedForUniqueing;
+ if (const Stmt *AllocStmt = getAllocationSite(N, Sym, C))
+ LocUsedForUniqueing = PathDiagnosticLocation::createBegin(AllocStmt,
+ C.getSourceManager(), N->getLocationContext());
BugReport *R = new BugReport(*BT_Leak,
"Memory is never released; potential memory leak", N, LocUsedForUniqueing);
Modified: cfe/trunk/test/Analysis/malloc-interprocedural.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/malloc-interprocedural.c?rev=151592&r1=151591&r2=151592&view=diff
==============================================================================
--- cfe/trunk/test/Analysis/malloc-interprocedural.c (original)
+++ cfe/trunk/test/Analysis/malloc-interprocedural.c Mon Feb 27 17:40:55 2012
@@ -38,8 +38,10 @@
my_free1(data);
}
-static void test2() {
- void * data = my_malloc2(1, 4);
+static void testUniqueingByallocationSiteInTopLevelFunction() {
+ void *data = my_malloc2(1, 4);
+ data = 0;
+ int x = 5;// expected-warning {{Memory is never released; potential memory leak}}
data = my_malloc2(1, 4);// expected-warning {{Memory is never released; potential memory leak}}
}
@@ -94,4 +96,3 @@
fooWithEmptyReturn(12);
return *x; // expected-warning {{Use of memory after it is freed}}
}
-
More information about the cfe-commits
mailing list