[analyzer] Refactor: make PathDiagnosticLocation responsible for validation of SourceLocations (commit 2 of ?):
- Fix a fixme and move the logic of creating a PathDiagnosticLocation corresponding to a ProgramPoint into a PathDiagnosticLocation constructor.
- Rename PathDiagnosticLocation::create to differentiate from the added constructor.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@139825 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp b/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp
index 5dd5302..ed2a859 100644
--- a/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp
+++ b/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp
@@ -2144,13 +2144,13 @@
llvm::tie(AllocNode, FirstBinding) =
GetAllocationSite(BRC.getStateManager(), EndN, Sym);
- SourceManager& SMgr = BRC.getSourceManager();
+ SourceManager& SM = BRC.getSourceManager();
// Compute an actual location for the leak. Sometimes a leak doesn't
// occur at an actual statement (e.g., transition between blocks; end
// of function) so we need to walk the graph and compute a real location.
const ExplodedNode *LeakN = EndN;
- PathDiagnosticLocation L = PathDiagnosticLocation::create(LeakN, SMgr);
+ PathDiagnosticLocation L = PathDiagnosticLocation::createEndOfPath(LeakN, SM);
std::string sbuf;
llvm::raw_string_ostream os(sbuf);
diff --git a/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp b/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
index c6fd63f..baef8cc 100644
--- a/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
+++ b/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
@@ -238,23 +238,11 @@
return NULL;
}
- // FIXME: Refactor this into BugReporterContext.
- const Stmt *S = 0;
- ProgramPoint P = N->getLocation();
-
- if (BlockEdge *BE = dyn_cast<BlockEdge>(&P)) {
- const CFGBlock *BSrc = BE->getSrc();
- S = BSrc->getTerminatorCondition();
- }
- else if (PostStmt *PS = dyn_cast<PostStmt>(&P)) {
- S = PS->getStmt();
- }
-
- if (!S)
- return NULL;
-
// Construct a new PathDiagnosticPiece.
- PathDiagnosticLocation L(S, BRC.getSourceManager(), P.getLocationContext());
+ ProgramPoint P = N->getLocation();
+ PathDiagnosticLocation L = PathDiagnosticLocation(P,BRC.getSourceManager());
+ if (!L.isValid())
+ return NULL;
return new PathDiagnosticEventPiece(L, os.str());
}
@@ -298,23 +286,11 @@
if (os.str().empty())
return NULL;
- // FIXME: Refactor this into BugReporterContext.
- const Stmt *S = 0;
- ProgramPoint P = N->getLocation();
-
- if (BlockEdge *BE = dyn_cast<BlockEdge>(&P)) {
- const CFGBlock *BSrc = BE->getSrc();
- S = BSrc->getTerminatorCondition();
- }
- else if (PostStmt *PS = dyn_cast<PostStmt>(&P)) {
- S = PS->getStmt();
- }
-
- if (!S)
- return NULL;
-
// Construct a new PathDiagnosticPiece.
- PathDiagnosticLocation L(S, BRC.getSourceManager(), P.getLocationContext());
+ ProgramPoint P = N->getLocation();
+ PathDiagnosticLocation L = PathDiagnosticLocation(P,BRC.getSourceManager());
+ if (!L.isValid())
+ return NULL;
return new PathDiagnosticEventPiece(L, os.str());
}
diff --git a/lib/StaticAnalyzer/Core/PathDiagnostic.cpp b/lib/StaticAnalyzer/Core/PathDiagnostic.cpp
index 8d53b2b..8dcb03b 100644
--- a/lib/StaticAnalyzer/Core/PathDiagnostic.cpp
+++ b/lib/StaticAnalyzer/Core/PathDiagnostic.cpp
@@ -130,7 +130,31 @@
// PathDiagnosticLocation methods.
//===----------------------------------------------------------------------===//
-PathDiagnosticLocation PathDiagnosticLocation::create(const ExplodedNode* N,
+PathDiagnosticLocation::PathDiagnosticLocation(const LocationContext *lc,
+ const SourceManager &sm)
+ : K(RangeK), S(0), D(0), SM(&sm), LC(lc) {
+ SourceLocation L = LC->getDecl()->getBodyRBrace();
+ R = SourceRange(L, L);
+}
+
+PathDiagnosticLocation::PathDiagnosticLocation(const ProgramPoint& P,
+ const SourceManager &SMng)
+ : K(StmtK), S(0), D(0), SM(&SMng), LC(P.getLocationContext()) {
+
+ if (const BlockEdge *BE = dyn_cast<BlockEdge>(&P)) {
+ const CFGBlock *BSrc = BE->getSrc();
+ S = BSrc->getTerminatorCondition();
+ }
+ else if (const PostStmt *PS = dyn_cast<PostStmt>(&P)) {
+ S = PS->getStmt();
+ }
+
+ if (!S)
+ invalidate();
+}
+
+PathDiagnosticLocation PathDiagnosticLocation::createEndOfPath(
+ const ExplodedNode* N,
const SourceManager &SM) {
assert(N && "Cannot create a location with a null node.");
@@ -150,8 +174,7 @@
NI = NI->succ_empty() ? 0 : *(NI->succ_begin());
}
- const Decl &D = N->getCodeDecl();
- return PathDiagnosticLocation(D.getBodyRBrace(), SM);
+ return PathDiagnosticLocation(N->getLocationContext(), SM);
}
static SourceLocation getValidSourceLocation(const Stmt* S,
@@ -188,10 +211,6 @@
return FullSourceLoc(D->getLocation(), const_cast<SourceManager&>(*SM));
}
- if (!R.isValid())
- return FullSourceLoc(LC->getDecl()->getBodyRBrace(),
- const_cast<SourceManager&>(*SM));
-
return FullSourceLoc(R.getBegin(), const_cast<SourceManager&>(*SM));
}