From 54fc8a05d1ca5c7fbbca35568af785384dcb977c Mon Sep 17 00:00:00 2001 From: Dominic Chen Date: Fri, 18 Nov 2016 21:07:03 +0000 Subject: [PATCH] [analyzer] Refactor recursive symbol reachability check to use symbol_iterator Reviewers: zaks.anna, dcoughlin Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D26773 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@287380 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../Core/PathSensitive/ProgramState.h | 5 +-- lib/StaticAnalyzer/Core/ProgramState.cpp | 33 +++++-------------- 2 files changed, 12 insertions(+), 26 deletions(-) diff --git a/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h b/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h index bd414b06dc..463b375fda 100644 --- a/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h +++ b/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h @@ -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 VisitedItems; diff --git a/lib/StaticAnalyzer/Core/ProgramState.cpp b/lib/StaticAnalyzer/Core/ProgramState.cpp index adda7af08d..03ace35965 100644 --- a/lib/StaticAnalyzer/Core/ProgramState.cpp +++ b/lib/StaticAnalyzer/Core/ProgramState.cpp @@ -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; - - if (!visitor.VisitSymbol(sym)) - return false; + for (SymExpr::symbol_iterator SI = sym->symbol_begin(), + SE = sym->symbol_end(); + SI != SE; ++SI) { + bool wasVisited = !visited.insert(*SI).second; + if (wasVisited) + continue; - // 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(sym)->getOperand()); - case SymExpr::SymIntExprKind: - return scan(cast(sym)->getLHS()); - case SymExpr::IntSymExprKind: - return scan(cast(sym)->getRHS()); - case SymExpr::SymSymExprKind: { - const SymSymExpr *x = cast(sym); - return scan(x->getLHS()) && scan(x->getRHS()); - } + if (!visitor.VisitSymbol(*SI)) + return false; } + return true; } -- 2.40.0