[analyzer] Refactor: make PathDiagnosticLocation responsible for validation of SourceLocations (commit 2 of ?):
- Modify all PathDiagnosticLocation constructors that take Stmt to also requre LocationContext.
- Add a constructor which should be used in case there is no valid statement/location (it will grab the location of the enclosing function).
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@139763 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp b/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
index 5a56afb..c6fd63f 100644
--- a/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
+++ b/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
@@ -90,9 +90,8 @@
if (const BlockEntrance *BE = dyn_cast<BlockEntrance>(&PP)) {
const CFGBlock *block = BE->getBlock();
if (block->getBlockID() == 0) {
- L = PathDiagnosticLocation(
- EndPathNode->getLocationContext()->getDecl()->getBodyRBrace(),
- BRC.getSourceManager());
+ L = PathDiagnosticLocation(PP.getLocationContext(),
+ BRC.getSourceManager());
}
}
@@ -102,7 +101,8 @@
if (!S)
return NULL;
- L = PathDiagnosticLocation(S, BRC.getSourceManager());
+ L = PathDiagnosticLocation(S, BRC.getSourceManager(),
+ PP.getLocationContext());
}
BugReport::ranges_iterator Beg, End;
@@ -254,7 +254,7 @@
return NULL;
// Construct a new PathDiagnosticPiece.
- PathDiagnosticLocation L(S, BRC.getSourceManager());
+ PathDiagnosticLocation L(S, BRC.getSourceManager(), P.getLocationContext());
return new PathDiagnosticEventPiece(L, os.str());
}
@@ -314,7 +314,7 @@
return NULL;
// Construct a new PathDiagnosticPiece.
- PathDiagnosticLocation L(S, BRC.getSourceManager());
+ PathDiagnosticLocation L(S, BRC.getSourceManager(), P.getLocationContext());
return new PathDiagnosticEventPiece(L, os.str());
}
@@ -424,7 +424,8 @@
// the receiver was null.
BR.addVisitor(bugreporter::getTrackNullOrUndefValueVisitor(N, Receiver));
// Issue a message saying that the method was skipped.
- PathDiagnosticLocation L(Receiver, BRC.getSourceManager());
+ PathDiagnosticLocation L(Receiver, BRC.getSourceManager(),
+ N->getLocationContext());
return new PathDiagnosticEventPiece(L, "No method actually called "
"because the receiver is nil");
}
@@ -489,8 +490,7 @@
if (const BlockEdge *BE = dyn_cast<BlockEdge>(&progPoint)) {
const CFGBlock *srcBlk = BE->getSrc();
if (const Stmt *term = srcBlk->getTerminator())
- return VisitTerminator(term, CurrentState, PrevState,
- srcBlk, BE->getDst(), BRC);
+ return VisitTerminator(term, N, srcBlk, BE->getDst(), BRC);
return 0;
}
@@ -503,9 +503,11 @@
const ProgramPointTag *tag = PS->getTag();
if (tag == tags.first)
- return VisitTrueTest(cast<Expr>(PS->getStmt()), true, BRC);
+ return VisitTrueTest(cast<Expr>(PS->getStmt()), true,
+ BRC, N->getLocationContext());
if (tag == tags.second)
- return VisitTrueTest(cast<Expr>(PS->getStmt()), false, BRC);
+ return VisitTrueTest(cast<Expr>(PS->getStmt()), false,
+ BRC, N->getLocationContext());
return 0;
}
@@ -515,8 +517,7 @@
PathDiagnosticPiece *
ConditionBRVisitor::VisitTerminator(const Stmt *Term,
- const ProgramState *CurrentState,
- const ProgramState *PrevState,
+ const ExplodedNode *N,
const CFGBlock *srcBlk,
const CFGBlock *dstBlk,
BugReporterContext &BRC) {
@@ -537,13 +538,14 @@
assert(srcBlk->succ_size() == 2);
const bool tookTrue = *(srcBlk->succ_begin()) == dstBlk;
return VisitTrueTest(Cond->IgnoreParenNoopCasts(BRC.getASTContext()),
- tookTrue, BRC);
+ tookTrue, BRC, N->getLocationContext());
}
PathDiagnosticPiece *
ConditionBRVisitor::VisitTrueTest(const Expr *Cond,
bool tookTrue,
- BugReporterContext &BRC) {
+ BugReporterContext &BRC,
+ const LocationContext *LC) {
const Expr *Ex = Cond;
@@ -553,9 +555,9 @@
default:
return 0;
case Stmt::BinaryOperatorClass:
- return VisitTrueTest(Cond, cast<BinaryOperator>(Ex), tookTrue, BRC);
+ return VisitTrueTest(Cond, cast<BinaryOperator>(Ex), tookTrue, BRC, LC);
case Stmt::DeclRefExprClass:
- return VisitTrueTest(Cond, cast<DeclRefExpr>(Ex), tookTrue, BRC);
+ return VisitTrueTest(Cond, cast<DeclRefExpr>(Ex), tookTrue, BRC, LC);
case Stmt::UnaryOperatorClass: {
const UnaryOperator *UO = cast<UnaryOperator>(Ex);
if (UO->getOpcode() == UO_LNot) {
@@ -610,7 +612,8 @@
ConditionBRVisitor::VisitTrueTest(const Expr *Cond,
const BinaryOperator *BExpr,
const bool tookTrue,
- BugReporterContext &BRC) {
+ BugReporterContext &BRC,
+ const LocationContext *LC) {
bool shouldInvert = false;
@@ -670,7 +673,7 @@
Out << (shouldInvert ? LhsString : RhsString);
- PathDiagnosticLocation Loc(Cond, BRC.getSourceManager());
+ PathDiagnosticLocation Loc(Cond, BRC.getSourceManager(), LC);
return new PathDiagnosticEventPiece(Loc, Out.str());
}
@@ -678,7 +681,8 @@
ConditionBRVisitor::VisitTrueTest(const Expr *Cond,
const DeclRefExpr *DR,
const bool tookTrue,
- BugReporterContext &BRC) {
+ BugReporterContext &BRC,
+ const LocationContext *LC) {
const VarDecl *VD = dyn_cast<VarDecl>(DR->getDecl());
if (!VD)
@@ -702,6 +706,6 @@
else
return 0;
- PathDiagnosticLocation Loc(Cond, BRC.getSourceManager());
+ PathDiagnosticLocation Loc(Cond, BRC.getSourceManager(), LC);
return new PathDiagnosticEventPiece(Loc, Out.str());
}