forked from OSchip/llvm-project
[analyzer] FindLastStoreBRVisitor was not actually finding stores.
The visitor walks back through the ExplodedGraph as expected, but it wasn't actually keeping track of when a value was assigned. This meant that it only worked when the value was assigned when the variable was defined. Tests in the next commit (dependent on another change). llvm-svn: 161276
This commit is contained in:
parent
16fe35eb2b
commit
adec516f4e
|
|
@ -63,14 +63,6 @@ const Stmt *bugreporter::GetDenomExpr(const ExplodedNode *N) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
const Stmt *bugreporter::GetCalleeExpr(const ExplodedNode *N) {
|
|
||||||
// Callee is checked as a PreVisit to the CallExpr.
|
|
||||||
const Stmt *S = N->getLocationAs<PreStmt>()->getStmt();
|
|
||||||
if (const CallExpr *CE = dyn_cast<CallExpr>(S))
|
|
||||||
return CE->getCallee();
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
const Stmt *bugreporter::GetRetValExpr(const ExplodedNode *N) {
|
const Stmt *bugreporter::GetRetValExpr(const ExplodedNode *N) {
|
||||||
const Stmt *S = N->getLocationAs<PostStmt>()->getStmt();
|
const Stmt *S = N->getLocationAs<PostStmt>()->getStmt();
|
||||||
if (const ReturnStmt *RS = dyn_cast<ReturnStmt>(S))
|
if (const ReturnStmt *RS = dyn_cast<ReturnStmt>(S))
|
||||||
|
|
@ -127,10 +119,16 @@ PathDiagnosticPiece *FindLastStoreBRVisitor::VisitNode(const ExplodedNode *N,
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (!StoreSite) {
|
if (!StoreSite) {
|
||||||
const ExplodedNode *Node = N, *Last = NULL;
|
// Make sure the region is actually bound to value V here.
|
||||||
|
// This is necessary because the region may not actually be live at the
|
||||||
|
// report's error node.
|
||||||
|
if (N->getState()->getSVal(R) != V)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
const ExplodedNode *Node = N, *Last = N;
|
||||||
|
|
||||||
|
// Now look for the store of V.
|
||||||
for ( ; Node ; Node = Node->getFirstPred()) {
|
for ( ; Node ; Node = Node->getFirstPred()) {
|
||||||
|
|
||||||
if (const VarRegion *VR = dyn_cast<VarRegion>(R)) {
|
if (const VarRegion *VR = dyn_cast<VarRegion>(R)) {
|
||||||
if (const PostStmt *P = Node->getLocationAs<PostStmt>())
|
if (const PostStmt *P = Node->getLocationAs<PostStmt>())
|
||||||
if (const DeclStmt *DS = P->getStmtAs<DeclStmt>())
|
if (const DeclStmt *DS = P->getStmtAs<DeclStmt>())
|
||||||
|
|
@ -145,9 +143,11 @@ PathDiagnosticPiece *FindLastStoreBRVisitor::VisitNode(const ExplodedNode *N,
|
||||||
// looking for store sites.
|
// looking for store sites.
|
||||||
if (Node->getState()->getSVal(R) != V)
|
if (Node->getState()->getSVal(R) != V)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
Last = Node;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!Node || !Last) {
|
if (!Node) {
|
||||||
satisfied = true;
|
satisfied = true;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue