[analyzer] Refactor recursive symbol reachability check to use symbol_iterator

Reviewers: zaks.anna, dcoughlin

Subscribers: cfe-commits

Differential Revision: https://reviews.llvm.org/D26773

llvm-svn: 287380
This commit is contained in:
Dominic Chen 2016-11-18 21:07:03 +00:00
parent 5020c9971b
commit c8629bd35a
2 changed files with 12 additions and 26 deletions

View File

@ -824,8 +824,9 @@ CB ProgramState::scanReachableSymbols(const MemRegion * const *beg,
}
/// \class ScanReachableSymbols
/// A Utility class that allows to visit the reachable symbols using a custom
/// SymbolVisitor.
/// A utility class that visits the reachable symbols using a custom
/// SymbolVisitor. Terminates recursive traversal when the visitor function
/// returns false.
class ScanReachableSymbols {
typedef llvm::DenseSet<const void*> VisitedItems;

View File

@ -527,32 +527,17 @@ bool ScanReachableSymbols::scan(nonloc::CompoundVal val) {
}
bool ScanReachableSymbols::scan(const SymExpr *sym) {
bool wasVisited = !visited.insert(sym).second;
if (wasVisited)
return true;
for (SymExpr::symbol_iterator SI = sym->symbol_begin(),
SE = sym->symbol_end();
SI != SE; ++SI) {
bool wasVisited = !visited.insert(*SI).second;
if (wasVisited)
continue;
if (!visitor.VisitSymbol(sym))
return false;
// TODO: should be rewritten using SymExpr::symbol_iterator.
switch (sym->getKind()) {
case SymExpr::SymbolRegionValueKind:
case SymExpr::SymbolConjuredKind:
case SymExpr::SymbolDerivedKind:
case SymExpr::SymbolExtentKind:
case SymExpr::SymbolMetadataKind:
break;
case SymExpr::SymbolCastKind:
return scan(cast<SymbolCast>(sym)->getOperand());
case SymExpr::SymIntExprKind:
return scan(cast<SymIntExpr>(sym)->getLHS());
case SymExpr::IntSymExprKind:
return scan(cast<IntSymExpr>(sym)->getRHS());
case SymExpr::SymSymExprKind: {
const SymSymExpr *x = cast<SymSymExpr>(sym);
return scan(x->getLHS()) && scan(x->getRHS());
}
if (!visitor.VisitSymbol(*SI))
return false;
}
return true;
}