diff options
author | Anna Zaks <ganna@apple.com> | 2011-12-07 01:09:52 +0000 |
---|---|---|
committer | Anna Zaks <ganna@apple.com> | 2011-12-07 01:09:52 +0000 |
commit | b86fdbe7e38a4e71cdda12cce2253e1f3235743a (patch) | |
tree | 3edb034ed2c2945c6c34a27f290ec6092ce924de /clang/lib/StaticAnalyzer/Core/ProgramState.cpp | |
parent | e2b3ff2a07c44ff5f21d7b62304a1295f9b6d508 (diff) | |
download | bcm5719-llvm-b86fdbe7e38a4e71cdda12cce2253e1f3235743a.tar.gz bcm5719-llvm-b86fdbe7e38a4e71cdda12cce2253e1f3235743a.zip |
[analyzer] Propagate taint through MemRegions.
SVal can be not only a symbol, but a MemRegion. Add support for such
cases.
llvm-svn: 146006
Diffstat (limited to 'clang/lib/StaticAnalyzer/Core/ProgramState.cpp')
-rw-r--r-- | clang/lib/StaticAnalyzer/Core/ProgramState.cpp | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/ProgramState.cpp b/clang/lib/StaticAnalyzer/Core/ProgramState.cpp index 2f9a3929e8a..bad14c459bb 100644 --- a/clang/lib/StaticAnalyzer/Core/ProgramState.cpp +++ b/clang/lib/StaticAnalyzer/Core/ProgramState.cpp @@ -664,18 +664,41 @@ const ProgramState* ProgramState::addTaint(SymbolRef Sym, } bool ProgramState::isTainted(const Stmt *S, TaintTagType Kind) const { + SVal val = getSVal(S); return isTainted(getSVal(S), Kind); } bool ProgramState::isTainted(SVal V, TaintTagType Kind) const { - return isTainted(V.getAsSymExpr(), Kind); + if (const SymExpr *Sym = V.getAsSymExpr()) + return isTainted(Sym, Kind); + if (loc::MemRegionVal *RegVal = dyn_cast<loc::MemRegionVal>(&V)) + return isTainted(RegVal->getRegion(), Kind); + return false; +} + +bool ProgramState::isTainted(const MemRegion *Reg, TaintTagType K) const { + if (!Reg) + return false; + + // Element region (array element) is tainted if either the base or the offset + // are tainted. + if (const ElementRegion *ER = dyn_cast<ElementRegion>(Reg)) + return isTainted(ER->getSuperRegion(), K) || isTainted(ER->getIndex(), K); + + if (const SymbolicRegion *SR = dyn_cast<SymbolicRegion>(Reg)) + return isTainted(SR->getSymbol(), K); + + if (const SubRegion *ER = dyn_cast<SubRegion>(Reg)) + return isTainted(ER->getSuperRegion(), K); + + return false; } bool ProgramState::isTainted(const SymExpr* Sym, TaintTagType Kind) const { if (!Sym) return false; - // Travese all the symbols this symbol depends on to see if any are tainted. + // Traverse 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) { |