15#ifndef LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_MEMREGION_H
16#define LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_MEMREGION_H
31#include "llvm/ADT/DenseMap.h"
32#include "llvm/ADT/FoldingSet.h"
33#include "llvm/ADT/PointerIntPair.h"
34#include "llvm/ADT/iterator_range.h"
35#include "llvm/Support/Allocator.h"
36#include "llvm/Support/Casting.h"
37#include "llvm/Support/ErrorHandling.h"
47class AnalysisDeclContext;
51class StackFrameContext;
57class MemRegionManager;
74 static const int64_t
Symbolic = std::numeric_limits<int64_t>::max();
100#define REGION(Id, Parent) Id ## Kind,
101#define REGION_RANGE(Id, First, Last) BEGIN_##Id = First, END_##Id = Last,
102#include "clang/StaticAnalyzer/Core/PathSensitive/Regions.def"
109 mutable std::optional<RegionOffset> cachedOffset;
118 virtual void Profile(llvm::FoldingSetNodeID&
ID)
const = 0;
128 LLVM_ATTRIBUTE_RETURNS_NONNULL
135 LLVM_ATTRIBUTE_RETURNS_NONNULL
179 template<
typename RegionTy>
const RegionTy*
getAs()
const;
180 template <
typename RegionTy>
181 LLVM_ATTRIBUTE_RETURNS_NONNULL
const RegionTy *
castAs()
const;
221 void Profile(llvm::FoldingSetNodeID &
ID)
const override;
225 return k >= BEGIN_MEMSPACES && k <= END_MEMSPACES;
241 return R->
getKind() == CodeSpaceRegionKind;
246 virtual void anchor();
256 return k >= BEGIN_GLOBAL_MEMSPACES && k <= END_GLOBAL_MEMSPACES;
276 void Profile(llvm::FoldingSetNodeID &
ID)
const override;
280 LLVM_ATTRIBUTE_RETURNS_NONNULL
284 return R->
getKind() == StaticGlobalSpaceRegionKind;
295 void anchor()
override;
306 return k >= BEGIN_NON_STATIC_GLOBAL_MEMSPACES &&
307 k <= END_NON_STATIC_GLOBAL_MEMSPACES;
323 return R->
getKind() == GlobalSystemSpaceRegionKind;
342 return R->
getKind() == GlobalImmutableSpaceRegionKind;
359 return R->
getKind() == GlobalInternalSpaceRegionKind;
373 return R->
getKind() == HeapSpaceRegionKind;
387 return R->
getKind() == UnknownSpaceRegionKind;
392 virtual void anchor();
404 LLVM_ATTRIBUTE_RETURNS_NONNULL
407 void Profile(llvm::FoldingSetNodeID &
ID)
const override;
411 return k >= BEGIN_STACK_MEMSPACES && k <= END_STACK_MEMSPACES;
425 return R->
getKind() == StackLocalsSpaceRegionKind;
440 return R->
getKind() == StackArgumentsSpaceRegionKind;
447 virtual void anchor();
458 LLVM_ATTRIBUTE_RETURNS_NONNULL
468 return R->
getKind() > END_MEMSPACES;
492 static void ProfileRegion(llvm::FoldingSetNodeID&
ID,
const Expr *Ex,
496 LLVM_ATTRIBUTE_RETURNS_NONNULL
501 void Profile(llvm::FoldingSetNodeID&
ID)
const override;
506 return R->
getKind() == AllocaRegionKind;
512 void anchor()
override;
530 return k >= BEGIN_TYPED_REGIONS && k <= END_TYPED_REGIONS;
536 void anchor()
override;
557 return T.getTypePtrOrNull() ?
T.getDesugaredType(Context) :
T;
562 return k >= BEGIN_TYPED_VALUE_REGIONS && k <= END_TYPED_VALUE_REGIONS;
567 void anchor()
override;
579 return k >= BEGIN_CODE_TEXT_REGIONS && k <= END_CODE_TEXT_REGIONS;
591 assert(isa<ObjCMethodDecl>(fd) || isa<FunctionDecl>(fd));
594 static void ProfileRegion(llvm::FoldingSetNodeID&
ID,
const NamedDecl *FD,
600 if (
const auto *
D = dyn_cast<FunctionDecl>(FD)) {
604 assert(isa<ObjCMethodDecl>(FD));
605 assert(
false &&
"Getting the type of ObjCMethod is not supported yet");
618 void Profile(llvm::FoldingSetNodeID&
ID)
const override;
621 return R->
getKind() == FunctionCodeRegionKind;
640 :
CodeTextRegion(sreg, BlockCodeRegionKind), BD(bd), AC(ac), locTy(lTy) {
646 static void ProfileRegion(llvm::FoldingSetNodeID&
ID,
const BlockDecl *BD,
655 LLVM_ATTRIBUTE_RETURNS_NONNULL
660 LLVM_ATTRIBUTE_RETURNS_NONNULL
665 void Profile(llvm::FoldingSetNodeID&
ID)
const override;
668 return R->
getKind() == BlockCodeRegionKind;
684 void *ReferencedVars =
nullptr;
685 void *OriginalVars =
nullptr;
689 :
TypedRegion(sreg, BlockDataRegionKind), BC(bc), LC(lc),
694 assert(isa<GlobalImmutableSpaceRegion>(sreg) ||
695 isa<StackLocalsSpaceRegion>(sreg) ||
696 isa<UnknownSpaceRegion>(sreg));
699 static void ProfileRegion(llvm::FoldingSetNodeID&,
const BlockCodeRegion *,
704 LLVM_ATTRIBUTE_RETURNS_NONNULL
707 LLVM_ATTRIBUTE_RETURNS_NONNULL
719 : R(r), OriginalR(originalR) {}
721 LLVM_ATTRIBUTE_RETURNS_NONNULL
723 return cast<VarRegion>(*R);
726 LLVM_ATTRIBUTE_RETURNS_NONNULL
728 return cast<VarRegion>(*OriginalR);
732 assert((R ==
nullptr) == (I.R ==
nullptr));
737 assert((R ==
nullptr) == (I.R ==
nullptr));
759 llvm::iterator_range<referenced_vars_iterator>
referenced_vars()
const;
763 void Profile(llvm::FoldingSetNodeID&
ID)
const override;
766 return R->
getKind() == BlockDataRegionKind;
770 void LazyInitializeReferencedVars();
771 std::pair<const VarRegion *, const VarRegion *>
772 getCaptureRegions(
const VarDecl *VD);
786 :
SubRegion(sreg, SymbolicRegionKind), sym(
s) {
789 assert(isa_and_nonnull<SymbolData>(
s));
790 assert(
s->getType()->isAnyPointerType() ||
791 s->getType()->isReferenceType() ||
792 s->getType()->isBlockPointerType());
793 assert(isa<UnknownSpaceRegion>(sreg) || isa<HeapSpaceRegion>(sreg) ||
794 isa<GlobalSystemSpaceRegion>(sreg));
815 void Profile(llvm::FoldingSetNodeID&
ID)
const override;
824 return R->
getKind() == SymbolicRegionKind;
839 static void ProfileRegion(llvm::FoldingSetNodeID &
ID,
844 LLVM_ATTRIBUTE_RETURNS_NONNULL
851 void Profile(llvm::FoldingSetNodeID&
ID)
const override {
858 return R->
getKind() == StringRegionKind;
874 static void ProfileRegion(llvm::FoldingSetNodeID &
ID,
879 LLVM_ATTRIBUTE_RETURNS_NONNULL
886 void Profile(llvm::FoldingSetNodeID&
ID)
const override {
893 return R->
getKind() == ObjCStringRegionKind;
909 assert(isa<GlobalInternalSpaceRegion>(sReg) ||
910 isa<StackLocalsSpaceRegion>(sReg));
913 static void ProfileRegion(llvm::FoldingSetNodeID&
ID,
922 void Profile(llvm::FoldingSetNodeID&
ID)
const override;
926 LLVM_ATTRIBUTE_RETURNS_NONNULL
930 return R->
getKind() == CompoundLiteralRegionKind;
946 return k >= BEGIN_DECL_REGIONS && k <= END_DECL_REGIONS;
960 assert(isa<GlobalsSpaceRegion>(sReg) || isa<StackSpaceRegion>(sReg) ||
961 isa<BlockDataRegion>(sReg) || isa<UnknownSpaceRegion>(sReg));
978 return k >= BEGIN_VAR_REGIONS && k <= END_VAR_REGIONS;
989 :
VarRegion(sReg, NonParamVarRegionKind), VD(vd) {
994 assert(isa<GlobalsSpaceRegion>(sReg) || isa<StackSpaceRegion>(sReg) ||
995 isa<BlockDataRegion>(sReg) || isa<UnknownSpaceRegion>(sReg));
999 static void ProfileRegion(llvm::FoldingSetNodeID &
ID,
const VarDecl *VD,
1003 void Profile(llvm::FoldingSetNodeID &
ID)
const override;
1005 LLVM_ATTRIBUTE_RETURNS_NONNULL
1020 return R->
getKind() == NonParamVarRegionKind;
1037 const Expr *OriginExpr;
1041 :
VarRegion(SReg, ParamVarRegionKind), OriginExpr(OE), Index(Idx) {
1042 assert(!cast<StackSpaceRegion>(SReg)->
getStackFrame()->inTopFrame());
1046 static void ProfileRegion(llvm::FoldingSetNodeID &
ID,
const Expr *OE,
1050 LLVM_ATTRIBUTE_RETURNS_NONNULL
1054 void Profile(llvm::FoldingSetNodeID&
ID)
const override;
1067 return R->
getKind() == ParamVarRegionKind;
1080 ThisPointerTy(thisPointerTy) {
1082 "Invalid region type!");
1085 static void ProfileRegion(llvm::FoldingSetNodeID &
ID,
1090 void Profile(llvm::FoldingSetNodeID &
ID)
const override;
1099 return R->
getKind() == CXXThisRegionKind;
1112 :
DeclRegion(sReg, FieldRegionKind), FD(fd) {
1116 static void ProfileRegion(llvm::FoldingSetNodeID &
ID,
const FieldDecl *FD,
1118 ID.AddInteger(
static_cast<unsigned>(FieldRegionKind));
1124 LLVM_ATTRIBUTE_RETURNS_NONNULL
1127 void Profile(llvm::FoldingSetNodeID &
ID)
const override;
1142 return R->
getKind() == FieldRegionKind;
1153 static void ProfileRegion(llvm::FoldingSetNodeID&
ID,
const ObjCIvarDecl *ivd,
1157 LLVM_ATTRIBUTE_RETURNS_NONNULL
1160 void Profile(llvm::FoldingSetNodeID&
ID)
const override;
1170 return R->
getKind() == ObjCIvarRegionKind;
1185 : Region(reg), Offset(offset) {}
1208 assert((!isa<nonloc::ConcreteInt>(Idx) ||
1210 "The index must be signed");
1212 "Invalid region type!");
1215 static void ProfileRegion(llvm::FoldingSetNodeID&
ID,
QualType elementType,
1230 void Profile(llvm::FoldingSetNodeID&
ID)
const override;
1233 return R->
getKind() == ElementRegionKind;
1246 assert(isa<StackLocalsSpaceRegion>(sReg));
1249 static void ProfileRegion(llvm::FoldingSetNodeID &
ID,
1253 LLVM_ATTRIBUTE_RETURNS_NONNULL
1256 LLVM_ATTRIBUTE_RETURNS_NONNULL
1263 void Profile(llvm::FoldingSetNodeID &
ID)
const override;
1266 return R->
getKind() == CXXTempObjectRegionKind;
1284 assert((isa<StackLocalsSpaceRegion, GlobalInternalSpaceRegion>(sReg)));
1287 static void ProfileRegion(llvm::FoldingSetNodeID &
ID,
Expr const *
E,
1291 LLVM_ATTRIBUTE_RETURNS_NONNULL
1293 LLVM_ATTRIBUTE_RETURNS_NONNULL
1302 void Profile(llvm::FoldingSetNodeID &
ID)
const override;
1305 return R->
getKind() == CXXLifetimeExtendedObjectRegionKind;
1314 llvm::PointerIntPair<const CXXRecordDecl *, 1, bool>
Data;
1322 static void ProfileRegion(llvm::FoldingSetNodeID &
ID,
const CXXRecordDecl *RD,
1326 LLVM_ATTRIBUTE_RETURNS_NONNULL
1334 void Profile(llvm::FoldingSetNodeID &
ID)
const override;
1341 return region->
getKind() == CXXBaseObjectRegionKind;
1362 "Should have unwrapped a base region instead!");
1365 static void ProfileRegion(llvm::FoldingSetNodeID &
ID,
const CXXRecordDecl *RD,
1369 LLVM_ATTRIBUTE_RETURNS_NONNULL
1376 void Profile(llvm::FoldingSetNodeID &
ID)
const override;
1383 return region->
getKind() == CXXDerivedObjectRegionKind;
1387template<
typename RegionTy>
1389 if (
const auto *RT = dyn_cast<RegionTy>(
this))
1395template <
typename RegionTy>
1397 return cast<RegionTy>(
this);
1406 llvm::BumpPtrAllocator& A;
1408 llvm::FoldingSet<MemRegion> Regions;
1414 llvm::DenseMap<const StackFrameContext *, StackLocalsSpaceRegion *>
1415 StackLocalsSpaceRegions;
1416 llvm::DenseMap<const StackFrameContext *, StackArgumentsSpaceRegion *>
1417 StackArgumentsSpaceRegions;
1418 llvm::DenseMap<const CodeTextRegion *, StaticGlobalSpaceRegion *>
1419 StaticsGlobalSpaceRegions;
1590 unsigned blockCount);
1593 template <
typename RegionTy,
typename SuperTy,
1595 RegionTy* getSubRegion(
const Arg1Ty arg1,
1596 const SuperTy* superRegion);
1598 template <
typename RegionTy,
typename SuperTy,
1599 typename Arg1Ty,
typename Arg2Ty>
1600 RegionTy* getSubRegion(
const Arg1Ty arg1,
const Arg2Ty arg2,
1601 const SuperTy* superRegion);
1603 template <
typename RegionTy,
typename SuperTy,
1604 typename Arg1Ty,
typename Arg2Ty,
typename Arg3Ty>
1605 RegionTy* getSubRegion(
const Arg1Ty arg1,
const Arg2Ty arg2,
1607 const SuperTy* superRegion);
1609 template <
typename REG>
1610 const REG* LazyAllocate(REG*& region);
1612 template <
typename REG,
typename ARG>
1613 const REG* LazyAllocate(REG*& region, ARG a);
1630 using StorageTypeForKinds =
unsigned char;
1632 llvm::DenseMap<const MemRegion *, StorageTypeForKinds> MRTraitsMap;
1633 llvm::DenseMap<SymbolRef, StorageTypeForKinds> SymTraitsMap;
1635 using const_region_iterator =
1636 llvm::DenseMap<const MemRegion *, StorageTypeForKinds>::const_iterator;
1637 using const_symbol_iterator =
1638 llvm::DenseMap<SymbolRef, StorageTypeForKinds>::const_iterator;
Defines the clang::ASTContext interface.
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.
Defines the clang::SourceLocation class and associated facilities.
C Language Family Type Representation.
__device__ __2f16 float __ockl_bool s
__device__ __2f16 float c
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
QualType getObjCObjectPointerType(QualType OIT) const
Return a ObjCObjectPointerType type for the given ObjCObjectType.
AnalysisDeclContext contains the context data for the function, method or block under analysis.
Represents a block literal declaration, which is like an unnamed FunctionDecl.
Represents a C++ struct/union/class.
const T * getTypePtr() const
Retrieve the underlying type pointer, which refers to a canonical type.
CharUnits - This is an opaque type for sizes expressed in character units.
static CharUnits Zero()
Zero - Construct a CharUnits quantity of zero.
CompoundLiteralExpr - [C99 6.5.2.5].
This represents one expression.
Represents a member of a struct/union/class.
It wraps the AnalysisDeclContext to represent both the call stack with the help of StackFrameContext ...
This represents a decl that may have a name.
ObjCIvarDecl - Represents an ObjC instance variable.
Represents a class type in Objective C.
ObjCStringLiteral, used for Objective-C string literals i.e.
Represents a parameter to a function.
PointerType - C99 6.7.5.1 - Pointer Declarators.
QualType getPointeeType() const
A (possibly-)qualified type.
QualType getDesugaredType(const ASTContext &Context) const
Return the specified type with any "sugar" removed from the type.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
A trivial tuple used to represent a source range.
It represents a stack frame of the call stack (based on CallEvent).
StringLiteral - This represents a string literal expression, e.g.
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
bool isBlockPointerType() const
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
const T * getAs() const
Member-template getAs<specific type>'.
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Represents a variable declaration or definition.
AllocaRegion - A region that represents an untyped blob of bytes created by a call to 'alloca'.
void dumpToStream(raw_ostream &os) const override
static bool classof(const MemRegion *R)
void Profile(llvm::FoldingSetNodeID &ID) const override
LLVM_ATTRIBUTE_RETURNS_NONNULL const Expr * getExpr() const
bool isBoundable() const override
BlockCodeRegion - A region that represents code texts of blocks (closures).
QualType getLocationType() const override
LLVM_ATTRIBUTE_RETURNS_NONNULL AnalysisDeclContext * getAnalysisDeclContext() const
void dumpToStream(raw_ostream &os) const override
LLVM_ATTRIBUTE_RETURNS_NONNULL const BlockDecl * getDecl() const
static bool classof(const MemRegion *R)
void Profile(llvm::FoldingSetNodeID &ID) const override
bool operator==(const referenced_vars_iterator &I) const
const referenced_vars_iterator & operator*() const
bool operator!=(const referenced_vars_iterator &I) const
LLVM_ATTRIBUTE_RETURNS_NONNULL const VarRegion * getCapturedRegion() const
LLVM_ATTRIBUTE_RETURNS_NONNULL const VarRegion * getOriginalRegion() const
referenced_vars_iterator & operator++()
referenced_vars_iterator(const MemRegion *const *r, const MemRegion *const *originalR)
BlockDataRegion - A region that represents a block instance.
const VarRegion * getOriginalRegion(const VarRegion *VR) const
Return the original region for a captured region, if one exists.
QualType getLocationType() const override
LLVM_ATTRIBUTE_RETURNS_NONNULL const BlockDecl * getDecl() const
static bool classof(const MemRegion *R)
referenced_vars_iterator referenced_vars_begin() const
LLVM_ATTRIBUTE_RETURNS_NONNULL const BlockCodeRegion * getCodeRegion() const
void Profile(llvm::FoldingSetNodeID &ID) const override
referenced_vars_iterator referenced_vars_end() const
void dumpToStream(raw_ostream &os) const override
llvm::iterator_range< referenced_vars_iterator > referenced_vars() const
void printPrettyAsExpr(raw_ostream &os) const override
Print the region as expression.
LLVM_ATTRIBUTE_RETURNS_NONNULL const CXXRecordDecl * getDecl() const
bool canPrintPrettyAsExpr() const override
Returns true if this region's textual representation can be used as part of a larger expression.
void Profile(llvm::FoldingSetNodeID &ID) const override
static bool classof(const MemRegion *region)
void dumpToStream(raw_ostream &os) const override
QualType getValueType() const override
void printPrettyAsExpr(raw_ostream &os) const override
Print the region as expression.
void Profile(llvm::FoldingSetNodeID &ID) const override
QualType getValueType() const override
void dumpToStream(raw_ostream &os) const override
static bool classof(const MemRegion *region)
bool canPrintPrettyAsExpr() const override
Returns true if this region's textual representation can be used as part of a larger expression.
LLVM_ATTRIBUTE_RETURNS_NONNULL const CXXRecordDecl * getDecl() const
static bool classof(const MemRegion *R)
LLVM_ATTRIBUTE_RETURNS_NONNULL const Expr * getExpr() const
void Profile(llvm::FoldingSetNodeID &ID) const override
LLVM_ATTRIBUTE_RETURNS_NONNULL const ValueDecl * getExtendingDecl() const
void dumpToStream(raw_ostream &os) const override
const StackFrameContext * getStackFrame() const
It might return null.
QualType getValueType() const override
QualType getValueType() const override
void Profile(llvm::FoldingSetNodeID &ID) const override
void dumpToStream(raw_ostream &os) const override
static bool classof(const MemRegion *R)
LLVM_ATTRIBUTE_RETURNS_NONNULL const Expr * getExpr() const
LLVM_ATTRIBUTE_RETURNS_NONNULL const StackFrameContext * getStackFrame() const
CXXThisRegion - Represents the region for the implicit 'this' parameter in a call to a C++ method.
QualType getValueType() const override
static bool classof(const MemRegion *R)
void Profile(llvm::FoldingSetNodeID &ID) const override
void dumpToStream(raw_ostream &os) const override
CodeSpaceRegion - The memory space that holds the executable code of functions and blocks.
void dumpToStream(raw_ostream &os) const override
static bool classof(const MemRegion *R)
CodeTextRegion(const MemSpaceRegion *sreg, Kind k)
static bool classof(const MemRegion *R)
bool isBoundable() const override
CompoundLiteralRegion - A memory region representing a compound literal.
LLVM_ATTRIBUTE_RETURNS_NONNULL const CompoundLiteralExpr * getLiteralExpr() const
QualType getValueType() const override
bool isBoundable() const override
void Profile(llvm::FoldingSetNodeID &ID) const override
void dumpToStream(raw_ostream &os) const override
static bool classof(const MemRegion *R)
DeclRegion(const MemRegion *sReg, Kind k)
virtual const ValueDecl * getDecl() const =0
static bool classof(const MemRegion *R)
ElementRegion is used to represent both array elements and casts.
static bool classof(const MemRegion *R)
QualType getValueType() const override
QualType getElementType() const
void Profile(llvm::FoldingSetNodeID &ID) const override
RegionRawOffset getAsArrayOffset() const
Compute the offset within the array. The array might also be a subobject.
void dumpToStream(raw_ostream &os) const override
void printPrettyAsExpr(raw_ostream &os) const override
Print the region as expression.
static bool classof(const MemRegion *R)
bool canPrintPretty() const override
Returns true if this region can be printed in a user-friendly way.
bool canPrintPrettyAsExpr() const override
Returns true if this region's textual representation can be used as part of a larger expression.
void dumpToStream(raw_ostream &os) const override
QualType getValueType() const override
void printPretty(raw_ostream &os) const override
Print the region for use in diagnostics.
void Profile(llvm::FoldingSetNodeID &ID) const override
LLVM_ATTRIBUTE_RETURNS_NONNULL const FieldDecl * getDecl() const override
FunctionCodeRegion - A region that represents code texts of function.
static bool classof(const MemRegion *R)
QualType getLocationType() const override
const NamedDecl * getDecl() const
void dumpToStream(raw_ostream &os) const override
void Profile(llvm::FoldingSetNodeID &ID) const override
The region containing globals which are considered not to be modified or point to data which could be...
void dumpToStream(raw_ostream &os) const override
static bool classof(const MemRegion *R)
The region containing globals which can be modified by calls to "internally" defined functions - (for...
void dumpToStream(raw_ostream &os) const override
static bool classof(const MemRegion *R)
The region containing globals which are defined in system/external headers and are considered modifia...
static bool classof(const MemRegion *R)
void dumpToStream(raw_ostream &os) const override
GlobalsSpaceRegion(MemRegionManager &mgr, Kind k)
static bool classof(const MemRegion *R)
void dumpToStream(raw_ostream &os) const override
static bool classof(const MemRegion *R)
const HeapSpaceRegion * getHeapRegion()
getHeapRegion - Retrieve the memory region associated with the generic "heap".
const StackArgumentsSpaceRegion * getStackArgumentsRegion(const StackFrameContext *STC)
getStackArgumentsRegion - Retrieve the memory region associated with function/method arguments of the...
const CXXThisRegion * getCXXThisRegion(QualType thisPointerTy, const LocationContext *LC)
getCXXThisRegion - Retrieve the [artificial] region associated with the parameter 'this'.
llvm::BumpPtrAllocator & getAllocator()
const BlockCodeRegion * getBlockCodeRegion(const BlockDecl *BD, CanQualType locTy, AnalysisDeclContext *AC)
const ASTContext & getContext() const
const UnknownSpaceRegion * getUnknownRegion()
getUnknownRegion - Retrieve the memory region associated with unknown memory space.
const CXXDerivedObjectRegion * getCXXDerivedObjectRegion(const CXXRecordDecl *BaseClass, const SubRegion *Super)
Create a CXXDerivedObjectRegion with the given derived class for region Super.
const CompoundLiteralRegion * getCompoundLiteralRegion(const CompoundLiteralExpr *CL, const LocationContext *LC)
getCompoundLiteralRegion - Retrieve the region associated with a given CompoundLiteral.
const FieldRegion * getFieldRegion(const FieldDecl *fd, const SubRegion *superRegion)
getFieldRegion - Retrieve or create the memory region associated with a specified FieldDecl.
const AllocaRegion * getAllocaRegion(const Expr *Ex, unsigned Cnt, const LocationContext *LC)
getAllocaRegion - Retrieve a region associated with a call to alloca().
const ElementRegion * getElementRegion(QualType elementType, NonLoc Idx, const SubRegion *superRegion, const ASTContext &Ctx)
getElementRegion - Retrieve the memory region associated with the associated element type,...
const VarRegion * getVarRegion(const VarDecl *VD, const LocationContext *LC)
getVarRegion - Retrieve or create the memory region associated with a specified VarDecl and LocationC...
const NonParamVarRegion * getNonParamVarRegion(const VarDecl *VD, const MemRegion *superR)
getVarRegion - Retrieve or create the memory region associated with a specified VarDecl and LocationC...
const FieldRegion * getFieldRegionWithSuper(const FieldRegion *FR, const SubRegion *superRegion)
const StackLocalsSpaceRegion * getStackLocalsRegion(const StackFrameContext *STC)
getStackLocalsRegion - Retrieve the memory region associated with the specified stack frame.
const ObjCIvarRegion * getObjCIvarRegion(const ObjCIvarDecl *ivd, const SubRegion *superRegion)
getObjCIvarRegion - Retrieve or create the memory region associated with a specified Objective-c inst...
const SymbolicRegion * getSymbolicHeapRegion(SymbolRef sym)
Return a unique symbolic region belonging to heap memory space.
const ObjCStringRegion * getObjCStringRegion(const ObjCStringLiteral *Str)
MemRegionManager(ASTContext &c, llvm::BumpPtrAllocator &a)
const StringRegion * getStringRegion(const StringLiteral *Str)
ASTContext & getContext()
DefinedOrUnknownSVal getStaticSize(const MemRegion *MR, SValBuilder &SVB) const
const ParamVarRegion * getParamVarRegion(const Expr *OriginExpr, unsigned Index, const LocationContext *LC)
getParamVarRegion - Retrieve or create the memory region associated with a specified CallExpr,...
const CodeSpaceRegion * getCodeRegion()
const CXXLifetimeExtendedObjectRegion * getCXXLifetimeExtendedObjectRegion(Expr const *Ex, ValueDecl const *VD, LocationContext const *LC)
Create a CXXLifetimeExtendedObjectRegion for temporaries which are lifetime-extended by local referen...
const CXXTempObjectRegion * getCXXTempObjectRegion(Expr const *Ex, LocationContext const *LC)
const GlobalsSpaceRegion * getGlobalsRegion(MemRegion::Kind K=MemRegion::GlobalInternalSpaceRegionKind, const CodeTextRegion *R=nullptr)
getGlobalsRegion - Retrieve the memory region associated with global variables.
const SymbolicRegion * getSymbolicRegion(SymbolRef Sym, const MemSpaceRegion *MemSpace=nullptr)
Retrieve or create a "symbolic" memory region.
const ElementRegion * getElementRegionWithSuper(const ElementRegion *ER, const SubRegion *superRegion)
const FunctionCodeRegion * getFunctionCodeRegion(const NamedDecl *FD)
const BlockDataRegion * getBlockDataRegion(const BlockCodeRegion *bc, const LocationContext *lc, unsigned blockCount)
getBlockDataRegion - Get the memory region associated with an instance of a block.
const CXXBaseObjectRegion * getCXXBaseObjectRegion(const CXXRecordDecl *BaseClass, const SubRegion *Super, bool IsVirtual)
Create a CXXBaseObjectRegion with the given base class for region Super.
const CXXLifetimeExtendedObjectRegion * getCXXStaticLifetimeExtendedObjectRegion(const Expr *Ex, ValueDecl const *VD)
Create a CXXLifetimeExtendedObjectRegion for temporaries which are lifetime-extended by static refere...
const CXXBaseObjectRegion * getCXXBaseObjectRegionWithSuper(const CXXBaseObjectRegion *baseReg, const SubRegion *superRegion)
Create a CXXBaseObjectRegion with the same CXXRecordDecl but a different super region.
MemRegion - The root abstract class for all memory regions.
virtual bool canPrintPrettyAsExpr() const
Returns true if this region's textual representation can be used as part of a larger expression.
LLVM_ATTRIBUTE_RETURNS_NONNULL const MemSpaceRegion * getMemorySpace() const
virtual void Profile(llvm::FoldingSetNodeID &ID) const =0
bool hasStackParametersStorage() const
LLVM_ATTRIBUTE_RETURNS_NONNULL const RegionTy * castAs() const
virtual bool isBoundable() const
StringRef getKindStr() const
RegionOffset getAsOffset() const
Compute the offset within the top level memory object.
bool hasStackStorage() const
LLVM_ATTRIBUTE_RETURNS_NONNULL const MemRegion * StripCasts(bool StripBaseAndDerivedCasts=true) const
ASTContext & getContext() const
std::string getDescriptiveName(bool UseQuotes=true) const
Get descriptive name for memory region.
virtual bool isSubRegionOf(const MemRegion *R) const
Check if the region is a subregion of the given region.
virtual void dumpToStream(raw_ostream &os) const
const SymbolicRegion * getSymbolicBase() const
If this is a symbolic region, returns the region.
LLVM_ATTRIBUTE_RETURNS_NONNULL const MemRegion * getBaseRegion() const
virtual void printPretty(raw_ostream &os) const
Print the region for use in diagnostics.
virtual void printPrettyAsExpr(raw_ostream &os) const
Print the region as expression.
bool hasStackNonParametersStorage() const
std::string getString() const
Get a string representation of a region for debug use.
const RegionTy * getAs() const
LLVM_ATTRIBUTE_RETURNS_NONNULL const MemRegion * getMostDerivedObjectRegion() const
Recursively retrieve the region of the most derived class instance of regions of C++ base class insta...
virtual MemRegionManager & getMemRegionManager() const =0
virtual bool canPrintPretty() const
Returns true if this region can be printed in a user-friendly way.
SourceRange sourceRange() const
Retrieve source range from memory region.
MemSpaceRegion - A memory region that represents a "memory space"; for example, the set of global var...
MemRegionManager & getMemRegionManager() const override
static bool classof(const MemRegion *R)
void Profile(llvm::FoldingSetNodeID &ID) const override
bool isBoundable() const override
MemSpaceRegion(MemRegionManager &mgr, Kind k)
QualType getValueType() const override
bool canPrintPrettyAsExpr() const override
Returns true if this region's textual representation can be used as part of a larger expression.
void Profile(llvm::FoldingSetNodeID &ID) const override
void printPrettyAsExpr(raw_ostream &os) const override
Print the region as expression.
void dumpToStream(raw_ostream &os) const override
LLVM_ATTRIBUTE_RETURNS_NONNULL const VarDecl * getDecl() const override
static bool classof(const MemRegion *R)
The region for all the non-static global variables.
NonStaticGlobalSpaceRegion(MemRegionManager &mgr, Kind k)
static bool classof(const MemRegion *R)
bool canPrintPrettyAsExpr() const override
Returns true if this region's textual representation can be used as part of a larger expression.
void Profile(llvm::FoldingSetNodeID &ID) const override
QualType getValueType() const override
static bool classof(const MemRegion *R)
void printPrettyAsExpr(raw_ostream &os) const override
Print the region as expression.
LLVM_ATTRIBUTE_RETURNS_NONNULL const ObjCIvarDecl * getDecl() const override
void dumpToStream(raw_ostream &os) const override
The region associated with an ObjCStringLiteral.
QualType getValueType() const override
bool isBoundable() const override
void dumpToStream(raw_ostream &os) const override
static bool classof(const MemRegion *R)
LLVM_ATTRIBUTE_RETURNS_NONNULL const ObjCStringLiteral * getObjCStringLiteral() const
void Profile(llvm::FoldingSetNodeID &ID) const override
ParamVarRegion - Represents a region for paremters.
bool canPrintPrettyAsExpr() const override
Returns true if this region's textual representation can be used as part of a larger expression.
LLVM_ATTRIBUTE_RETURNS_NONNULL const Expr * getOriginExpr() const
static bool classof(const MemRegion *R)
const ParmVarDecl * getDecl() const override
TODO: What does this return?
unsigned getIndex() const
void Profile(llvm::FoldingSetNodeID &ID) const override
QualType getValueType() const override
void dumpToStream(raw_ostream &os) const override
void printPrettyAsExpr(raw_ostream &os) const override
Print the region as expression.
Information about invalidation for a particular region/symbol.
InvalidationKinds
Describes different invalidation traits.
@ TK_PreserveContents
Tells that a region's contents is not changed.
@ TK_DoNotInvalidateSuperRegion
@ TK_EntireMemSpace
When applied to a MemSpaceRegion, indicates the entire memory space should be invalidated.
@ TK_SuppressEscape
Suppress pointer-escaping of a region.
bool hasTrait(SymbolRef Sym, InvalidationKinds IK) const
void setTrait(SymbolRef Sym, InvalidationKinds IK)
Represent a region's offset within the top level base region.
static const int64_t Symbolic
bool hasSymbolicOffset() const
const MemRegion * getRegion() const
It might return null.
RegionOffset(const MemRegion *r, int64_t off)
int64_t getOffset() const
CharUnits getOffset() const
void dumpToStream(raw_ostream &os) const
const MemRegion * getRegion() const
SVal - This represents a symbolic expression, which can be either an L-value or an R-value.
T castAs() const
Convert to the specified SVal type, asserting that this SVal is of the desired type.
static bool classof(const MemRegion *R)
void dumpToStream(raw_ostream &os) const override
static bool classof(const MemRegion *R)
void dumpToStream(raw_ostream &os) const override
StackSpaceRegion(MemRegionManager &mgr, Kind k, const StackFrameContext *sfc)
static bool classof(const MemRegion *R)
LLVM_ATTRIBUTE_RETURNS_NONNULL const StackFrameContext * getStackFrame() const
void Profile(llvm::FoldingSetNodeID &ID) const override
The region of the static variables within the current CodeTextRegion scope.
void Profile(llvm::FoldingSetNodeID &ID) const override
static bool classof(const MemRegion *R)
void dumpToStream(raw_ostream &os) const override
LLVM_ATTRIBUTE_RETURNS_NONNULL const CodeTextRegion * getCodeRegion() const
StringRegion - Region associated with a StringLiteral.
static bool classof(const MemRegion *R)
QualType getValueType() const override
void Profile(llvm::FoldingSetNodeID &ID) const override
bool isBoundable() const override
void dumpToStream(raw_ostream &os) const override
LLVM_ATTRIBUTE_RETURNS_NONNULL const StringLiteral * getStringLiteral() const
SubRegion - A region that subsets another larger region.
LLVM_ATTRIBUTE_RETURNS_NONNULL const MemRegion * getSuperRegion() const
static bool classof(const MemRegion *R)
bool isSubRegionOf(const MemRegion *R) const override
Check if the region is a subregion of the given region.
SubRegion(const MemRegion *sReg, Kind k)
const MemRegion * superRegion
MemRegionManager & getMemRegionManager() const override
virtual QualType getType() const =0
SymbolicRegion - A special, "non-concrete" region.
void dumpToStream(raw_ostream &os) const override
static bool classof(const MemRegion *R)
bool isBoundable() const override
void Profile(llvm::FoldingSetNodeID &ID) const override
SymbolRef getSymbol() const
It might return null.
static void ProfileRegion(llvm::FoldingSetNodeID &ID, SymbolRef sym, const MemRegion *superRegion)
QualType getPointeeStaticType() const
Gets the type of the wrapped symbol.
TypedRegion - An abstract class representing regions that are typed.
QualType getDesugaredLocationType(ASTContext &Context) const
bool isBoundable() const override
virtual QualType getLocationType() const =0
TypedRegion(const MemRegion *sReg, Kind k)
static bool classof(const MemRegion *R)
TypedValueRegion - An abstract class representing regions having a typed value.
virtual QualType getValueType() const =0
QualType getLocationType() const override
static bool classof(const MemRegion *R)
QualType getDesugaredValueType(ASTContext &Context) const
TypedValueRegion(const MemRegion *sReg, Kind k)
void dumpToStream(raw_ostream &os) const override
static bool classof(const MemRegion *R)
QualType getValueType() const override
const VarDecl * getDecl() const override=0
const StackFrameContext * getStackFrame() const
It might return null.
VarRegion(const MemRegion *sReg, Kind k)
static bool classof(const MemRegion *R)
Value representing integer constant.
const llvm::APSInt & getValue() const
@ Decl
The l-value was an access to a declared entity or something equivalently strong, like the address of ...
raw_ostream & operator<<(raw_ostream &Out, const CheckerBase &Checker)
Dump checker name to stream.
The JSON file list parser is used to communicate input to InstallAPI.
const FunctionProtoType * T