33 TaintMapTy TM = State->get<TaintMap>();
36 Out <<
"Tainted symbols:" << NL;
38 for (
const auto &I : TM)
39 Out << I.first <<
" : " << I.second << NL;
48 return addTaint(State, State->getSVal(E, SF), Kind);
67 if (std::optional<SVal> binding =
68 State->getStateManager().getStoreManager().getDefaultBinding(
70 if (
SymbolRef Sym = binding->getAsSymbol())
81 if (
const SymbolicRegion *SR = dyn_cast_or_null<SymbolicRegion>(R))
82 return addTaint(State, SR->getSymbol(), Kind);
90 while (
const SymbolCast *SC = dyn_cast<SymbolCast>(Sym))
91 Sym = SC->getOperand();
108 if (
const SymbolicRegion *SR = dyn_cast_or_null<SymbolicRegion>(R))
116 while (
const SymbolCast *SC = dyn_cast<SymbolCast>(Sym))
117 Sym = SC->getOperand();
129 if (
const TaintTagType *T = State->get<TaintMap>(ParentSym))
135 return addTaint(State, ParentSym, Kind);
137 const TaintedSubRegions *SavedRegs = State->get<DerivedSymTaint>(ParentSym);
138 TaintedSubRegions::Factory &F = State->get_context<TaintedSubRegions>();
139 TaintedSubRegions Regs = SavedRegs ? *SavedRegs : F.getEmptyMap();
142 ProgramStateRef NewState = State->set<DerivedSymTaint>(ParentSym, Regs);
198 bool returnFirstOnly) {
199 SVal val = State->getSVal(E, SF);
205 bool returnFirstOnly) {
212 StoreManager &StoreMgr = State->getStateManager().getStoreManager();
224 bool returnFirstOnly) {
225 std::vector<SymbolRef> TaintedSymbols;
227 return TaintedSymbols;
230 if (
const ElementRegion *ER = dyn_cast<ElementRegion>(Reg)) {
231 std::vector<SymbolRef> TaintedIndex =
233 llvm::append_range(TaintedSymbols, TaintedIndex);
234 if (returnFirstOnly && !TaintedSymbols.empty())
235 return TaintedSymbols;
240 std::vector<SymbolRef> TaintedRegions =
242 llvm::append_range(TaintedSymbols, TaintedRegions);
243 if (returnFirstOnly && !TaintedSymbols.empty())
244 return TaintedSymbols;
249 if (
const SubRegion *ER = dyn_cast<SubRegion>(Reg)) {
250 std::vector<SymbolRef> TaintedSubRegions =
252 llvm::append_range(TaintedSymbols, TaintedSubRegions);
253 if (returnFirstOnly && !TaintedSymbols.empty())
254 return TaintedSymbols;
257 return TaintedSymbols;
263 bool returnFirstOnly) {
264 std::vector<SymbolRef> TaintedSymbols;
266 return TaintedSymbols;
269 if (
const auto &Opts = State->getAnalysisManager().getAnalyzerOptions();
279 if (
const TaintTagType *Tag = State->get<TaintMap>(SubSym)) {
281 TaintedSymbols.push_back(SubSym);
283 return TaintedSymbols;
287 if (
const auto *SD = dyn_cast<SymbolDerived>(SubSym)) {
290 State, SD->getParentSymbol(), Kind, returnFirstOnly);
291 llvm::append_range(TaintedSymbols, TaintedParents);
292 if (returnFirstOnly && !TaintedSymbols.empty())
293 return TaintedSymbols;
298 if (
const TaintedSubRegions *Regs =
299 State->get<DerivedSymTaint>(SD->getParentSymbol())) {
301 for (
auto I : *Regs) {
306 if (Kind == I.second && R->isSubRegionOf(I.first)) {
307 TaintedSymbols.push_back(SD->getParentSymbol());
308 if (returnFirstOnly && !TaintedSymbols.empty())
309 return TaintedSymbols;
316 if (
const auto *SRV = dyn_cast<SymbolRegionValue>(SubSym)) {
317 std::vector<SymbolRef> TaintedRegions =
319 llvm::append_range(TaintedSymbols, TaintedRegions);
320 if (returnFirstOnly && !TaintedSymbols.empty())
321 return TaintedSymbols;
325 if (
const auto *SC = dyn_cast<SymbolCast>(SubSym)) {
326 std::vector<SymbolRef> TaintedCasts =
328 llvm::append_range(TaintedSymbols, TaintedCasts);
329 if (returnFirstOnly && !TaintedSymbols.empty())
330 return TaintedSymbols;
333 return TaintedSymbols;
#define REGISTER_MAP_WITH_PROGRAMSTATE(Name, Key, Value)
Declares an immutable map of type NameTy, suitable for placement into the ProgramState.
#define REGISTER_MAP_FACTORY_WITH_PROGRAMSTATE(Name, Key, Value)
Declares an immutable map type Name and registers the factory for such maps in the program state,...
This represents one expression.
It represents a stack frame of the call stack.
ElementRegion is used to represent both array elements and casts.
MemRegion - The root abstract class for all memory regions.
LLVM_ATTRIBUTE_RETURNS_NONNULL const MemRegion * getBaseRegion() const
SVal - This represents a symbolic expression, which can be either an L-value or an R-value.
virtual std::optional< SVal > getDefaultBinding(Store store, const MemRegion *R)=0
Return the default value bound to a region in a given store.
SubRegion - A region that subsets another larger region.
llvm::iterator_range< symbol_iterator > symbols() const
virtual unsigned computeComplexity() const =0
Represents a cast expression.
SymbolicRegion - A special, "non-concrete" region.
TypedValueRegion - An abstract class representing regions having a typed value.
While nonloc::CompoundVal covers a few simple use cases, nonloc::LazyCompoundVal is a more performant...
std::vector< SymbolRef > getTaintedSymbolsImpl(ProgramStateRef State, const Expr *E, const StackFrame *SF, TaintTagType Kind, bool returnFirstOnly)
ProgramStateRef removeTaint(ProgramStateRef State, SVal V)
void printTaint(ProgramStateRef State, raw_ostream &Out, const char *nl="\n", const char *sep="")
bool isTainted(ProgramStateRef State, const Expr *E, const StackFrame *SF, TaintTagType Kind=TaintTagGeneric)
Check if the expression has a tainted value in the given state.
ProgramStateRef addPartialTaint(ProgramStateRef State, SymbolRef ParentSym, const SubRegion *SubRegion, TaintTagType Kind=TaintTagGeneric)
Create a new state in a which a sub-region of a given symbol is tainted.
ProgramStateRef addTaint(ProgramStateRef State, const Expr *E, const StackFrame *SF, TaintTagType Kind=TaintTagGeneric)
Create a new state in which the value of the expression is marked as tainted.
std::vector< SymbolRef > getTaintedSymbols(ProgramStateRef State, const Expr *E, const StackFrame *SF, TaintTagType Kind=TaintTagGeneric)
Returns the tainted Symbols for a given expression and state.
LLVM_DUMP_METHOD void dumpTaint(ProgramStateRef State)
unsigned TaintTagType
The type of taint, which helps to differentiate between different types of taint.
IntrusiveRefCntPtr< const ProgramState > ProgramStateRef
const SymExpr * SymbolRef
The JSON file list parser is used to communicate input to InstallAPI.
bool isa(CodeGen::Address addr)
for(const auto &A :T->param_types())