14#ifndef LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_SYMBOLMANAGER_H
15#define LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_SYMBOLMANAGER_H
25#include "llvm/ADT/DenseMap.h"
26#include "llvm/ADT/DenseSet.h"
27#include "llvm/ADT/FoldingSet.h"
28#include "llvm/ADT/ImmutableSet.h"
29#include "llvm/ADT/iterator_range.h"
30#include "llvm/Support/Allocator.h"
40class BasicValueFactory;
49 :
SymbolData(SymbolRegionValueKind, sym), R(r) {
55 LLVM_ATTRIBUTE_RETURNS_NONNULL
59 profile.AddInteger((
unsigned) SymbolRegionValueKind);
60 profile.AddPointer(R);
63 void Profile(llvm::FoldingSetNodeID& profile)
override {
76 return SE->
getKind() == SymbolRegionValueKind;
87 const void *SymbolTag;
91 QualType t,
unsigned count,
const void *symbolTag)
92 :
SymbolData(SymbolConjuredKind, sym), S(
s),
T(t), Count(count),
93 LCtx(lctx), SymbolTag(symbolTag) {
108 const void *
getTag()
const {
return SymbolTag; }
116 static void Profile(llvm::FoldingSetNodeID& profile,
const Stmt *S,
118 const void *SymbolTag) {
119 profile.AddInteger((
unsigned) SymbolConjuredKind);
120 profile.AddPointer(S);
121 profile.AddPointer(LCtx);
123 profile.AddInteger(Count);
124 profile.AddPointer(SymbolTag);
127 void Profile(llvm::FoldingSetNodeID& profile)
override {
128 Profile(profile, S,
T, Count, LCtx, SymbolTag);
133 return SE->
getKind() == SymbolConjuredKind;
145 :
SymbolData(SymbolDerivedKind, sym), parentSymbol(parent), R(r) {
152 LLVM_ATTRIBUTE_RETURNS_NONNULL
154 LLVM_ATTRIBUTE_RETURNS_NONNULL
166 profile.AddInteger((
unsigned) SymbolDerivedKind);
167 profile.AddPointer(r);
168 profile.AddPointer(parent);
171 void Profile(llvm::FoldingSetNodeID& profile)
override {
172 Profile(profile, parentSymbol, R);
177 return SE->
getKind() == SymbolDerivedKind;
194 LLVM_ATTRIBUTE_RETURNS_NONNULL
204 profile.AddInteger((
unsigned) SymbolExtentKind);
205 profile.AddPointer(R);
208 void Profile(llvm::FoldingSetNodeID& profile)
override {
214 return SE->
getKind() == SymbolExtentKind;
233 :
SymbolData(SymbolMetadataKind, sym), R(r), S(
s),
T(t), LCtx(LCtx),
234 Count(count), Tag(tag) {
243 LLVM_ATTRIBUTE_RETURNS_NONNULL
246 LLVM_ATTRIBUTE_RETURNS_NONNULL
249 LLVM_ATTRIBUTE_RETURNS_NONNULL
254 LLVM_ATTRIBUTE_RETURNS_NONNULL
255 const void *
getTag()
const {
return Tag; }
265 unsigned Count,
const void *Tag) {
266 profile.AddInteger((
unsigned)SymbolMetadataKind);
267 profile.AddPointer(R);
268 profile.AddPointer(S);
270 profile.AddPointer(LCtx);
271 profile.AddInteger(Count);
272 profile.AddPointer(Tag);
275 void Profile(llvm::FoldingSetNodeID& profile)
override {
276 Profile(profile, R, S,
T, LCtx, Count, Tag);
281 return SE->
getKind() == SymbolMetadataKind;
297 :
SymExpr(SymbolCastKind, Sym), Operand(In), FromTy(From), ToTy(To) {
307 Complexity = 1 + Operand->computeComplexity();
313 LLVM_ATTRIBUTE_RETURNS_NONNULL
320 ID.AddInteger((
unsigned) SymbolCastKind);
332 return SE->
getKind() == SymbolCastKind;
345 :
SymExpr(UnarySymExprKind, Sym), Operand(In), Op(Op),
T(
T) {
348 assert((Op == UO_Minus || Op == UO_Not) &&
"non-supported unary expression");
359 Complexity = 1 + Operand->computeComplexity();
371 ID.AddInteger((
unsigned)UnarySymExprKind);
383 return SE->
getKind() == UnarySymExprKind;
412 return k >= BEGIN_BINARYSYMEXPRS && k <= END_BINARYSYMEXPRS;
417 return Value->computeComplexity();
432template <
class LHSTYPE,
class RHSTYPE, SymExpr::Kind ClassKind>
462 static void Profile(llvm::FoldingSetNodeID &
ID, LHSTYPE lhs,
464 ID.AddInteger((
unsigned)ClassKind);
481 SymExpr::Kind::SymIntExprKind>;
485 SymExpr::Kind::IntSymExprKind>;
489 SymExpr::Kind::SymSymExprKind>;
493 llvm::BumpPtrAllocator &Alloc;
498 template <
class SymT,
typename... ArgsT> SymT *
make(ArgsT &&...Args) {
499 return new (Alloc) SymT(nextID(), std::forward<ArgsT>(Args)...);
503 SymbolID nextID() {
return NextSymbolID++; }
507 using DataSetTy = llvm::FoldingSet<SymExpr>;
508 using SymbolDependTy =
509 llvm::DenseMap<SymbolRef, std::unique_ptr<SymbolRefSmallVectorTy>>;
515 SymbolDependTy SymbolDependencies;
523 llvm::BumpPtrAllocator &bpalloc)
524 : SymbolDependencies(16), Alloc(bpalloc), BV(bv), Ctx(ctx) {}
535 const void *SymbolTag =
nullptr);
540 const void *SymbolTag =
nullptr) {
557 const void *SymbolTag =
nullptr);
601 using SymbolSetTy = llvm::DenseSet<SymbolRef>;
602 using SymbolMapTy = llvm::DenseMap<SymbolRef, SymbolStatus>;
603 using RegionSetTy = llvm::DenseSet<const MemRegion *>;
605 SymbolMapTy TheLiving;
606 SymbolSetTy MetadataInUse;
608 RegionSetTy LiveRegionRoots;
613 RegionSetTy LazilyCopiedRegionRoots;
619 llvm::DenseMap<const MemRegion *, unsigned> includedRegionCache;
631 : LCtx(Ctx),
Loc(
s), SymMgr(symmgr), reapedStore(nullptr, storeMgr) {}
639 bool isLive(
const VarRegion *VR,
bool includeStoreBindings =
false)
const;
657 llvm::iterator_range<RegionSetTy::const_iterator>
regions()
const {
658 return LiveRegionRoots;
678 bool isLazilyCopiedRegion(
const MemRegion *region)
const;
682 bool isReadableRegion(
const MemRegion *region);
720struct llvm::ImutContainerInfo<
clang::ento::SymbolRef>
This file defines AnalysisDeclContext, a class that manages the analysis context data for context sen...
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
llvm::DenseMap< const CFGBlock *, unsigned > VisitCount
C Language Family Type Representation.
__device__ __2f16 float __ockl_bool s
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
This represents one expression.
It wraps the AnalysisDeclContext to represent both the call stack with the help of StackFrameContext ...
A (possibly-)qualified type.
It represents a stack frame of the call stack (based on CallEvent).
Stmt - This represents one statement.
A safe wrapper around APSInt objects allocated and owned by BasicValueFactory.
Template implementation for all binary symbolic expressions.
static void Profile(llvm::FoldingSetNodeID &ID, LHSTYPE lhs, BinaryOperator::Opcode op, RHSTYPE rhs, QualType t)
void Profile(llvm::FoldingSetNodeID &ID) override
void dumpToStream(raw_ostream &os) const override
unsigned computeComplexity() const override
static bool classof(const SymExpr *SE)
Represents a symbolic expression involving a binary operator.
QualType getType() const override
BinaryOperator::Opcode getOpcode() const
static unsigned computeOperandComplexity(const SymExpr *Value)
static void dumpToStreamImpl(raw_ostream &os, const SymExpr *Value)
static bool classof(const SymExpr *SE)
static unsigned computeOperandComplexity(const llvm::APSInt &Value)
BinarySymExpr(SymbolID Sym, Kind k, BinaryOperator::Opcode op, QualType t)
static const llvm::APSInt * getPointer(APSIntPtr Value)
static const SymExpr * getPointer(const SymExpr *Value)
static bool isLocType(QualType T)
MemRegion - The root abstract class for all memory regions.
SubRegion - A region that subsets another larger region.
SymT * make(ArgsT &&...Args)
SymExprAllocator(llvm::BumpPtrAllocator &Alloc)
static bool isValidTypeForSymbol(QualType T)
virtual QualType getType() const =0
SymbolID getSymbolID() const
Get a unique identifier for this symbol.
Represents a cast expression.
static bool classof(const SymExpr *SE)
static void Profile(llvm::FoldingSetNodeID &ID, const SymExpr *In, QualType From, QualType To)
QualType getType() const override
void Profile(llvm::FoldingSetNodeID &ID) override
void dumpToStream(raw_ostream &os) const override
LLVM_ATTRIBUTE_RETURNS_NONNULL const SymExpr * getOperand() const
unsigned computeComplexity() const override
A symbol representing the result of an expression in the case when we do not know anything about what...
void Profile(llvm::FoldingSetNodeID &profile) override
unsigned getCount() const
static bool classof(const SymExpr *SE)
StringRef getKindStr() const override
Get a string representation of the kind of the region.
static void Profile(llvm::FoldingSetNodeID &profile, const Stmt *S, QualType T, unsigned Count, const LocationContext *LCtx, const void *SymbolTag)
const void * getTag() const
It might return null.
void dumpToStream(raw_ostream &os) const override
QualType getType() const override
const Stmt * getStmt() const
It might return null.
A symbol representing data which can be stored in a memory location (region).
A symbol representing the value of a MemRegion whose parent region has symbolic value.
LLVM_ATTRIBUTE_RETURNS_NONNULL SymbolRef getParentSymbol() const
StringRef getKindStr() const override
Get a string representation of the kind of the region.
void dumpToStream(raw_ostream &os) const override
const MemRegion * getOriginRegion() const override
Find the region from which this symbol originates.
static void Profile(llvm::FoldingSetNodeID &profile, SymbolRef parent, const TypedValueRegion *r)
void Profile(llvm::FoldingSetNodeID &profile) override
QualType getType() const override
LLVM_ATTRIBUTE_RETURNS_NONNULL const TypedValueRegion * getRegion() const
static bool classof(const SymExpr *SE)
SymbolExtent - Represents the extent (size in bytes) of a bounded region.
static bool classof(const SymExpr *SE)
LLVM_ATTRIBUTE_RETURNS_NONNULL const SubRegion * getRegion() const
void dumpToStream(raw_ostream &os) const override
QualType getType() const override
static void Profile(llvm::FoldingSetNodeID &profile, const SubRegion *R)
StringRef getKindStr() const override
Get a string representation of the kind of the region.
void Profile(llvm::FoldingSetNodeID &profile) override
const SymbolExtent * getExtentSymbol(const SubRegion *R)
SymbolManager(ASTContext &ctx, BasicValueFactory &bv, llvm::BumpPtrAllocator &bpalloc)
const SymbolDerived * getDerivedSymbol(SymbolRef parentSymbol, const TypedValueRegion *R)
const SymIntExpr * getSymIntExpr(const SymExpr &lhs, BinaryOperator::Opcode op, APSIntPtr rhs, QualType t)
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 SymbolRegionValue * getRegionValueSymbol(const TypedValueRegion *R)
Make a unique symbol for MemRegion R according to its kind.
const SymIntExpr * getSymIntExpr(const SymExpr *lhs, BinaryOperator::Opcode op, APSIntPtr rhs, QualType t)
const SymbolConjured * conjureSymbol(const Stmt *E, const LocationContext *LCtx, QualType T, unsigned VisitCount, const void *SymbolTag=nullptr)
const IntSymExpr * getIntSymExpr(APSIntPtr lhs, BinaryOperator::Opcode op, const SymExpr *rhs, QualType t)
void addSymbolDependency(const SymbolRef Primary, const SymbolRef Dependent)
Add artificial symbol dependency.
BasicValueFactory & getBasicVals()
QualType getType(const SymExpr *SE) const
const SymbolCast * getCastSymbol(const SymExpr *Operand, QualType From, QualType To)
const SymbolConjured * conjureSymbol(const Expr *E, const LocationContext *LCtx, unsigned VisitCount, const void *SymbolTag=nullptr)
const UnarySymExpr * getUnarySymExpr(const SymExpr *operand, UnaryOperator::Opcode op, QualType t)
const SymbolRefSmallVectorTy * getDependentSymbols(const SymbolRef Primary)
static bool canSymbolicate(QualType T)
const SymSymExpr * getSymSymExpr(const SymExpr *lhs, BinaryOperator::Opcode op, const SymExpr *rhs, QualType t)
ASTContext & getContext()
A class responsible for cleaning up unused symbols.
void markLive(SymbolRef sym)
Unconditionally marks a symbol as live.
void markElementIndicesLive(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...
bool isDead(SymbolRef sym)
Returns whether or not a symbol has been confirmed dead.
void markInUse(SymbolRef sym)
Marks a symbol as important to a checker.
bool isLiveRegion(const MemRegion *region)
void markLazilyCopied(const MemRegion *region)
const LocationContext * getLocationContext() const
It might return null.
void setReapedStore(StoreRef st)
Set to the value of the symbolic store after StoreManager::removeDeadBindings has been called.
bool isLive(SymbolRef sym)
llvm::iterator_range< RegionSetTy::const_iterator > regions() const
A symbol representing the value stored at a MemRegion.
void dumpToStream(raw_ostream &os) const override
const MemRegion * getOriginRegion() const override
Find the region from which this symbol originates.
void Profile(llvm::FoldingSetNodeID &profile) override
LLVM_ATTRIBUTE_RETURNS_NONNULL const TypedValueRegion * getRegion() const
static void Profile(llvm::FoldingSetNodeID &profile, const TypedValueRegion *R)
QualType getType() const override
StringRef getKindStr() const override
Get a string representation of the kind of the region.
static bool classof(const SymExpr *SE)
virtual bool VisitMemRegion(const MemRegion *)
SymbolVisitor(const SymbolVisitor &)=default
SymbolVisitor(SymbolVisitor &&)
SymbolVisitor & operator=(SymbolVisitor &&)=delete
SymbolVisitor & operator=(const SymbolVisitor &)=delete
virtual bool VisitSymbol(SymbolRef sym)=0
A visitor method invoked by ProgramStateManager::scanReachableSymbols.
TypedValueRegion - An abstract class representing regions having a typed value.
virtual QualType getValueType() const =0
Represents a symbolic expression involving a unary operator.
void dumpToStream(raw_ostream &os) const override
void Profile(llvm::FoldingSetNodeID &ID) override
QualType getType() const override
static bool classof(const SymExpr *SE)
UnaryOperator::Opcode getOpcode() const
unsigned computeComplexity() const override
static void Profile(llvm::FoldingSetNodeID &ID, const SymExpr *In, UnaryOperator::Opcode Op, QualType T)
const SymExpr * getOperand() const
const SymExpr * SymbolRef
The JSON file list parser is used to communicate input to InstallAPI.
const FunctionProtoType * T
static key_type_ref KeyOfValue(value_type_ref D)
static data_type_ref DataOfValue(value_type_ref)
static bool isEqual(clang::ento::SymbolRef LHS, clang::ento::SymbolRef RHS)
static bool isLess(clang::ento::SymbolRef LHS, clang::ento::SymbolRef RHS)
static bool isDataEqual(data_type_ref, data_type_ref)