From dcf06fa1fbb9c018e152629ef3f3fa7b1acffe7a Mon Sep 17 00:00:00 2001 From: Anna Zaks Date: Wed, 7 Dec 2011 01:09:52 +0000 Subject: [analyzer] Propagate taint through MemRegions. SVal can be not only a symbol, but a MemRegion. Add support for such cases. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@146006 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/StaticAnalyzer/Core/ProgramState.cpp | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) (limited to 'lib/StaticAnalyzer/Core/ProgramState.cpp') diff --git a/lib/StaticAnalyzer/Core/ProgramState.cpp b/lib/StaticAnalyzer/Core/ProgramState.cpp index 2f9a3929e8..bad14c459b 100644 --- a/lib/StaticAnalyzer/Core/ProgramState.cpp +++ b/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(&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(Reg)) + return isTainted(ER->getSuperRegion(), K) || isTainted(ER->getIndex(), K); + + if (const SymbolicRegion *SR = dyn_cast(Reg)) + return isTainted(SR->getSymbol(), K); + + if (const SubRegion *ER = dyn_cast(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) { -- cgit v1.2.3-18-g5258