diff options
author | Dominic Chen <d.c.ddcc@gmail.com> | 2016-11-18 21:07:03 +0000 |
---|---|---|
committer | Dominic Chen <d.c.ddcc@gmail.com> | 2016-11-18 21:07:03 +0000 |
commit | c8629bd35a3f8e510d169888f5b5efeb53902fef (patch) | |
tree | 81141653224d4a77306ac289fb46ef727688ed85 /clang/lib/StaticAnalyzer/Core/ProgramState.cpp | |
parent | 5020c9971b2049d255069ea81ce02a085be2e191 (diff) | |
download | bcm5719-llvm-c8629bd35a3f8e510d169888f5b5efeb53902fef.tar.gz bcm5719-llvm-c8629bd35a3f8e510d169888f5b5efeb53902fef.zip |
[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
Diffstat (limited to 'clang/lib/StaticAnalyzer/Core/ProgramState.cpp')
-rw-r--r-- | clang/lib/StaticAnalyzer/Core/ProgramState.cpp | 33 |
1 files changed, 9 insertions, 24 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/ProgramState.cpp b/clang/lib/StaticAnalyzer/Core/ProgramState.cpp index adda7af08db..03ace35965c 100644 --- a/clang/lib/StaticAnalyzer/Core/ProgramState.cpp +++ b/clang/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<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; } |