19 #include "llvm/Support/raw_ostream.h"
21 using namespace clang;
27 switch (E->getStmtClass()) {
28 case Stmt::OpaqueValueExprClass:
29 E = cast<OpaqueValueExpr>(E)->getSourceExpr();
31 case Stmt::ExprWithCleanupsClass:
32 E = cast<ExprWithCleanups>(E)->getSubExpr();
34 case Stmt::CXXBindTemporaryExprClass:
35 E = cast<CXXBindTemporaryExpr>(E)->getSubExpr();
37 case Stmt::SubstNonTypeTemplateParmExprClass:
38 E = cast<SubstNonTypeTemplateParmExpr>(E)->getReplacement();
49 if (
const Expr *E = dyn_cast<Expr>(S))
55 : std::pair<const
Stmt *,
57 L ? L->getCurrentStackFrame()
61 const SVal*
X = ExprBindings.lookup(E);
74 switch (S->getStmtClass()) {
75 case Stmt::CXXBindTemporaryExprClass:
76 case Stmt::ExprWithCleanupsClass:
77 case Stmt::GenericSelectionExprClass:
78 case Stmt::OpaqueValueExprClass:
79 case Stmt::ParenExprClass:
80 case Stmt::SubstNonTypeTemplateParmExprClass:
81 llvm_unreachable(
"Should have been handled by ignoreTransparentExprs");
83 case Stmt::AddrLabelExprClass:
84 case Stmt::CharacterLiteralClass:
85 case Stmt::CXXBoolLiteralExprClass:
86 case Stmt::CXXScalarValueInitExprClass:
87 case Stmt::ImplicitValueInitExprClass:
88 case Stmt::IntegerLiteralClass:
89 case Stmt::ObjCBoolLiteralExprClass:
90 case Stmt::CXXNullPtrLiteralExprClass:
91 case Stmt::ObjCStringLiteralClass:
92 case Stmt::StringLiteralClass:
96 case Stmt::ReturnStmtClass: {
126 MarkLiveCallback(
SymbolReaper &symreaper) : SymReaper(symreaper) {}
127 bool VisitSymbol(
SymbolRef sym)
override {
128 SymReaper.markLive(sym);
131 bool VisitMemRegion(
const MemRegion *R)
override {
132 SymReaper.markLive(R);
155 MarkLiveCallback CB(SymReaper);
158 llvm::ImmutableMapRef<EnvironmentEntry,SVal>
159 EBMapRef(NewEnv.ExprBindings.getRootWithoutRetain(),
167 const SVal &X = I.getData();
171 EBMapRef = EBMapRef.add(BlkExpr, X);
182 for (; SI != SE; ++SI)
187 NewEnv.ExprBindings = EBMapRef.asImmutableMap();
192 const char *Sep)
const {
208 assert(S !=
nullptr &&
"Expected non-null Stmt");
211 << (
const void*) S <<
") ";
214 Out <<
" : " << I.getData();
EnvironmentEntry(const Stmt *s, const LocationContext *L)
MemRegion - The root abstract class for all memory regions.
void print(raw_ostream &Out, const char *NL, const char *Sep) const
void markLive(SymbolRef sym)
Unconditionally marks a symbol as live.
bool maybeDead(SymbolRef sym)
If a symbol is known to be live, marks the symbol as live.
Describes how types, statements, expressions, and declarations should be printed. ...
Defines the clang::Expr interface and subclasses for C++ expressions.
Symbolic value. These values used to capture symbolic execution of the program.
SVal getSVal(const EnvironmentEntry &E, SValBuilder &svalBuilder) const
Environment bindExpr(Environment Env, const EnvironmentEntry &E, SVal V, bool Invalidate)
Bind a symbolic value to the given environment entry.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
static const Expr * ignoreTransparentExprs(const Expr *E)
BindingsTy::iterator iterator
SymExpr::symbol_iterator symbol_begin() const
Optional< T > getAs() const
Convert to the specified SVal type, returning None if this SVal is not of the desired type...
const Stmt * getStmt() const
bool scan(nonloc::LazyCompoundVal val)
Environment getInitialEnvironment()
SymExpr::symbol_iterator symbol_end() const
A class responsible for cleaning up unused symbols.
An immutable map from EnvironemntEntries to SVals.
const LocationContext * getLocationContext() const
const Expr * getRetValue() const
Optional< SVal > getConstantVal(const Expr *E)
Environment removeDeadBindings(Environment Env, SymbolReaper &SymReaper, ProgramStateRef state)
bool isLive(SymbolRef sym)
Expr * IgnoreParens() LLVM_READONLY
Iterator over symbols that the current symbol depends on.