16 #ifndef LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_MEMREGION_H 17 #define LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_MEMREGION_H 32 #include "llvm/ADT/DenseMap.h" 33 #include "llvm/ADT/FoldingSet.h" 34 #include "llvm/ADT/Optional.h" 35 #include "llvm/ADT/PointerIntPair.h" 36 #include "llvm/Support/Allocator.h" 37 #include "llvm/Support/Casting.h" 46 class AnalysisDeclContext;
49 class LocationContext;
50 class StackFrameContext;
56 class MemRegionManager;
98 #define REGION(Id, Parent) Id ## Kind, 99 #define REGION_RANGE(Id, First, Last) BEGIN_##Id = First, END_##Id = Last, 100 #include "clang/StaticAnalyzer/Core/PathSensitive/Regions.def" 105 mutable Optional<RegionOffset> cachedOffset;
114 virtual void Profile(llvm::FoldingSetNodeID&
ID)
const = 0;
124 const MemRegion *getMostDerivedObjectRegion()
const;
128 virtual bool isSubRegionOf(
const MemRegion *R)
const;
130 const MemRegion *StripCasts(
bool StripBaseAndDerivedCasts =
true)
const;
136 bool hasGlobalsOrParametersStorage()
const;
138 bool hasStackStorage()
const;
140 bool hasStackNonParametersStorage()
const;
142 bool hasStackParametersStorage()
const;
148 std::string getString()
const;
150 virtual void dumpToStream(raw_ostream &os)
const;
155 virtual bool canPrintPretty()
const;
158 virtual void printPretty(raw_ostream &os)
const;
162 virtual bool canPrintPrettyAsExpr()
const;
168 virtual void printPrettyAsExpr(raw_ostream &os)
const;
172 template<
typename RegionTy>
const RegionTy* getAs()
const;
184 std::string getDescriptiveName(
bool UseQuotes =
true)
const;
213 void Profile(llvm::FoldingSetNodeID &
ID)
const override;
217 return k >= BEGIN_MEMSPACES && k <= END_MEMSPACES;
230 void dumpToStream(raw_ostream &os)
const override;
233 return R->
getKind() == CodeSpaceRegionKind;
238 virtual void anchor();
248 return k >= BEGIN_GLOBAL_MEMSPACES && k <= END_GLOBAL_MEMSPACES;
268 void Profile(llvm::FoldingSetNodeID &
ID)
const override;
270 void dumpToStream(raw_ostream &os)
const override;
275 return R->
getKind() == StaticGlobalSpaceRegionKind;
286 void anchor()
override;
297 return k >= BEGIN_NON_STATIC_GLOBAL_MEMSPACES &&
298 k <= END_NON_STATIC_GLOBAL_MEMSPACES;
311 void dumpToStream(raw_ostream &os)
const override;
314 return R->
getKind() == GlobalSystemSpaceRegionKind;
330 void dumpToStream(raw_ostream &os)
const override;
333 return R->
getKind() == GlobalImmutableSpaceRegionKind;
347 void dumpToStream(raw_ostream &os)
const override;
350 return R->
getKind() == GlobalInternalSpaceRegionKind;
361 void dumpToStream(raw_ostream &os)
const override;
364 return R->
getKind() == HeapSpaceRegionKind;
375 void dumpToStream(raw_ostream &os)
const override;
378 return R->
getKind() == UnknownSpaceRegionKind;
383 virtual void anchor();
397 void Profile(llvm::FoldingSetNodeID &
ID)
const override;
401 return k >= BEGIN_STACK_MEMSPACES && k <= END_STACK_MEMSPACES;
412 void dumpToStream(raw_ostream &os)
const override;
415 return R->
getKind() == StackLocalsSpaceRegionKind;
427 void dumpToStream(raw_ostream &os)
const override;
430 return R->
getKind() == StackArgumentsSpaceRegionKind;
437 virtual void anchor();
459 bool isSubRegionOf(
const MemRegion* R)
const override;
462 return R->
getKind() > END_MEMSPACES;
482 :
SubRegion(superRegion, AllocaRegionKind), Cnt(cnt), Ex(ex) {
486 static void ProfileRegion(llvm::FoldingSetNodeID&
ID,
const Expr *Ex,
487 unsigned Cnt,
const MemRegion *superRegion);
496 void Profile(llvm::FoldingSetNodeID&
ID)
const override;
498 void dumpToStream(raw_ostream &os)
const override;
501 return R->
getKind() == AllocaRegionKind;
507 void anchor()
override;
515 virtual QualType getLocationType()
const = 0;
525 return k >= BEGIN_TYPED_REGIONS && k <= END_TYPED_REGIONS;
531 void anchor()
override;
539 virtual QualType getValueType()
const = 0;
559 return k >= BEGIN_TYPED_VALUE_REGIONS && k <= END_TYPED_VALUE_REGIONS;
564 void anchor()
override;
576 return k >= BEGIN_CODE_TEXT_REGIONS && k <= END_CODE_TEXT_REGIONS;
588 assert(isa<ObjCMethodDecl>(fd) || isa<FunctionDecl>(fd));
591 static void ProfileRegion(llvm::FoldingSetNodeID&
ID,
const NamedDecl *FD,
597 if (
const auto *D = dyn_cast<FunctionDecl>(FD)) {
601 assert(isa<ObjCMethodDecl>(FD));
602 assert(
false &&
"Getting the type of ObjCMethod is not supported yet");
613 void dumpToStream(raw_ostream &os)
const override;
615 void Profile(llvm::FoldingSetNodeID&
ID)
const override;
618 return R->
getKind() == FunctionCodeRegionKind;
637 :
CodeTextRegion(sreg, BlockCodeRegionKind), BD(bd), AC(ac), locTy(lTy) {
643 static void ProfileRegion(llvm::FoldingSetNodeID&
ID,
const BlockDecl *BD,
658 void dumpToStream(raw_ostream &os)
const override;
660 void Profile(llvm::FoldingSetNodeID&
ID)
const override;
663 return R->
getKind() == BlockCodeRegionKind;
679 void *ReferencedVars =
nullptr;
680 void *OriginalVars =
nullptr;
684 :
TypedRegion(sreg, BlockDataRegionKind), BC(bc), LC(lc),
688 assert(isa<GlobalImmutableSpaceRegion>(sreg) ||
689 isa<StackLocalsSpaceRegion>(sreg) ||
690 isa<UnknownSpaceRegion>(sreg));
693 static void ProfileRegion(llvm::FoldingSetNodeID&,
const BlockCodeRegion *,
711 : R(r), OriginalR(originalR) {}
714 return cast<VarRegion>(*R);
718 return cast<VarRegion>(*OriginalR);
722 assert((R ==
nullptr) == (I.R ==
nullptr));
727 assert((R ==
nullptr) == (I.R ==
nullptr));
745 void dumpToStream(raw_ostream &os)
const override;
747 void Profile(llvm::FoldingSetNodeID&
ID)
const override;
750 return R->
getKind() == BlockDataRegionKind;
754 void LazyInitializeReferencedVars();
755 std::pair<const VarRegion *, const VarRegion *>
756 getCaptureRegions(
const VarDecl *VD);
770 :
SubRegion(sreg, SymbolicRegionKind), sym(s) {
773 assert(s && isa<SymbolData>(s));
780 assert(isa<UnknownSpaceRegion>(sreg) || isa<HeapSpaceRegion>(sreg));
790 void Profile(llvm::FoldingSetNodeID&
ID)
const override;
792 static void ProfileRegion(llvm::FoldingSetNodeID& ID,
796 void dumpToStream(raw_ostream &os)
const override;
799 return R->
getKind() == SymbolicRegionKind;
814 static void ProfileRegion(llvm::FoldingSetNodeID &
ID,
827 void Profile(llvm::FoldingSetNodeID&
ID)
const override {
828 ProfileRegion(ID, Str, superRegion);
831 void dumpToStream(raw_ostream &os)
const override;
834 return R->
getKind() == StringRegionKind;
850 static void ProfileRegion(llvm::FoldingSetNodeID &
ID,
861 void Profile(llvm::FoldingSetNodeID&
ID)
const override {
862 ProfileRegion(ID, Str, superRegion);
865 void dumpToStream(raw_ostream &os)
const override;
868 return R->
getKind() == ObjCStringRegionKind;
884 assert(isa<GlobalInternalSpaceRegion>(sReg) ||
885 isa<StackLocalsSpaceRegion>(sReg));
888 static void ProfileRegion(llvm::FoldingSetNodeID&
ID,
897 void Profile(llvm::FoldingSetNodeID&
ID)
const override;
899 void dumpToStream(raw_ostream &os)
const override;
904 return R->
getKind() == CompoundLiteralRegionKind;
918 static void ProfileRegion(llvm::FoldingSetNodeID&
ID,
const Decl *D,
923 void Profile(llvm::FoldingSetNodeID& ID)
const override;
927 return k >= BEGIN_DECL_REGIONS && k <= END_DECL_REGIONS;
941 assert(isa<GlobalsSpaceRegion>(sReg) || isa<StackSpaceRegion>(sReg) ||
942 isa<BlockDataRegion>(sReg) || isa<UnknownSpaceRegion>(sReg));
945 static void ProfileRegion(llvm::FoldingSetNodeID&
ID,
const VarDecl *VD,
951 void Profile(llvm::FoldingSetNodeID&
ID)
const override;
959 return getDecl()->getType();
962 void dumpToStream(raw_ostream &os)
const override;
964 bool canPrintPrettyAsExpr()
const override;
966 void printPrettyAsExpr(raw_ostream &os)
const override;
969 return R->
getKind() == VarRegionKind;
982 ThisPointerTy(thisPointerTy) {
983 assert(ThisPointerTy->getPointeeType()->getAsCXXRecordDecl() &&
984 "Invalid region type!");
987 static void ProfileRegion(llvm::FoldingSetNodeID &
ID,
992 void Profile(llvm::FoldingSetNodeID &
ID)
const override;
998 void dumpToStream(raw_ostream &os)
const override;
1001 return R->
getKind() == CXXThisRegionKind;
1014 static void ProfileRegion(llvm::FoldingSetNodeID&
ID,
const FieldDecl *FD,
1024 return getDecl()->getType();
1029 void dumpToStream(raw_ostream &os)
const override;
1031 bool canPrintPretty()
const override;
1032 void printPretty(raw_ostream &os)
const override;
1033 bool canPrintPrettyAsExpr()
const override;
1034 void printPrettyAsExpr(raw_ostream &os)
const override;
1037 return R->
getKind() == FieldRegionKind;
1046 static void ProfileRegion(llvm::FoldingSetNodeID&
ID,
const ObjCIvarDecl *ivd,
1051 QualType getValueType()
const override;
1053 bool canPrintPrettyAsExpr()
const override;
1054 void printPrettyAsExpr(raw_ostream &os)
const override;
1056 void dumpToStream(raw_ostream &os)
const override;
1059 return R->
getKind() == ObjCIvarRegionKind;
1074 : Region(reg), Offset(offset) {}
1081 void dumpToStream(raw_ostream &os)
const;
1097 "The index must be signed");
1099 "Invalid region type!");
1102 static void ProfileRegion(llvm::FoldingSetNodeID&
ID,
QualType elementType,
1115 void dumpToStream(raw_ostream &os)
const override;
1117 void Profile(llvm::FoldingSetNodeID&
ID)
const override;
1120 return R->
getKind() == ElementRegionKind;
1133 assert(isa<StackLocalsSpaceRegion>(sReg) ||
1134 isa<GlobalInternalSpaceRegion>(sReg));
1137 static void ProfileRegion(llvm::FoldingSetNodeID &
ID,
1145 void dumpToStream(raw_ostream &os)
const override;
1147 void Profile(llvm::FoldingSetNodeID &
ID)
const override;
1150 return R->
getKind() == CXXTempObjectRegionKind;
1159 llvm::PointerIntPair<const CXXRecordDecl *, 1, bool> Data;
1167 static void ProfileRegion(llvm::FoldingSetNodeID &
ID,
const CXXRecordDecl *RD,
1174 QualType getValueType()
const override;
1176 void dumpToStream(raw_ostream &os)
const override;
1178 void Profile(llvm::FoldingSetNodeID &
ID)
const override;
1180 bool canPrintPrettyAsExpr()
const override;
1182 void printPrettyAsExpr(raw_ostream &os)
const override;
1185 return region->
getKind() == CXXBaseObjectRegionKind;
1206 "Should have unwrapped a base region instead!");
1209 static void ProfileRegion(llvm::FoldingSetNodeID &
ID,
const CXXRecordDecl *RD,
1215 QualType getValueType()
const override;
1217 void dumpToStream(raw_ostream &os)
const override;
1219 void Profile(llvm::FoldingSetNodeID &
ID)
const override;
1221 bool canPrintPrettyAsExpr()
const override;
1223 void printPrettyAsExpr(raw_ostream &os)
const override;
1226 return region->
getKind() == CXXDerivedObjectRegionKind;
1230 template<
typename RegionTy>
1232 if (
const auto *RT = dyn_cast<RegionTy>(
this))
1244 llvm::BumpPtrAllocator& A;
1245 llvm::FoldingSet<MemRegion> Regions;
1251 llvm::DenseMap<const StackFrameContext *, StackLocalsSpaceRegion *>
1252 StackLocalsSpaceRegions;
1253 llvm::DenseMap<const StackFrameContext *, StackArgumentsSpaceRegion *>
1254 StackArgumentsSpaceRegions;
1255 llvm::DenseMap<const CodeTextRegion *, StaticGlobalSpaceRegion *>
1256 StaticsGlobalSpaceRegions;
1350 return getFieldRegion(FR->
getDecl(), superRegion);
1376 return getCXXBaseObjectRegion(baseReg->
getDecl(), superRegion,
1399 unsigned blockCount);
1407 template <
typename RegionTy,
typename SuperTy,
1409 RegionTy* getSubRegion(
const Arg1Ty arg1,
1410 const SuperTy* superRegion);
1412 template <
typename RegionTy,
typename SuperTy,
1413 typename Arg1Ty,
typename Arg2Ty>
1414 RegionTy* getSubRegion(
const Arg1Ty arg1,
const Arg2Ty arg2,
1415 const SuperTy* superRegion);
1417 template <
typename RegionTy,
typename SuperTy,
1418 typename Arg1Ty,
typename Arg2Ty,
typename Arg3Ty>
1419 RegionTy* getSubRegion(
const Arg1Ty arg1,
const Arg2Ty arg2,
1421 const SuperTy* superRegion);
1423 template <
typename REG>
1424 const REG* LazyAllocate(REG*& region);
1426 template <
typename REG,
typename ARG>
1427 const REG* LazyAllocate(REG*& region, ARG a);
1435 return getMemRegionManager()->getContext();
1444 using StorageTypeForKinds =
unsigned char;
1446 llvm::DenseMap<const MemRegion *, StorageTypeForKinds> MRTraitsMap;
1447 llvm::DenseMap<SymbolRef, StorageTypeForKinds> SymTraitsMap;
1449 using const_region_iterator =
1450 llvm::DenseMap<const MemRegion *, StorageTypeForKinds>::const_iterator;
1451 using const_symbol_iterator =
1452 llvm::DenseMap<SymbolRef, StorageTypeForKinds>::const_iterator;
1458 TK_PreserveContents = 0x1,
1461 TK_SuppressEscape = 0x2,
1464 TK_DoNotInvalidateSuperRegion = 0x4,
1468 TK_EntireMemSpace = 0x8
1492 #endif // LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_MEMREGION_H RegionOffset(const MemRegion *r, int64_t off)
const ElementRegion * getElementRegionWithSuper(const ElementRegion *ER, const SubRegion *superRegion)
bool isBoundable() const override
Defines the clang::ASTContext interface.
CodeTextRegion(const MemSpaceRegion *sreg, Kind k)
TypedValueRegion - An abstract class representing regions having a typed value.
static bool classof(const MemRegion *R)
CompoundLiteralRegion - A memory region representing a compound literal.
QualType getValueType() const override
PointerType - C99 6.7.5.1 - Pointer Declarators.
A (possibly-)qualified type.
MemRegion - The root abstract class for all memory regions.
bool isBlockPointerType() const
const CXXRecordDecl * getDecl() const
QualType getDesugaredType(const ASTContext &Context) const
Return the specified type with any "sugar" removed from the type.
SubRegion(const MemRegion *sReg, Kind k)
Information about invalidation for a particular region/symbol.
MemRegionManager * getMemRegionManager() const override
C Language Family Type Representation.
virtual void dumpToStream(raw_ostream &os) const
BlockCodeRegion - A region that represents code texts of blocks (closures).
Decl - This represents one declaration (or definition), e.g.
static bool classof(const MemRegion *R)
static bool classof(const MemRegion *R)
const ValueDecl * getDecl() const
QualType getLocationType() const override
const NamedDecl * getDecl() const
const MemRegion * getRegion() const
The l-value was an access to a declared entity or something equivalently strong, like the address of ...
MemSpaceRegion - A memory region that represents a "memory space"; for example, the set of global var...
static bool classof(const MemRegion *region)
const ObjCStringLiteral * getObjCStringLiteral() const
static bool classof(const MemRegion *R)
Value representing integer constant.
const CXXBaseObjectRegion * getCXXBaseObjectRegionWithSuper(const CXXBaseObjectRegion *baseReg, const SubRegion *superRegion)
Create a CXXBaseObjectRegion with the same CXXRecordDecl but a different super region.
AllocaRegion - A region that represents an untyped blob of bytes created by a call to 'alloca'...
static bool classof(const MemRegion *R)
bool operator==(const referenced_vars_iterator &I) const
CodeSpaceRegion - The memory space that holds the executable code of functions and blocks...
CharUnits getOffset() const
ASTContext & getContext()
Represents a variable declaration or definition.
CompoundLiteralExpr - [C99 6.5.2.5].
const T * getAs() const
Member-template getAs<specific type>'.
DeclRegion(const ValueDecl *d, const MemRegion *sReg, Kind k)
QualType getElementType() const
AnalysisDeclContext * getAnalysisDeclContext() const
CXXThisRegion - Represents the region for the implicit 'this' parameter in a call to a C++ method...
const MemRegion * getSuperRegion() const
const SymbolicRegion * getSymbolicBase() const
If this is a symbolic region, returns the region.
GlobalsSpaceRegion(MemRegionManager *mgr, Kind k)
The region containing globals which can be modified by calls to "internally" defined functions - (for...
The region associated with an ObjCStringLiteral.
Represents a class type in Objective C.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
const VarRegion * getOriginalRegion() const
const FieldDecl * getDecl() const
Represents a member of a struct/union/class.
ASTContext & getContext() const
AnalysisDeclContext contains the context data for the function or method under analysis.
QualType getLocationType() const override
bool isReferenceType() const
static CharUnits Zero()
Zero - Construct a CharUnits quantity of zero.
virtual DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const
getExtent - Returns the size of the region in bytes.
QualType getValueType() const override
bool isBoundable() const override
The region containing globals which are considered not to be modified or point to data which could be...
static bool classof(const MemRegion *R)
BlockDataRegion - A region that represents a block instance.
static bool classof(const MemRegion *R)
static bool classof(const MemRegion *region)
CharUnits - This is an opaque type for sizes expressed in character units.
static void dump(llvm::raw_ostream &OS, StringRef FunctionName, ArrayRef< CounterExpression > Expressions, ArrayRef< CounterMappingRegion > Regions)
const CXXRecordDecl * getDecl() const
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified...
referenced_vars_iterator(const MemRegion *const *r, const MemRegion *const *originalR)
static bool classof(const MemRegion *R)
static bool classof(const MemRegion *R)
ObjCStringLiteral, used for Objective-C string literals i.e.
static bool classof(const MemRegion *R)
const StringLiteral * getStringLiteral() const
QualType getValueType() const override
Represent a region's offset within the top level base region.
const T * getTypePtr() const
Retrieve the underlying type pointer, which refers to a canonical type.
static void ProfileRegion(llvm::FoldingSetNodeID &ID, const Decl *D, const MemRegion *superRegion, Kind k)
virtual QualType getType() const =0
static bool classof(const MemRegion *R)
QualType getValueType() const override
const VarRegion * getCapturedRegion() const
bool operator!=(const referenced_vars_iterator &I) const
static bool classof(const MemRegion *R)
const RegionTy * getAs() const
SymbolicRegion - A special, "non-concrete" region.
Pepresents a block literal declaration, which is like an unnamed FunctionDecl.
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
This represents one expression.
TypedValueRegion(const MemRegion *sReg, Kind k)
static const int64_t Symbolic
llvm::BumpPtrAllocator & getAllocator()
static bool classof(const MemRegion *R)
QualType getDesugaredValueType(ASTContext &Context) const
const BlockCodeRegion * getCodeRegion() const
static bool classof(const MemRegion *R)
static bool classof(const MemRegion *R)
static bool classof(const MemRegion *R)
bool isNull() const
Return true if this QualType doesn't point to a type yet.
static bool classof(const MemRegion *R)
TypedRegion(const MemRegion *sReg, Kind k)
const StackFrameContext * getStackFrame() const
The region of the static variables within the current CodeTextRegion scope.
Optional< T > getAs() const
Convert to the specified SVal type, returning None if this SVal is not of the desired type...
const VarDecl * getDecl() const
virtual bool isBoundable() const
The region for all the non-static global variables.
static bool classof(const MemRegion *R)
const BlockDecl * getDecl() const
QualType getValueType() const override
static bool classof(const MemRegion *R)
FunctionCodeRegion - A region that represents code texts of function.
SymbolRef getSymbol() const
const CompoundLiteralExpr * getLiteralExpr() const
bool isBoundable() const override
static bool classof(const MemRegion *R)
SVal - This represents a symbolic expression, which can be either an L-value or an R-value...
bool isBoundable() const override
bool isAnyPointerType() const
QualType getLocationType() const override
static bool classof(const MemRegion *R)
static bool classof(const MemRegion *R)
bool isBoundable() const override
static bool classof(const MemRegion *R)
Dataflow Directional Tag Classes.
raw_ostream & operator<<(raw_ostream &Out, const CheckerBase &Checker)
Dump checker name to stream.
QualType getValueType() const override
InvalidationKinds
Describes different invalidation traits.
const MemRegion * getRegion() const
bool isBoundable() const override
QualType getLocationType() const override
static bool classof(const MemRegion *R)
static bool classof(const MemRegion *R)
const Expr * getExpr() const
static bool classof(const MemRegion *R)
static bool classof(const OMPClause *T)
bool isBoundable() const override
T castAs() const
Convert to the specified SVal type, asserting that this SVal is of the desired type.
SubRegion - A region that subsets another larger region.
The region containing globals which are defined in system/external headers and are considered modifia...
StackSpaceRegion(MemRegionManager *mgr, Kind k, const StackFrameContext *sfc)
int64_t getOffset() const
referenced_vars_iterator & operator++()
const Type * getTypePtrOrNull() const
const CodeTextRegion * getCodeRegion() const
const BlockDecl * getDecl() const
MemSpaceRegion(MemRegionManager *mgr, Kind k)
void Profile(llvm::FoldingSetNodeID &ID) const override
const Expr * getExpr() const
Defines the clang::SourceLocation class and associated facilities.
Represents a C++ struct/union/class.
static bool classof(const MemRegion *R)
void Profile(llvm::FoldingSetNodeID &ID) const override
ObjCIvarDecl - Represents an ObjC instance variable.
QualType getValueType() const override
static bool classof(const MemRegion *R)
static bool classof(const MemRegion *R)
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
unsigned kind
All of the diagnostics that can be emitted by the frontend.
StringLiteral - This represents a string literal expression, e.g.
QualType getDesugaredLocationType(ASTContext &Context) const
StringRegion - Region associated with a StringLiteral.
const FieldRegion * getFieldRegionWithSuper(const FieldRegion *FR, const SubRegion *superRegion)
ElementRegion is used to represent both array elements and casts.
__DEVICE__ int max(int __a, int __b)
QualType getValueType() const override
MemRegionManager(ASTContext &c, llvm::BumpPtrAllocator &a)
const llvm::APSInt & getValue() const
A trivial tuple used to represent a source range.
This represents a decl that may have a name.
QualType getObjCObjectPointerType(QualType OIT) const
Return a ObjCObjectPointerType type for the given ObjCObjectType.
static bool classof(const MemRegion *R)
const MemRegion * superRegion
static bool classof(const MemRegion *R)
bool isBoundable() const override
bool hasSymbolicOffset() const
NonStaticGlobalSpaceRegion(MemRegionManager *mgr, Kind k)
TypedRegion - An abstract class representing regions that are typed.
static bool classof(const MemRegion *R)