Go to the documentation of this file.
14 #ifndef LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_SYMBOLMANAGER_H
15 #define LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_SYMBOLMANAGER_H
24 #include "llvm/ADT/DenseMap.h"
25 #include "llvm/ADT/DenseSet.h"
26 #include "llvm/ADT/FoldingSet.h"
27 #include "llvm/Support/Allocator.h"
37 class BasicValueFactory;
46 :
SymbolData(SymbolRegionValueKind, sym), R(r) {
51 LLVM_ATTRIBUTE_RETURNS_NONNULL
55 profile.AddInteger((
unsigned) SymbolRegionValueKind);
56 profile.AddPointer(R);
59 void Profile(llvm::FoldingSetNodeID& profile)
override {
72 return SE->
getKind() == SymbolRegionValueKind;
83 const void *SymbolTag;
87 QualType t,
unsigned count,
const void *symbolTag)
88 :
SymbolData(SymbolConjuredKind, sym), S(
s), T(t), Count(count),
89 LCtx(lctx), SymbolTag(symbolTag) {
103 const void *
getTag()
const {
return SymbolTag; }
111 static void Profile(llvm::FoldingSetNodeID& profile,
const Stmt *S,
113 const void *SymbolTag) {
114 profile.AddInteger((
unsigned) SymbolConjuredKind);
115 profile.AddPointer(S);
116 profile.AddPointer(LCtx);
118 profile.AddInteger(Count);
119 profile.AddPointer(SymbolTag);
122 void Profile(llvm::FoldingSetNodeID& profile)
override {
123 Profile(profile, S, T, Count, LCtx, SymbolTag);
128 return SE->
getKind() == SymbolConjuredKind;
140 :
SymbolData(SymbolDerivedKind, sym), parentSymbol(parent), R(r) {
146 LLVM_ATTRIBUTE_RETURNS_NONNULL
148 LLVM_ATTRIBUTE_RETURNS_NONNULL
160 profile.AddInteger((
unsigned) SymbolDerivedKind);
161 profile.AddPointer(r);
162 profile.AddPointer(parent);
165 void Profile(llvm::FoldingSetNodeID& profile)
override {
166 Profile(profile, parentSymbol, R);
171 return SE->
getKind() == SymbolDerivedKind;
187 LLVM_ATTRIBUTE_RETURNS_NONNULL
197 profile.AddInteger((
unsigned) SymbolExtentKind);
198 profile.AddPointer(R);
201 void Profile(llvm::FoldingSetNodeID& profile)
override {
207 return SE->
getKind() == SymbolExtentKind;
226 :
SymbolData(SymbolMetadataKind, sym), R(r), S(
s), T(t), LCtx(LCtx),
227 Count(count), Tag(tag) {
235 LLVM_ATTRIBUTE_RETURNS_NONNULL
238 LLVM_ATTRIBUTE_RETURNS_NONNULL
241 LLVM_ATTRIBUTE_RETURNS_NONNULL
246 LLVM_ATTRIBUTE_RETURNS_NONNULL
247 const void *
getTag()
const {
return Tag; }
257 unsigned Count,
const void *Tag) {
258 profile.AddInteger((
unsigned)SymbolMetadataKind);
259 profile.AddPointer(R);
260 profile.AddPointer(S);
262 profile.AddPointer(LCtx);
263 profile.AddInteger(Count);
264 profile.AddPointer(Tag);
267 void Profile(llvm::FoldingSetNodeID& profile)
override {
268 Profile(profile, R, S, T, LCtx, Count, Tag);
273 return SE->
getKind() == SymbolMetadataKind;
289 :
SymExpr(SymbolCastKind), Operand(In), FromTy(From), ToTy(To) {
298 Complexity = 1 + Operand->computeComplexity();
304 LLVM_ATTRIBUTE_RETURNS_NONNULL
311 ID.AddInteger((
unsigned) SymbolCastKind);
323 return SE->
getKind() == SymbolCastKind;
335 :
SymExpr(UnarySymExprKind), Operand(In), Op(Op), T(T) {
338 assert((Op == UO_Minus || Op == UO_Not) &&
"non-supported unary expression");
348 Complexity = 1 + Operand->computeComplexity();
360 ID.AddInteger((
unsigned)UnarySymExprKind);
372 return SE->
getKind() == UnarySymExprKind;
401 return k >= BEGIN_BINARYSYMEXPRS && k <= END_BINARYSYMEXPRS;
406 return Value->computeComplexity();
423 template <
class LHSTYPE,
class RHSTYPE, SymExpr::Kind ClassKind>
452 static void Profile(llvm::FoldingSetNodeID &
ID, LHSTYPE lhs,
454 ID.AddInteger((
unsigned)ClassKind);
471 SymExpr::Kind::SymIntExprKind>;
475 SymExpr::Kind::IntSymExprKind>;
479 SymExpr::Kind::SymSymExprKind>;
482 using DataSetTy = llvm::FoldingSet<SymExpr>;
483 using SymbolDependTy =
484 llvm::DenseMap<SymbolRef, std::unique_ptr<SymbolRefSmallVectorTy>>;
490 SymbolDependTy SymbolDependencies;
492 unsigned SymbolCounter = 0;
493 llvm::BumpPtrAllocator& BPAlloc;
499 llvm::BumpPtrAllocator& bpalloc)
500 : SymbolDependencies(16), BPAlloc(bpalloc), BV(bv), Ctx(ctx) {}
511 const void *SymbolTag =
nullptr);
516 const void *SymbolTag =
nullptr) {
533 const void *SymbolTag =
nullptr);
579 using SymbolMapTy = llvm::DenseMap<SymbolRef, SymbolStatus>;
582 SymbolMapTy TheLiving;
596 llvm::DenseMap<const MemRegion *, unsigned> includedRegionCache;
608 : LCtx(Ctx),
Loc(
s), SymMgr(symmgr), reapedStore(nullptr, storeMgr) {}
616 bool isLive(
const VarRegion *VR,
bool includeStoreBindings =
false)
const;
656 bool isLazilyCopiedRegion(
const MemRegion *region)
const;
660 bool isReadableRegion(
const MemRegion *region);
687 #endif // LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_SYMBOLMANAGER_H
const LLVM_ATTRIBUTE_RETURNS_NONNULL SymExpr * getOperand() const
static bool isLocType(QualType T)
void dumpToStream(raw_ostream &os) const override
const SymbolConjured * conjureSymbol(const Stmt *E, const LocationContext *LCtx, QualType T, unsigned VisitCount, const void *SymbolTag=nullptr)
const UnarySymExpr * getUnarySymExpr(const SymExpr *operand, UnaryOperator::Opcode op, QualType t)
It wraps the AnalysisDeclContext to represent both the call stack with the help of StackFrameContext ...
void Profile(llvm::FoldingSetNodeID &ID) override
const void * getTag() const
It might return null.
const IntSymExpr * getIntSymExpr(const llvm::APSInt &lhs, BinaryOperator::Opcode op, const SymExpr *rhs, QualType t)
const LLVM_ATTRIBUTE_RETURNS_NONNULL TypedValueRegion * getRegion() const
LLVM_ATTRIBUTE_RETURNS_NONNULL SymbolRef getParentSymbol() const
static void Profile(llvm::FoldingSetNodeID &ID, const SymExpr *In, UnaryOperator::Opcode Op, QualType T)
const LLVM_ATTRIBUTE_RETURNS_NONNULL SubRegion * getRegion() const
static void dumpToStreamImpl(raw_ostream &os, const SymExpr *Value)
RegionSetTy::const_iterator region_iterator
const SymSymExpr * getSymSymExpr(const SymExpr *lhs, BinaryOperator::Opcode op, const SymExpr *rhs, QualType t)
SymbolManager(ASTContext &ctx, BasicValueFactory &bv, llvm::BumpPtrAllocator &bpalloc)
A (possibly-)qualified type.
BasicValueFactory & getBasicVals()
StringRef getKindStr() const override
Get a string representation of the kind of the region.
Represents a symbolic expression involving a binary operator.
QualType getType() const override
SymbolExtent(SymbolID sym, const SubRegion *r)
const LLVM_ATTRIBUTE_RETURNS_NONNULL TypedValueRegion * getRegion() const
static bool classof(const SymExpr *SE)
void dumpToStream(raw_ostream &os) const override
const SymbolConjured * conjureSymbol(const Expr *E, const LocationContext *LCtx, unsigned VisitCount, const void *SymbolTag=nullptr)
It represents a stack frame of the call stack (based on CallEvent).
BinarySymExprImpl(LHSTYPE lhs, BinaryOperator::Opcode op, RHSTYPE rhs, QualType t)
A symbol representing the result of an expression in the case when we do not know anything about what...
QualType getType() const override
Represents a cast expression.
virtual bool VisitMemRegion(const MemRegion *)
MemRegion - The root abstract class for all memory regions.
const SymbolCast * getCastSymbol(const SymExpr *Operand, QualType From, QualType To)
bool isDead(SymbolRef sym)
Returns whether or not a symbol has been confirmed dead.
unsigned getCount() const
UnaryOperator::Opcode getOpcode() const
ASTContext & getContext()
QualType getType() const override
void addSymbolDependency(const SymbolRef Primary, const SymbolRef Dependent)
Add artificial symbol dependency.
QualType getType() const override
const SymbolDerived * getDerivedSymbol(SymbolRef parentSymbol, const TypedValueRegion *R)
virtual QualType getType() const =0
BinarySymExpr(Kind k, BinaryOperator::Opcode op, QualType t)
void markInUse(SymbolRef sym)
Marks a symbol as important to a checker.
void Profile(llvm::FoldingSetNodeID &ID) override
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
unsigned computeComplexity() const override
void Profile(llvm::FoldingSetNodeID &profile) override
const SymIntExpr * getSymIntExpr(const SymExpr &lhs, BinaryOperator::Opcode op, const llvm::APSInt &rhs, QualType t)
A symbol representing the value stored at a MemRegion.
static bool classof(const SymExpr *SE)
BinaryOperator::Opcode getOpcode() const
void dumpToStream(raw_ostream &os) const override
static bool classof(const SymExpr *SE)
static unsigned computeOperandComplexity(const llvm::APSInt &Value)
void setReapedStore(StoreRef st)
Set to the value of the symbolic store after StoreManager::removeDeadBindings has been called.
A class responsible for cleaning up unused symbols.
void markElementIndicesLive(const MemRegion *region)
SymbolExtent - Represents the extent (size in bytes) of a bounded region.
void Profile(llvm::FoldingSetNodeID &profile) override
bool isLiveRegion(const MemRegion *region)
unsigned computeComplexity() const override
SymbolVisitor(SymbolVisitor &&)
void dumpToStream(raw_ostream &os) const override
QualType getType() const override
region_iterator region_begin() const
SymbolRegionValue(SymbolID sym, const TypedValueRegion *r)
const SymbolMetadata * getMetadataSymbol(const MemRegion *R, const Stmt *S, QualType T, const LocationContext *LCtx, unsigned VisitCount, const void *SymbolTag=nullptr)
Creates a metadata symbol associated with a specific region.
const SymbolRefSmallVectorTy * getDependentSymbols(const SymbolRef Primary)
const LocationContext * getLocationContext() const
It might return null.
Template implementation for all binary symbolic expressions.
const SymIntExpr * getSymIntExpr(const SymExpr *lhs, BinaryOperator::Opcode op, const llvm::APSInt &rhs, QualType t)
const SymbolRegionValue * getRegionValueSymbol(const TypedValueRegion *R)
Make a unique symbol for MemRegion R according to its kind.
static const SymExpr * getPointer(const SymExpr *Value)
BinarySymExprImpl< const SymExpr *, const llvm::APSInt &, SymExpr::Kind::SymIntExprKind > SymIntExpr
Represents a symbolic expression like 'x' + 3.
StringRef getKindStr() const override
Get a string representation of the kind of the region.
QualType getType() const override
static void Profile(llvm::FoldingSetNodeID &profile, const SubRegion *R)
void Profile(llvm::FoldingSetNodeID &ID) override
static void Profile(llvm::FoldingSetNodeID &ID, LHSTYPE lhs, BinaryOperator::Opcode op, RHSTYPE rhs, QualType t)
static bool classof(const SymExpr *SE)
StringRef getKindStr() const override
Get a string representation of the kind of the region.
Represents a symbolic expression involving a unary operator.
const MemRegion * getOriginRegion() const override
Find the region from which this symbol originates.
SymbolCast(const SymExpr *In, QualType From, QualType To)
static void Profile(llvm::FoldingSetNodeID &profile, SymbolRef parent, const TypedValueRegion *r)
const Stmt * getStmt() const
It might return null.
static bool isValidTypeForSymbol(QualType T)
static void Profile(llvm::FoldingSetNodeID &profile, const Stmt *S, QualType T, unsigned Count, const LocationContext *LCtx, const void *SymbolTag)
void Profile(llvm::FoldingSetNodeID &profile) override
QualType getType(const SymExpr *SE) const
void markLive(SymbolRef sym)
Unconditionally marks a symbol as live.
static bool classof(const SymExpr *SE)
virtual QualType getValueType() const =0
static void Profile(llvm::FoldingSetNodeID &ID, const SymExpr *In, QualType From, QualType To)
void Profile(llvm::FoldingSetNodeID &profile) override
Stmt - This represents one statement.
void dumpToStream(raw_ostream &os) const override
A symbol representing data which can be stored in a memory location (region).
const SymbolExtent * getExtentSymbol(const SubRegion *R)
const MemRegion * getOriginRegion() const override
Find the region from which this symbol originates.
__device__ __2f16 float bool s
region_iterator region_end() const
void dumpToStream(raw_ostream &os) const override
StringRef getKindStr() const override
Get a string representation of the kind of the region.
QualType getType() const override
bool isLive(SymbolRef sym)
static bool classof(const SymExpr *SE)
static const llvm::APSInt * getPointer(const llvm::APSInt &Value)
TypedValueRegion - An abstract class representing regions having a typed value.
SubRegion - A region that subsets another larger region.
unsigned computeComplexity() const override
const SymExpr * getOperand() const
UnarySymExpr(const SymExpr *In, UnaryOperator::Opcode Op, QualType T)
virtual bool VisitSymbol(SymbolRef sym)=0
A visitor method invoked by ProgramStateManager::scanReachableSymbols.
static void Profile(llvm::FoldingSetNodeID &profile, const TypedValueRegion *R)
This represents one expression.
static unsigned computeOperandComplexity(const SymExpr *Value)
static bool classof(const SymExpr *SE)
void dumpToStream(raw_ostream &os) const override
A symbol representing the value of a MemRegion whose parent region has symbolic value.
void markLazilyCopied(const MemRegion *region)
SymbolReaper(const StackFrameContext *Ctx, const Stmt *s, SymbolManager &symmgr, StoreManager &storeMgr)
Construct a reaper object, which removes everything which is not live before we execute statement s i...
static bool canSymbolicate(QualType T)
static bool classof(const SymExpr *SE)
SymbolConjured(SymbolID sym, const Stmt *s, const LocationContext *lctx, QualType t, unsigned count, const void *symbolTag)
SymbolDerived(SymbolID sym, SymbolRef parent, const TypedValueRegion *r)