35#include "llvm/ADT/APInt.h"
36#include "llvm/ADT/FoldingSet.h"
37#include "llvm/ADT/PointerUnion.h"
38#include "llvm/ADT/SmallString.h"
39#include "llvm/ADT/StringRef.h"
40#include "llvm/ADT/Twine.h"
41#include "llvm/ADT/iterator_range.h"
42#include "llvm/Support/Allocator.h"
43#include "llvm/Support/Casting.h"
44#include "llvm/Support/CheckedArithmetic.h"
45#include "llvm/Support/Compiler.h"
46#include "llvm/Support/Debug.h"
47#include "llvm/Support/ErrorHandling.h"
48#include "llvm/Support/raw_ostream.h"
60#define DEBUG_TYPE "MemRegion"
69[[maybe_unused]]
static bool isAReferenceTypedValueRegion(
const MemRegion *R) {
70 const auto *TyReg = llvm::dyn_cast<TypedValueRegion>(R);
71 return TyReg && TyReg->getValueType()->isReferenceType();
74template <
typename RegionTy,
typename SuperTy,
typename Arg1Ty>
75RegionTy* MemRegionManager::getSubRegion(
const Arg1Ty arg1,
76 const SuperTy *superRegion) {
77 llvm::FoldingSetNodeID
ID;
78 RegionTy::ProfileRegion(ID, arg1, superRegion);
80 auto *R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID, InsertPos));
83 R =
new (A) RegionTy(arg1, superRegion);
84 Regions.InsertNode(R, InsertPos);
85 assert(!isAReferenceTypedValueRegion(superRegion));
91template <
typename RegionTy,
typename SuperTy,
typename Arg1Ty,
typename Arg2Ty>
92RegionTy* MemRegionManager::getSubRegion(
const Arg1Ty arg1,
const Arg2Ty arg2,
93 const SuperTy *superRegion) {
94 llvm::FoldingSetNodeID
ID;
95 RegionTy::ProfileRegion(ID, arg1, arg2, superRegion);
97 auto *R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID, InsertPos));
100 R =
new (A) RegionTy(arg1, arg2, superRegion);
101 Regions.InsertNode(R, InsertPos);
102 assert(!isAReferenceTypedValueRegion(superRegion));
108template <
typename RegionTy,
typename SuperTy,
109 typename Arg1Ty,
typename Arg2Ty,
typename Arg3Ty>
110RegionTy* MemRegionManager::getSubRegion(
const Arg1Ty arg1,
const Arg2Ty arg2,
112 const SuperTy *superRegion) {
113 llvm::FoldingSetNodeID
ID;
114 RegionTy::ProfileRegion(ID, arg1, arg2, arg3, superRegion);
116 auto *R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID, InsertPos));
119 R =
new (A) RegionTy(arg1, arg2, arg3, superRegion);
120 Regions.InsertNode(R, InsertPos);
121 assert(!isAReferenceTypedValueRegion(superRegion));
146 if (
const auto *sr = dyn_cast<SubRegion>(r))
147 r = sr->getSuperRegion();
150 }
while (r !=
nullptr);
158 if (
const auto *sr = dyn_cast<SubRegion>(
superRegion)) {
168 return SSR ? SSR->getStackFrame() :
nullptr;
174 return SSR ? SSR->getStackFrame() :
nullptr;
179 "A temporary object can only be allocated on the stack");
184 :
DeclRegion(sReg, ObjCIvarRegionKind), IVD(ivd) {
204 "`ParamVarRegion` support functions without `Decl` not implemented"
212 if (
const auto *FD = dyn_cast<FunctionDecl>(
D)) {
213 assert(Index < FD->param_size());
214 return FD->parameters()[Index];
215 }
else if (
const auto *BD = dyn_cast<BlockDecl>(
D)) {
216 assert(Index < BD->param_size());
217 return BD->parameters()[Index];
218 }
else if (
const auto *MD = dyn_cast<ObjCMethodDecl>(
D)) {
219 assert(Index < MD->param_size());
220 return MD->parameters()[Index];
221 }
else if (
const auto *CD = dyn_cast<CXXConstructorDecl>(
D)) {
222 assert(Index < CD->param_size());
223 return CD->parameters()[Index];
225 llvm_unreachable(
"Unexpected Decl kind!");
234 ID.AddInteger(
static_cast<unsigned>(
getKind()));
238 ID.AddInteger(
static_cast<unsigned>(
getKind()));
243 ID.AddInteger(
static_cast<unsigned>(
getKind()));
247void StringRegion::ProfileRegion(llvm::FoldingSetNodeID &ID,
250 ID.AddInteger(
static_cast<unsigned>(StringRegionKind));
255void ObjCStringRegion::ProfileRegion(llvm::FoldingSetNodeID &ID,
258 ID.AddInteger(
static_cast<unsigned>(ObjCStringRegionKind));
263void AllocaRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
264 const Expr *Ex,
unsigned cnt,
266 ID.AddInteger(
static_cast<unsigned>(AllocaRegionKind));
280void CompoundLiteralRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
283 ID.AddInteger(
static_cast<unsigned>(CompoundLiteralRegionKind));
288void CXXThisRegion::ProfileRegion(llvm::FoldingSetNodeID &ID,
291 ID.AddInteger(
static_cast<unsigned>(CXXThisRegionKind));
293 ID.AddPointer(sRegion);
297 CXXThisRegion::ProfileRegion(ID, ThisPointerTy,
superRegion);
304void ObjCIvarRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
307 ID.AddInteger(
static_cast<unsigned>(ObjCIvarRegionKind));
316void NonParamVarRegion::ProfileRegion(llvm::FoldingSetNodeID &ID,
319 ID.AddInteger(
static_cast<unsigned>(NonParamVarRegionKind));
328void ParamVarRegion::ProfileRegion(llvm::FoldingSetNodeID &ID,
const Expr *OE,
330 ID.AddInteger(
static_cast<unsigned>(ParamVarRegionKind));
342 ID.AddInteger(
static_cast<unsigned>(MemRegion::SymbolicRegionKind));
351void ElementRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
354 ID.AddInteger(MemRegion::ElementRegionKind);
361 ElementRegion::ProfileRegion(ID, ElementType, Index,
superRegion);
364void FunctionCodeRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
367 ID.AddInteger(MemRegion::FunctionCodeRegionKind);
372 FunctionCodeRegion::ProfileRegion(ID, FD,
superRegion);
375void BlockCodeRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
379 ID.AddInteger(MemRegion::BlockCodeRegionKind);
384 BlockCodeRegion::ProfileRegion(ID, BD, locTy, AC,
superRegion);
387void BlockDataRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
392 ID.AddInteger(MemRegion::BlockDataRegionKind);
395 ID.AddInteger(BlkCount);
400 BlockDataRegion::ProfileRegion(ID, BC, LC, BlockCount,
getSuperRegion());
403void CXXTempObjectRegion::ProfileRegion(llvm::FoldingSetNodeID &ID,
414void CXXLifetimeExtendedObjectRegion::ProfileRegion(llvm::FoldingSetNodeID &ID,
424 llvm::FoldingSetNodeID &ID)
const {
428void CXXBaseObjectRegion::ProfileRegion(llvm::FoldingSetNodeID &ID,
433 ID.AddBoolean(IsVirtual);
441void CXXDerivedObjectRegion::ProfileRegion(llvm::FoldingSetNodeID &ID,
456void GlobalsSpaceRegion::anchor() {}
458void NonStaticGlobalSpaceRegion::anchor() {}
460void StackSpaceRegion::anchor() {}
462void TypedRegion::anchor() {}
464void TypedValueRegion::anchor() {}
466void CodeTextRegion::anchor() {}
468void SubRegion::anchor() {}
480 llvm::raw_string_ostream os(
s);
486 os <<
"<Unknown Region>";
498 os <<
"block_code{" <<
static_cast<const void *
>(
this) <<
'}';
502 os <<
"block_data{" << BC;
505 os <<
"(" << Var.getCapturedRegion() <<
"<-" << Var.getOriginalRegion()
521 os <<
"lifetime_extended_object{" <<
getValueType() <<
", ";
525 os <<
"D" << ExD->
getID();
556 assert(Str !=
nullptr &&
"Expecting non-null StringLiteral");
561 assert(Str !=
nullptr &&
"Expecting non-null ObjCStringLiteral");
568 os <<
"SymRegion{" << sym <<
'}';
575 os <<
"NonParamVarRegion{D" << VD->
getID() <<
'}';
587 os <<
"CodeSpaceRegion";
591 os <<
"StaticGlobalsMemSpace{" << CR <<
'}';
595 os <<
"GlobalInternalSpaceRegion";
599 os <<
"GlobalSystemSpaceRegion";
603 os <<
"GlobalImmutableSpaceRegion";
607 os <<
"HeapSpaceRegion";
611 os <<
"UnknownSpaceRegion";
615 os <<
"StackArgumentsSpaceRegion";
619 os <<
"StackLocalsSpaceRegion";
625 "`ParamVarRegion` support functions without `Decl` not implemented"
630 os <<
"ParamVarRegion{P" << PVD->
getID() <<
'}';
644#define REGION(Id, Parent) \
647#include "clang/StaticAnalyzer/Core/PathSensitive/Regions.def"
650 llvm_unreachable(
"Unkown kind!");
654 assert(
canPrintPretty() &&
"This region cannot be printed pretty.");
661 llvm_unreachable(
"This region cannot be printed pretty.");
674 "`ParamVarRegion` support functions without `Decl` not implemented"
728 std::string VariableName;
729 std::string ArrayIndices;
732 llvm::raw_svector_ostream os(buf);
735 auto QuoteIfNeeded = [UseQuotes](
const Twine &Subject) -> std::string {
737 return (
"'" + Subject +
"'").str();
738 return Subject.str();
747 CI->getValue()->toString(Idx);
748 ArrayIndices = (llvm::Twine(
"[") + Idx.str() +
"]" + ArrayIndices).str();
756 const MemRegion *OR = SI->getAsSymbol()->getOriginRegion();
764 ArrayIndices = (llvm::Twine(
"[") + Idx +
"]" + ArrayIndices).str();
774 return QuoteIfNeeded(llvm::Twine(os.str()) + ArrayIndices);
779 std::string Super = FR->getSuperRegion()->getDescriptiveName(
false);
782 return QuoteIfNeeded(Super +
"." + FR->getDecl()->getName());
791 if (
auto *FR = dyn_cast<FieldRegion>(
this)) {
792 return FR->getDecl()->getSourceRange();
796 return VR->getDecl()->getSourceRange();
809 const auto *SR = cast<SubRegion>(MR);
812 switch (SR->getKind()) {
813 case MemRegion::AllocaRegionKind:
814 case MemRegion::SymbolicRegionKind:
816 case MemRegion::StringRegionKind:
818 cast<StringRegion>(SR)->getStringLiteral()->getByteLength() + 1,
820 case MemRegion::CompoundLiteralRegionKind:
821 case MemRegion::CXXBaseObjectRegionKind:
822 case MemRegion::CXXDerivedObjectRegionKind:
823 case MemRegion::CXXTempObjectRegionKind:
824 case MemRegion::CXXLifetimeExtendedObjectRegionKind:
825 case MemRegion::CXXThisRegionKind:
826 case MemRegion::ObjCIvarRegionKind:
827 case MemRegion::NonParamVarRegionKind:
828 case MemRegion::ParamVarRegionKind:
829 case MemRegion::ElementRegionKind:
830 case MemRegion::ObjCStringRegionKind: {
831 QualType Ty = cast<TypedValueRegion>(SR)->getDesugaredValueType(Ctx);
832 if (isa<VariableArrayType>(Ty))
840 case MemRegion::FieldRegionKind: {
842 if (cast<FieldRegion>(SR)->getDecl()->isBitField())
845 QualType Ty = cast<TypedValueRegion>(SR)->getDesugaredValueType(Ctx);
853 const auto isFlexibleArrayMemberCandidate =
858 auto IsIncompleteArray = [](
const ArrayType *AT) {
859 return isa<IncompleteArrayType>(AT);
861 auto IsArrayOfZero = [](
const ArrayType *AT) {
862 const auto *CAT = dyn_cast<ConstantArrayType>(AT);
863 return CAT && CAT->isZeroSize();
865 auto IsArrayOfOne = [](
const ArrayType *AT) {
866 const auto *CAT = dyn_cast<ConstantArrayType>(AT);
867 return CAT && CAT->getSize() == 1;
871 const FAMKind StrictFlexArraysLevel =
877 if (StrictFlexArraysLevel == FAMKind::Default)
878 return IsArrayOfOne(AT) || IsArrayOfZero(AT) || IsIncompleteArray(AT);
880 if (StrictFlexArraysLevel == FAMKind::OneZeroOrIncomplete)
881 return IsArrayOfOne(AT) || IsArrayOfZero(AT) || IsIncompleteArray(AT);
883 if (StrictFlexArraysLevel == FAMKind::ZeroOrIncomplete)
884 return IsArrayOfZero(AT) || IsIncompleteArray(AT);
886 assert(StrictFlexArraysLevel == FAMKind::IncompleteOnly);
887 return IsIncompleteArray(AT);
897 case MemRegion::BlockDataRegionKind:
898 case MemRegion::BlockCodeRegionKind:
899 case MemRegion::FunctionCodeRegionKind:
902 llvm_unreachable(
"Unhandled region");
906template <
typename REG>
907const REG *MemRegionManager::LazyAllocate(REG*& region) {
909 region =
new (A) REG(*
this);
915template <
typename REG,
typename ARG>
916const REG *MemRegionManager::LazyAllocate(REG*& region, ARG a) {
918 region =
new (A) REG(
this, a);
952 if (K == MemRegion::GlobalSystemSpaceRegionKind)
953 return LazyAllocate(SystemGlobals);
954 if (K == MemRegion::GlobalImmutableSpaceRegionKind)
955 return LazyAllocate(ImmutableGlobals);
956 assert(K == MemRegion::GlobalInternalSpaceRegionKind);
957 return LazyAllocate(InternalGlobals);
960 assert(K == MemRegion::StaticGlobalSpaceRegionKind);
970 return LazyAllocate(heap);
974 return LazyAllocate(unknown);
978 return LazyAllocate(code);
986 return getSubRegion<StringRegion>(
992 return getSubRegion<ObjCStringRegion>(
999static llvm::PointerUnion<const StackFrameContext *, const VarRegion *>
1004 if (
const auto *SFC = dyn_cast<StackFrameContext>(LC)) {
1005 if (cast<DeclContext>(SFC->getDecl()) == DC)
1008 if (
const auto *BC = dyn_cast<BlockInvocationContext>(LC)) {
1011 for (
auto Var : BR->referenced_vars()) {
1013 if (
const auto *VR = dyn_cast<VarRegion>(OrigR)) {
1014 if (VR->getDecl() == VD)
1015 return cast<VarRegion>(Var.getCapturedRegion());
1036 QualType Ty =
D->getType().getCanonicalType();
1038 (N ==
"stdin" || N ==
"stdout" || N ==
"stderr");
1043 const auto *PVD = dyn_cast<ParmVarDecl>(
D);
1045 unsigned Index = PVD->getFunctionScopeIndex();
1050 if (
const auto *FD = dyn_cast<FunctionDecl>(
D)) {
1051 if (Index < FD->param_size() && FD->parameters()[Index] == PVD)
1052 return getSubRegion<ParamVarRegion>(cast<Expr>(CallSite), Index,
1054 }
else if (
const auto *BD = dyn_cast<BlockDecl>(
D)) {
1055 if (Index < BD->param_size() && BD->
parameters()[Index] == PVD)
1056 return getSubRegion<ParamVarRegion>(cast<Expr>(CallSite), Index,
1059 return getSubRegion<ParamVarRegion>(cast<Expr>(CallSite), Index,
1068 if (
D->hasGlobalStorage() && !
D->isStaticLocal()) {
1092 llvm::PointerUnion<const StackFrameContext *, const VarRegion *>
V =
1095 if (
const auto *VR = dyn_cast_if_present<const VarRegion *>(
V))
1098 const auto *STC = cast<const StackFrameContext *>(
V);
1105 if (
D->hasLocalStorage()) {
1107 isa<ParmVarDecl, ImplicitParamDecl>(
D)
1112 assert(
D->isStaticLocal());
1113 const Decl *STCD = STC->getDecl();
1114 if (isa<FunctionDecl, ObjCMethodDecl>(STCD))
1117 else if (
const auto *BD = dyn_cast<BlockDecl>(STCD)) {
1135 STC->getAnalysisDeclContext());
1154 if (
const VarDecl *Def =
D->getDefinition())
1156 return getSubRegion<NonParamVarRegion>(
D, superR);
1164 return getSubRegion<ParamVarRegion>(OriginExpr, Index,
1171 unsigned blockCount) {
1179 bool IsArcManagedBlock = Ctx.
getLangOpts().ObjCAutoRefCount;
1184 if (!IsArcManagedBlock && LC) {
1197 return getSubRegion<BlockDataRegion>(BC, LC, blockCount, sReg);
1205 if (
CL->isFileScope())
1213 return getSubRegion<CompoundLiteralRegion>(
CL, sReg);
1232 llvm::FoldingSetNodeID ID;
1233 ElementRegion::ProfileRegion(ID,
T, Idx, superRegion);
1236 MemRegion* data = Regions.FindNodeOrInsertPos(ID, InsertPos);
1237 auto *R = cast_or_null<ElementRegion>(data);
1241 Regions.InsertNode(R, InsertPos);
1250 return getSubRegion<FunctionCodeRegion>(FD,
getCodeRegion());
1256 return getSubRegion<BlockCodeRegion>(BD, locTy, AC,
getCodeRegion());
1262 if (MemSpace ==
nullptr)
1264 return getSubRegion<SymbolicRegion>(sym, MemSpace);
1274 return getSubRegion<FieldRegion>(d, superRegion);
1280 return getSubRegion<ObjCIvarRegion>(d, superRegion);
1296 return getSubRegion<CXXLifetimeExtendedObjectRegion>(
1303 return getSubRegion<CXXLifetimeExtendedObjectRegion>(
1320 return Class->isVirtuallyDerivedFrom(BaseClass);
1322 for (
const auto &I :
Class->bases()) {
1323 if (I.getType()->getAsCXXRecordDecl()->getCanonicalDecl() == BaseClass)
1334 if (isa<TypedValueRegion>(Super)) {
1341 while (
const auto *
Base = dyn_cast<CXXBaseObjectRegion>(Super))
1342 Super = cast<SubRegion>(
Base->getSuperRegion());
1343 assert(Super && !isa<MemSpaceRegion>(Super));
1347 return getSubRegion<CXXBaseObjectRegion>(RD, IsVirtual, Super);
1353 return getSubRegion<CXXDerivedObjectRegion>(RD, Super);
1363 const auto *
D = dyn_cast<CXXMethodDecl>(LC->
getDecl());
1370 D = dyn_cast<CXXMethodDecl>(LC->
getDecl());
1387 const auto *SR = dyn_cast<SubRegion>(
this);
1390 R = SR->getSuperRegion();
1391 SR = dyn_cast<SubRegion>(R);
1394 return cast<MemSpaceRegion>(R);
1401 if (!isa<UnknownSpaceRegion>(RawSpace))
1404 const MemSpaceRegion *
const *AssociatedSpace = State->get<MemSpacesMap>(MR);
1405 return AssociatedSpace ? *AssociatedSpace : RawSpace;
1413 assert(!isa<UnknownSpaceRegion>(Space));
1417 return State->set<MemSpacesMap>(
Base, Space);
1426 case MemRegion::ElementRegionKind:
1427 case MemRegion::FieldRegionKind:
1428 case MemRegion::ObjCIvarRegionKind:
1429 case MemRegion::CXXBaseObjectRegionKind:
1430 case MemRegion::CXXDerivedObjectRegionKind:
1431 R = cast<SubRegion>(R)->getSuperRegion();
1444 while (
const auto *BR = dyn_cast<CXXBaseObjectRegion>(R))
1445 R = BR->getSuperRegion();
1461 case ElementRegionKind: {
1462 const auto *ER = cast<ElementRegion>(R);
1463 if (!ER->getIndex().isZeroConstant())
1465 R = ER->getSuperRegion();
1468 case CXXBaseObjectRegionKind:
1469 case CXXDerivedObjectRegionKind:
1470 if (!StripBaseAndDerivedCasts)
1472 R = cast<TypedValueRegion>(R)->getSuperRegion();
1481 const auto *SubR = dyn_cast<SubRegion>(
this);
1484 if (
const auto *SymR = dyn_cast<SymbolicRegion>(SubR))
1486 SubR = dyn_cast<SubRegion>(SubR->getSuperRegion());
1506 if (int64_t i = CI->getValue()->getSExtValue(); i != 0) {
1515 int64_t size =
C.getTypeSizeInChars(elemType).getQuantity();
1516 if (
auto NewOffset = llvm::checkedMulAdd(i, size, offset)) {
1517 offset = *NewOffset;
1519 LLVM_DEBUG(llvm::dbgs() <<
"MemRegion::getAsArrayOffset: "
1520 <<
"offset overflowing, returning unknown\n");
1527 ER = dyn_cast<ElementRegion>(superR);
1534 assert(superR &&
"super region cannot be NULL");
1541 assert(Child &&
"Child must not be null");
1545 for (
const auto &I : Child->bases()) {
1546 if (I.getType()->getAsCXXRecordDecl() ==
Base)
1554 const MemRegion *SymbolicOffsetBase =
nullptr;
1559 case MemRegion::CodeSpaceRegionKind:
1560 case MemRegion::StackLocalsSpaceRegionKind:
1561 case MemRegion::StackArgumentsSpaceRegionKind:
1562 case MemRegion::HeapSpaceRegionKind:
1563 case MemRegion::UnknownSpaceRegionKind:
1564 case MemRegion::StaticGlobalSpaceRegionKind:
1565 case MemRegion::GlobalInternalSpaceRegionKind:
1566 case MemRegion::GlobalSystemSpaceRegionKind:
1567 case MemRegion::GlobalImmutableSpaceRegionKind:
1569 assert(Offset == 0 && !SymbolicOffsetBase);
1572 case MemRegion::FunctionCodeRegionKind:
1573 case MemRegion::BlockCodeRegionKind:
1574 case MemRegion::BlockDataRegionKind:
1578 SymbolicOffsetBase = R;
1581 case MemRegion::SymbolicRegionKind:
1582 case MemRegion::AllocaRegionKind:
1583 case MemRegion::CompoundLiteralRegionKind:
1584 case MemRegion::CXXThisRegionKind:
1585 case MemRegion::StringRegionKind:
1586 case MemRegion::ObjCStringRegionKind:
1587 case MemRegion::NonParamVarRegionKind:
1588 case MemRegion::ParamVarRegionKind:
1589 case MemRegion::CXXTempObjectRegionKind:
1590 case MemRegion::CXXLifetimeExtendedObjectRegionKind:
1594 case MemRegion::ObjCIvarRegionKind:
1602 case MemRegion::CXXBaseObjectRegionKind: {
1603 const auto *BOR = cast<CXXBaseObjectRegion>(R);
1604 R = BOR->getSuperRegion();
1607 bool RootIsSymbolic =
false;
1608 if (
const auto *TVR = dyn_cast<TypedValueRegion>(R)) {
1609 Ty = TVR->getDesugaredValueType(R->
getContext());
1610 }
else if (
const auto *SR = dyn_cast<SymbolicRegion>(R)) {
1614 Ty = SR->getPointeeStaticType();
1615 RootIsSymbolic =
true;
1621 SymbolicOffsetBase = R;
1623 if (RootIsSymbolic) {
1627 if (BOR->isVirtual()) {
1628 if (!Child->isVirtuallyDerivedFrom(BOR->getDecl()))
1629 SymbolicOffsetBase = R;
1632 SymbolicOffsetBase = R;
1639 if (SymbolicOffsetBase)
1644 if (BOR->isVirtual())
1654 case MemRegion::CXXDerivedObjectRegionKind: {
1659 case MemRegion::ElementRegionKind: {
1660 const auto *ER = cast<ElementRegion>(R);
1661 R = ER->getSuperRegion();
1663 QualType EleTy = ER->getValueType();
1666 SymbolicOffsetBase = R;
1670 SVal Index = ER->getIndex();
1671 if (std::optional<nonloc::ConcreteInt> CI =
1675 if (SymbolicOffsetBase)
1678 int64_t i = CI->getValue()->getSExtValue();
1683 SymbolicOffsetBase = R;
1687 case MemRegion::FieldRegionKind: {
1688 const auto *FR = cast<FieldRegion>(R);
1689 R = FR->getSuperRegion();
1699 SymbolicOffsetBase = R;
1704 if (SymbolicOffsetBase)
1710 FE = RD->
field_end(); FI != FE; ++FI, ++idx) {
1711 if (FR->getDecl() == *FI)
1723 if (SymbolicOffsetBase)
1731 return *cachedOffset;
1738std::pair<const VarRegion *, const VarRegion *>
1739BlockDataRegion::getCaptureRegions(
const VarDecl *VD) {
1758 return std::make_pair(VR, OriginalVR);
1761void BlockDataRegion::LazyInitializeReferencedVars() {
1766 const auto &ReferencedBlockVars = AC->getReferencedBlockVars(BC->
getDecl());
1768 std::distance(ReferencedBlockVars.begin(), ReferencedBlockVars.end());
1770 if (NumBlockVars == 0) {
1771 ReferencedVars = (
void*) 0x1;
1781 auto *BV =
new (A) VarVec(BC, NumBlockVars);
1782 auto *BVOriginal =
new (A) VarVec(BC, NumBlockVars);
1784 for (
const auto *VD : ReferencedBlockVars) {
1787 std::tie(VR, OriginalVR) = getCaptureRegions(VD);
1790 BV->push_back(VR, BC);
1791 BVOriginal->push_back(OriginalVR, BC);
1794 ReferencedVars = BV;
1795 OriginalVars = BVOriginal;
1804 if (Vec == (
void*) 0x1)
1811 VecOriginal->begin());
1820 if (Vec == (
void*) 0x1)
1827 VecOriginal->end());
1830llvm::iterator_range<BlockDataRegion::referenced_vars_iterator>
1837 if (I.getCapturedRegion() == R)
1838 return I.getOriginalRegion();
1849 SymTraitsMap[Sym] |= IK;
1855 if (
const auto *SR = dyn_cast<SymbolicRegion>(MR))
1858 MRTraitsMap[MR] |= IK;
1863 const_symbol_iterator I = SymTraitsMap.find(Sym);
1864 if (I != SymTraitsMap.end())
1865 return I->second & IK;
1875 if (
const auto *SR = dyn_cast<SymbolicRegion>(MR))
1876 return hasTrait(SR->getSymbol(), IK);
1878 const_region_iterator I = MRTraitsMap.find(MR);
1879 if (I != MRTraitsMap.end())
1880 return I->second & IK;
Defines the clang::ASTContext interface.
This file defines AnalysisDeclContext, a class that manages the analysis context data for context sen...
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
static bool isStdStreamVar(const VarDecl *D)
static llvm::PointerUnion< const StackFrameContext *, const VarRegion * > getStackOrCaptureRegionForDeclContext(const LocationContext *LC, const DeclContext *DC, const VarDecl *VD)
Look through a chain of LocationContexts to either find the StackFrameContext that matches a DeclCont...
static bool isImmediateBase(const CXXRecordDecl *Child, const CXXRecordDecl *Base)
Returns true if Base is an immediate base class of Child.
static bool isValidBaseClass(const CXXRecordDecl *BaseClass, const TypedValueRegion *Super, bool IsVirtual)
Checks whether BaseClass is a valid virtual or direct non-virtual base class of the type of Super.
static RegionOffset calculateOffset(const MemRegion *R)
#define REGISTER_MAP_WITH_PROGRAMSTATE(Name, Key, Value)
Declares an immutable map of type NameTy, suitable for placement into the ProgramState.
Defines the SourceManager interface.
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 ...
SourceManager & getSourceManager()
QualType getBlockPointerType(QualType T) const
Return the uniqued reference to the type for a block of the specified type.
const ASTRecordLayout & getASTRecordLayout(const RecordDecl *D) const
Get or compute information about the layout of the specified record (struct/union/class) D,...
CanQualType getCanonicalType(QualType T) const
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
QualType getFILEType() const
Retrieve the C FILE type.
const LangOptions & getLangOpts() const
QualType getQualifiedType(SplitQualType split) const
Un-split a SplitQualType.
const ArrayType * getAsArrayType(QualType T) const
Type Query functions.
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
QualType getFunctionType(QualType ResultTy, ArrayRef< QualType > Args, const FunctionProtoType::ExtProtoInfo &EPI) const
Return a normal function type with a typed argument list.
CanQualType getCanonicalTagType(const TagDecl *TD) const
uint64_t getCharWidth() const
Return the size of the character type, in bits.
ASTRecordLayout - This class contains layout information for one RecordDecl, which is a struct/union/...
uint64_t getFieldOffset(unsigned FieldNo) const
getFieldOffset - Get the offset of the given field index, in bits.
CharUnits getBaseClassOffset(const CXXRecordDecl *Base) const
getBaseClassOffset - Get the offset, in chars, for the given base class.
CharUnits getVBaseClassOffset(const CXXRecordDecl *VBase) const
getVBaseClassOffset - Get the offset, in chars, for the given base class.
AnalysisDeclContext contains the context data for the function, method or block under analysis.
Represents an array type, per C99 6.7.5.2 - Array Declarators.
Represents a block literal declaration, which is like an unnamed FunctionDecl.
bool hasCaptures() const
True if this block (or its nested blocks) captures anything of local storage from its enclosing scope...
ArrayRef< ParmVarDecl * > parameters() const
TypeSourceInfo * getSignatureAsWritten() const
Represents a C++ struct/union/class.
CXXRecordDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
CanQual< T > getUnqualifiedType() const
Retrieve the unqualified form of this type.
CharUnits - This is an opaque type for sizes expressed in character units.
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
static CharUnits fromQuantity(QuantityType Quantity)
fromQuantity - Construct a CharUnits quantity from a raw integer type.
CompoundLiteralExpr - [C99 6.5.2.5].
specific_decl_iterator - Iterates over a subrange of declarations stored in a DeclContext,...
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
bool isTranslationUnit() const
Decl - This represents one declaration (or definition), e.g.
ASTContext & getASTContext() const LLVM_READONLY
SourceLocation getLocation() const
DeclContext * getDeclContext()
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
std::string getAsString() const
Retrieve the human-readable string for this name.
This represents one expression.
Represents a member of a struct/union/class.
FunctionType - C99 6.7.5.3 - Function Declarators.
One of these records is kept for each identifier that is lexed.
StringRef getName() const
Return the actual identifier string.
StrictFlexArraysLevelKind
It wraps the AnalysisDeclContext to represent both the call stack with the help of StackFrameContext ...
const Decl * getDecl() const
const LocationContext * getParent() const
It might return null.
const StackFrameContext * getStackFrame() const
virtual bool inTopFrame() const
This represents a decl that may have a name.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
ObjCIvarDecl - Represents an ObjC instance variable.
ObjCStringLiteral, used for Objective-C string literals i.e.
Represents a parameter to a function.
PointerType - C99 6.7.5.1 - Pointer Declarators.
A (possibly-)qualified type.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
LangAS getAddressSpace() const
Return the address space of this type.
QualType getCanonicalType() const
bool isConstQualified() const
Determine whether this type is const-qualified.
The collection of all-type qualifiers we support.
void setAddressSpace(LangAS space)
Represents a struct/union/class.
field_iterator field_end() const
field_iterator field_begin() const
bool isInSystemHeader(SourceLocation Loc) const
Returns if a SourceLocation is in a system header.
A trivial tuple used to represent a source range.
It represents a stack frame of the call stack (based on CallEvent).
const Stmt * getCallSite() const
Stmt - This represents one statement.
void printPretty(raw_ostream &OS, PrinterHelper *Helper, const PrintingPolicy &Policy, unsigned Indentation=0, StringRef NewlineSymbol="\n", const ASTContext *Context=nullptr) const
int64_t getID(const ASTContext &Context) const
StringLiteral - This represents a string literal expression, e.g.
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
A container of type source information.
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
bool isPointerType() const
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
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.
bool hasLocalStorage() const
Returns true if a variable with function scope is a non-static local variable.
AllocaRegion - A region that represents an untyped blob of bytes created by a call to 'alloca'.
void dumpToStream(raw_ostream &os) const override
void Profile(llvm::FoldingSetNodeID &ID) const override
BlockCodeRegion - A region that represents code texts of blocks (closures).
LLVM_ATTRIBUTE_RETURNS_NONNULL AnalysisDeclContext * getAnalysisDeclContext() const
void dumpToStream(raw_ostream &os) const override
LLVM_ATTRIBUTE_RETURNS_NONNULL const BlockDecl * getDecl() const
void Profile(llvm::FoldingSetNodeID &ID) const override
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.
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
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
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
void Profile(llvm::FoldingSetNodeID &ID) const override
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
LLVM_ATTRIBUTE_RETURNS_NONNULL const StackFrameContext * getStackFrame() const
CXXThisRegion - Represents the region for the implicit 'this' parameter in a call to a C++ method.
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
CompoundLiteralRegion - A memory region representing a compound literal.
void Profile(llvm::FoldingSetNodeID &ID) const override
void dumpToStream(raw_ostream &os) const override
ElementRegion is used to represent both array elements and casts.
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.
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
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.
const NamedDecl * getDecl() const
void dumpToStream(raw_ostream &os) const override
void Profile(llvm::FoldingSetNodeID &ID) const override
void dumpToStream(raw_ostream &os) const override
void dumpToStream(raw_ostream &os) const override
void dumpToStream(raw_ostream &os) const override
void dumpToStream(raw_ostream &os) const override
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 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 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)
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 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...
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.
StringRef getKindStr() const
RegionOffset getAsOffset() const
Compute the offset within the top level memory object.
LLVM_ATTRIBUTE_RETURNS_NONNULL const MemRegion * StripCasts(bool StripBaseAndDerivedCasts=true) const
ProgramStateRef setMemorySpace(ProgramStateRef State, const MemSpaceRegion *Space) const
Set the dynamically deduced memory space of a MemRegion that currently has UnknownSpaceRegion.
ASTContext & getContext() const
LLVM_ATTRIBUTE_RETURNS_NONNULL const MemSpaceRegion * getMemorySpace(ProgramStateRef State) const
Returns the most specific memory space for this memory region in the given ProgramStateRef.
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.
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...
LLVM_ATTRIBUTE_RETURNS_NONNULL const MemSpaceRegion * getRawMemorySpace() const
Deprecated.
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...
void Profile(llvm::FoldingSetNodeID &ID) 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
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
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.
void dumpToStream(raw_ostream &os) const override
ParamVarRegion - Represents a region for parameters.
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
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.
InvalidationKinds
Describes different invalidation traits.
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
CharUnits getOffset() const
void dumpToStream(raw_ostream &os) const
const MemRegion * getRegion() const
nonloc::ConcreteInt makeIntVal(const IntegerLiteral *integer)
QualType getArrayIndexType() const
SymbolManager & getSymbolManager()
SVal - This represents a symbolic expression, which can be either an L-value or an R-value.
void Profile(llvm::FoldingSetNodeID &ID) const
std::optional< T > getAs() const
Convert to the specified SVal type, returning std::nullopt if this SVal is not of the desired type.
void dumpToStream(raw_ostream &os) const override
void dumpToStream(raw_ostream &os) const override
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
void dumpToStream(raw_ostream &os) const override
LLVM_ATTRIBUTE_RETURNS_NONNULL const CodeTextRegion * getCodeRegion() const
StringRegion - Region associated with a StringLiteral.
void dumpToStream(raw_ostream &os) const override
SubRegion - A region that subsets another larger region.
LLVM_ATTRIBUTE_RETURNS_NONNULL const MemRegion * getSuperRegion() const
bool isSubRegionOf(const MemRegion *R) const override
Check if the region is a subregion of the given region.
const MemRegion * superRegion
MemRegionManager & getMemRegionManager() const override
SymbolExtent - Represents the extent (size in bytes) of a bounded region.
const SymExprT * acquire(Args &&...args)
Create or retrieve a SymExpr of type SymExprT for the given arguments.
SymbolicRegion - A special, "non-concrete" region.
void dumpToStream(raw_ostream &os) const override
void Profile(llvm::FoldingSetNodeID &ID) const override
static void ProfileRegion(llvm::FoldingSetNodeID &ID, SymbolRef sym, const MemRegion *superRegion)
TypedValueRegion - An abstract class representing regions having a typed value.
virtual QualType getValueType() const =0
void dumpToStream(raw_ostream &os) const override
const StackFrameContext * getStackFrame() const
It might return null.
Value representing integer constant.
Represents symbolic expression that isn't a location.
DefinedOrUnknownSVal getElementExtent(QualType Ty, SValBuilder &SVB)
The JSON file list parser is used to communicate input to InstallAPI.
LangAS
Defines the address space values used by the address space qualifier of QualType.
const FunctionProtoType * T
@ Class
The "class" keyword introduces the elaborated-type-specifier.
Extra information about a function prototype.
Describes how types, statements, expressions, and declarations should be printed.