diff options
author | Anna Zaks <ganna@apple.com> | 2011-12-06 23:12:33 +0000 |
---|---|---|
committer | Anna Zaks <ganna@apple.com> | 2011-12-06 23:12:33 +0000 |
commit | ee1a43533b9311d6e7ef5e07cfa079060b5283d1 (patch) | |
tree | ec56567fa0c4639d1398f7b6f67436eb0fd5c096 /clang/lib/StaticAnalyzer/Core/ProgramState.cpp | |
parent | c25efccc8b448341f1aa124bb6fcc37a72dc0a46 (diff) | |
download | bcm5719-llvm-ee1a43533b9311d6e7ef5e07cfa079060b5283d1.tar.gz bcm5719-llvm-ee1a43533b9311d6e7ef5e07cfa079060b5283d1.zip |
[analyzer] Refactor: Move symbol_iterator from SVal to SymExpr, use it
for finding dependent symbols for taint.
llvm-svn: 145986
Diffstat (limited to 'clang/lib/StaticAnalyzer/Core/ProgramState.cpp')
-rw-r--r-- | clang/lib/StaticAnalyzer/Core/ProgramState.cpp | 40 |
1 files changed, 16 insertions, 24 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/ProgramState.cpp b/clang/lib/StaticAnalyzer/Core/ProgramState.cpp index 2dafeeee00f..a725d381921 100644 --- a/clang/lib/StaticAnalyzer/Core/ProgramState.cpp +++ b/clang/lib/StaticAnalyzer/Core/ProgramState.cpp @@ -673,29 +673,21 @@ bool ProgramState::isTainted(SVal V, TaintTagType Kind) const { bool ProgramState::isTainted(const SymExpr* Sym, TaintTagType Kind) const { if (!Sym) return false; - - // TODO: Can we use symbol_iterator (like removeDeadBindingsWorker) here? - - // Check taint on derived symbols. - if (const SymbolDerived *SD = dyn_cast<SymbolDerived>(Sym)) - return isTainted(SD->getParentSymbol(), Kind); - - if (const SymbolCast *SC = dyn_cast<SymbolCast>(Sym)) - return (isTainted(SC->getOperand(), Kind)); - - if (const SymIntExpr *SIE = dyn_cast<SymIntExpr>(Sym)) - return isTainted(SIE->getLHS(), Kind); - - if (const SymSymExpr *SSE = dyn_cast<SymSymExpr>(Sym)) - return (isTainted(SSE->getLHS(), Kind) || isTainted(SSE->getRHS(), Kind)); - - // Check taint on the current symbol. - if (const SymbolData *SymR = dyn_cast<SymbolData>(Sym)) { - const TaintTagType *Tag = get<TaintMap>(SymR); - return (Tag && *Tag == Kind); + + // Travese all the symbols this symbol depends on to see if any are tainted. + bool Tainted = false; + for (SymExpr::symbol_iterator SI = Sym->symbol_begin(), SE =Sym->symbol_end(); + SI != SE; ++SI) { + assert(isa<SymbolData>(*SI)); + const TaintTagType *Tag = get<TaintMap>(*SI); + Tainted = (Tag && *Tag == Kind); + + // If this is a SymbolDerived with a tainted parent, it's also tainted. + if (const SymbolDerived *SD = dyn_cast<SymbolDerived>(*SI)) + Tainted = Tainted || isTainted(SD->getParentSymbol(), Kind); + if (Tainted) + return true; } - - // TODO: Remove llvm unreachable. - llvm_unreachable("We do not know show to check taint on this symbol."); - return false; + + return Tainted; } |