36#include "llvm/ADT/APInt.h"
37#include "llvm/ADT/FoldingSet.h"
38#include "llvm/ADT/PointerUnion.h"
39#include "llvm/ADT/SmallString.h"
40#include "llvm/ADT/StringRef.h"
41#include "llvm/ADT/Twine.h"
42#include "llvm/ADT/iterator_range.h"
43#include "llvm/Support/Allocator.h"
44#include "llvm/Support/Casting.h"
45#include "llvm/Support/CheckedArithmetic.h"
46#include "llvm/Support/Compiler.h"
47#include "llvm/Support/Debug.h"
48#include "llvm/Support/ErrorHandling.h"
49#include "llvm/Support/raw_ostream.h"
62#define DEBUG_TYPE "MemRegion"
68template <
typename RegionTy,
typename SuperTy,
typename Arg1Ty>
69RegionTy* MemRegionManager::getSubRegion(
const Arg1Ty arg1,
70 const SuperTy *superRegion) {
71 llvm::FoldingSetNodeID ID;
72 RegionTy::ProfileRegion(ID, arg1, superRegion);
74 auto *R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID, InsertPos));
77 R =
new (A) RegionTy(arg1, superRegion);
78 Regions.InsertNode(R, InsertPos);
84template <
typename RegionTy,
typename SuperTy,
typename Arg1Ty,
typename Arg2Ty>
85RegionTy* MemRegionManager::getSubRegion(
const Arg1Ty arg1,
const Arg2Ty arg2,
86 const SuperTy *superRegion) {
87 llvm::FoldingSetNodeID
ID;
88 RegionTy::ProfileRegion(ID, arg1, arg2, superRegion);
90 auto *R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID, InsertPos));
93 R =
new (A) RegionTy(arg1, arg2, superRegion);
94 Regions.InsertNode(R, InsertPos);
100template <
typename RegionTy,
typename SuperTy,
101 typename Arg1Ty,
typename Arg2Ty,
typename Arg3Ty>
102RegionTy* MemRegionManager::getSubRegion(
const Arg1Ty arg1,
const Arg2Ty arg2,
104 const SuperTy *superRegion) {
105 llvm::FoldingSetNodeID
ID;
106 RegionTy::ProfileRegion(ID, arg1, arg2, arg3, superRegion);
108 auto *R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID, InsertPos));
111 R =
new (A) RegionTy(arg1, arg2, arg3, superRegion);
112 Regions.InsertNode(R, InsertPos);
137 if (
const auto *sr = dyn_cast<SubRegion>(r))
138 r = sr->getSuperRegion();
141 }
while (r !=
nullptr);
149 if (
const auto *sr = dyn_cast<SubRegion>(
superRegion)) {
159 return SSR ? SSR->getStackFrame() :
nullptr;
165 return SSR ? SSR->getStackFrame() :
nullptr;
170 "A temporary object can only be allocated on the stack");
175 :
DeclRegion(sReg, ObjCIvarRegionKind), IVD(ivd) {
195 "`ParamVarRegion` support functions without `Decl` not implemented"
203 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
204 assert(Index < FD->param_size());
205 return FD->parameters()[Index];
206 }
else if (
const auto *BD = dyn_cast<BlockDecl>(D)) {
207 assert(Index < BD->param_size());
208 return BD->parameters()[Index];
209 }
else if (
const auto *MD = dyn_cast<ObjCMethodDecl>(D)) {
210 assert(Index < MD->param_size());
211 return MD->parameters()[Index];
212 }
else if (
const auto *CD = dyn_cast<CXXConstructorDecl>(D)) {
213 assert(Index < CD->param_size());
214 return CD->parameters()[Index];
216 llvm_unreachable(
"Unexpected Decl kind!");
225 ID.AddInteger(
static_cast<unsigned>(
getKind()));
229 ID.AddInteger(
static_cast<unsigned>(
getKind()));
234 ID.AddInteger(
static_cast<unsigned>(
getKind()));
238void StringRegion::ProfileRegion(llvm::FoldingSetNodeID &ID,
241 ID.AddInteger(
static_cast<unsigned>(StringRegionKind));
246void ObjCStringRegion::ProfileRegion(llvm::FoldingSetNodeID &ID,
249 ID.AddInteger(
static_cast<unsigned>(ObjCStringRegionKind));
254void AllocaRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
255 const Expr *Ex,
unsigned cnt,
257 ID.AddInteger(
static_cast<unsigned>(AllocaRegionKind));
268 CompoundLiteralRegion::ProfileRegion(ID, CL,
superRegion);
271void CompoundLiteralRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
274 ID.AddInteger(
static_cast<unsigned>(CompoundLiteralRegionKind));
279void CXXThisRegion::ProfileRegion(llvm::FoldingSetNodeID &ID,
282 ID.AddInteger(
static_cast<unsigned>(CXXThisRegionKind));
284 ID.AddPointer(sRegion);
288 CXXThisRegion::ProfileRegion(ID, ThisPointerTy,
superRegion);
295void ObjCIvarRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
298 ID.AddInteger(
static_cast<unsigned>(ObjCIvarRegionKind));
307void NonParamVarRegion::ProfileRegion(llvm::FoldingSetNodeID &ID,
310 ID.AddInteger(
static_cast<unsigned>(NonParamVarRegionKind));
319void ParamVarRegion::ProfileRegion(llvm::FoldingSetNodeID &ID,
const Expr *OE,
321 ID.AddInteger(
static_cast<unsigned>(ParamVarRegionKind));
333 ID.AddInteger(
static_cast<unsigned>(MemRegion::SymbolicRegionKind));
342void ElementRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
345 ID.AddInteger(MemRegion::ElementRegionKind);
352 ElementRegion::ProfileRegion(ID, ElementType, Index,
superRegion);
355void FunctionCodeRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
358 ID.AddInteger(MemRegion::FunctionCodeRegionKind);
363 FunctionCodeRegion::ProfileRegion(ID, FD,
superRegion);
366void BlockCodeRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
370 ID.AddInteger(MemRegion::BlockCodeRegionKind);
375 BlockCodeRegion::ProfileRegion(ID, BD, locTy, AC,
superRegion);
378void BlockDataRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
383 ID.AddInteger(MemRegion::BlockDataRegionKind);
386 ID.AddInteger(BlkCount);
391 BlockDataRegion::ProfileRegion(ID, BC, LC, BlockCount,
getSuperRegion());
394void CXXTempObjectRegion::ProfileRegion(llvm::FoldingSetNodeID &ID,
405void CXXLifetimeExtendedObjectRegion::ProfileRegion(llvm::FoldingSetNodeID &ID,
415 llvm::FoldingSetNodeID &ID)
const {
419void CXXBaseObjectRegion::ProfileRegion(llvm::FoldingSetNodeID &ID,
424 ID.AddBoolean(IsVirtual);
432void CXXDerivedObjectRegion::ProfileRegion(llvm::FoldingSetNodeID &ID,
447void GlobalsSpaceRegion::anchor() {}
449void NonStaticGlobalSpaceRegion::anchor() {}
451void StackSpaceRegion::anchor() {}
453void TypedRegion::anchor() {}
455void TypedValueRegion::anchor() {}
457void CodeTextRegion::anchor() {}
459void SubRegion::anchor() {}
471 llvm::raw_string_ostream os(
s);
477 os <<
"<Unknown Region>";
489 os <<
"block_code{" <<
static_cast<const void *
>(
this) <<
'}';
493 os <<
"block_data{" << BC;
496 os <<
"(" << Var.getCapturedRegion() <<
"<-" << Var.getOriginalRegion()
512 os <<
"lifetime_extended_object{" <<
getValueType() <<
", ";
516 os <<
"D" << ExD->
getID();
547 assert(Str !=
nullptr &&
"Expecting non-null StringLiteral");
552 assert(Str !=
nullptr &&
"Expecting non-null ObjCStringLiteral");
559 os <<
"SymRegion{" << sym <<
'}';
566 os <<
"NonParamVarRegion{D" << VD->
getID() <<
'}';
578 os <<
"CodeSpaceRegion";
582 os <<
"StaticGlobalsMemSpace{" << CR <<
'}';
586 os <<
"GlobalInternalSpaceRegion";
590 os <<
"GlobalSystemSpaceRegion";
594 os <<
"GlobalImmutableSpaceRegion";
598 os <<
"HeapSpaceRegion";
602 os <<
"UnknownSpaceRegion";
606 os <<
"StackArgumentsSpaceRegion";
610 os <<
"StackLocalsSpaceRegion";
616 "`ParamVarRegion` support functions without `Decl` not implemented"
621 os <<
"ParamVarRegion{P" << PVD->
getID() <<
'}';
634 assert(
canPrintPretty() &&
"This region cannot be printed pretty.");
641 llvm_unreachable(
"This region cannot be printed pretty.");
654 "`ParamVarRegion` support functions without `Decl` not implemented"
708 std::string VariableName;
709 std::string ArrayIndices;
712 llvm::raw_svector_ostream os(buf);
720 CI->getValue().toString(Idx);
721 ArrayIndices = (llvm::Twine(
"[") + Idx.str() +
"]" + ArrayIndices).str();
729 const MemRegion *OR = SI->getAsSymbol()->getOriginRegion();
737 ArrayIndices = (llvm::Twine(
"[") + Idx +
"]" + ArrayIndices).str();
746 return (llvm::Twine(
"'") + os.str() + ArrayIndices +
"'").str();
748 return (llvm::Twine(os.str()) + ArrayIndices).str();
756 if (
auto *FR = dyn_cast<FieldRegion>(
this)) {
757 return FR->getDecl()->getSourceRange();
761 return VR->getDecl()->getSourceRange();
774 const auto *SR = cast<SubRegion>(MR);
777 switch (SR->getKind()) {
778 case MemRegion::AllocaRegionKind:
779 case MemRegion::SymbolicRegionKind:
781 case MemRegion::StringRegionKind:
783 cast<StringRegion>(SR)->getStringLiteral()->getByteLength() + 1,
785 case MemRegion::CompoundLiteralRegionKind:
786 case MemRegion::CXXBaseObjectRegionKind:
787 case MemRegion::CXXDerivedObjectRegionKind:
788 case MemRegion::CXXTempObjectRegionKind:
789 case MemRegion::CXXLifetimeExtendedObjectRegionKind:
790 case MemRegion::CXXThisRegionKind:
791 case MemRegion::ObjCIvarRegionKind:
792 case MemRegion::NonParamVarRegionKind:
793 case MemRegion::ParamVarRegionKind:
794 case MemRegion::ElementRegionKind:
795 case MemRegion::ObjCStringRegionKind: {
796 QualType Ty = cast<TypedValueRegion>(SR)->getDesugaredValueType(Ctx);
797 if (isa<VariableArrayType>(Ty))
805 case MemRegion::FieldRegionKind: {
807 if (cast<FieldRegion>(SR)->getDecl()->isBitField())
810 QualType Ty = cast<TypedValueRegion>(SR)->getDesugaredValueType(Ctx);
818 const auto isFlexibleArrayMemberCandidate =
823 auto IsIncompleteArray = [](
const ArrayType *AT) {
824 return isa<IncompleteArrayType>(AT);
826 auto IsArrayOfZero = [](
const ArrayType *AT) {
827 const auto *CAT = dyn_cast<ConstantArrayType>(AT);
828 return CAT && CAT->isZeroSize();
830 auto IsArrayOfOne = [](
const ArrayType *AT) {
831 const auto *CAT = dyn_cast<ConstantArrayType>(AT);
832 return CAT && CAT->getSize() == 1;
836 const FAMKind StrictFlexArraysLevel =
842 if (StrictFlexArraysLevel == FAMKind::Default)
843 return IsArrayOfOne(AT) || IsArrayOfZero(AT) || IsIncompleteArray(AT);
845 if (StrictFlexArraysLevel == FAMKind::OneZeroOrIncomplete)
846 return IsArrayOfOne(AT) || IsArrayOfZero(AT) || IsIncompleteArray(AT);
848 if (StrictFlexArraysLevel == FAMKind::ZeroOrIncomplete)
849 return IsArrayOfZero(AT) || IsIncompleteArray(AT);
851 assert(StrictFlexArraysLevel == FAMKind::IncompleteOnly);
852 return IsIncompleteArray(AT);
863 case MemRegion::BlockDataRegionKind:
864 case MemRegion::BlockCodeRegionKind:
865 case MemRegion::FunctionCodeRegionKind:
868 llvm_unreachable(
"Unhandled region");
872template <
typename REG>
873const REG *MemRegionManager::LazyAllocate(REG*& region) {
875 region =
new (A) REG(*
this);
881template <
typename REG,
typename ARG>
882const REG *MemRegionManager::LazyAllocate(REG*& region, ARG a) {
884 region =
new (A) REG(
this, a);
918 if (K == MemRegion::GlobalSystemSpaceRegionKind)
919 return LazyAllocate(SystemGlobals);
920 if (K == MemRegion::GlobalImmutableSpaceRegionKind)
921 return LazyAllocate(ImmutableGlobals);
922 assert(K == MemRegion::GlobalInternalSpaceRegionKind);
923 return LazyAllocate(InternalGlobals);
926 assert(K == MemRegion::StaticGlobalSpaceRegionKind);
936 return LazyAllocate(heap);
940 return LazyAllocate(unknown);
944 return LazyAllocate(code);
952 return getSubRegion<StringRegion>(
958 return getSubRegion<ObjCStringRegion>(
965static llvm::PointerUnion<const StackFrameContext *, const VarRegion *>
970 if (
const auto *SFC = dyn_cast<StackFrameContext>(LC)) {
971 if (cast<DeclContext>(SFC->getDecl()) == DC)
974 if (
const auto *BC = dyn_cast<BlockInvocationContext>(LC)) {
977 for (
auto Var : BR->referenced_vars()) {
979 if (
const auto *VR = dyn_cast<VarRegion>(OrigR)) {
980 if (VR->getDecl() == VD)
981 return cast<VarRegion>(Var.getCapturedRegion());
993 const auto *PVD = dyn_cast<ParmVarDecl>(D);
995 unsigned Index = PVD->getFunctionScopeIndex();
1000 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
1001 if (Index < FD->param_size() && FD->parameters()[Index] == PVD)
1002 return getSubRegion<ParamVarRegion>(cast<Expr>(CallSite), Index,
1004 }
else if (
const auto *BD = dyn_cast<BlockDecl>(D)) {
1005 if (Index < BD->param_size() && BD->
parameters()[Index] == PVD)
1006 return getSubRegion<ParamVarRegion>(cast<Expr>(CallSite), Index,
1009 return getSubRegion<ParamVarRegion>(cast<Expr>(CallSite), Index,
1034 llvm::PointerUnion<const StackFrameContext *, const VarRegion *>
V =
1049 isa<ParmVarDecl, ImplicitParamDecl>(D)
1056 if (isa<FunctionDecl, ObjCMethodDecl>(STCD))
1059 else if (
const auto *BD = dyn_cast<BlockDecl>(STCD)) {
1077 STC->getAnalysisDeclContext());
1098 return getSubRegion<NonParamVarRegion>(D, superR);
1106 return getSubRegion<ParamVarRegion>(OriginExpr, Index,
1113 unsigned blockCount) {
1121 bool IsArcManagedBlock = Ctx.
getLangOpts().ObjCAutoRefCount;
1126 if (!IsArcManagedBlock && LC) {
1139 return getSubRegion<BlockDataRegion>(BC, LC, blockCount, sReg);
1155 return getSubRegion<CompoundLiteralRegion>(CL, sReg);
1164 llvm::FoldingSetNodeID ID;
1165 ElementRegion::ProfileRegion(ID,
T, Idx, superRegion);
1168 MemRegion* data = Regions.FindNodeOrInsertPos(ID, InsertPos);
1169 auto *R = cast_or_null<ElementRegion>(data);
1173 Regions.InsertNode(R, InsertPos);
1182 return getSubRegion<FunctionCodeRegion>(FD,
getCodeRegion());
1188 return getSubRegion<BlockCodeRegion>(BD, locTy, AC,
getCodeRegion());
1194 if (MemSpace ==
nullptr)
1196 return getSubRegion<SymbolicRegion>(sym, MemSpace);
1206 return getSubRegion<FieldRegion>(d, superRegion);
1212 return getSubRegion<ObjCIvarRegion>(d, superRegion);
1228 return getSubRegion<CXXLifetimeExtendedObjectRegion>(
1235 return getSubRegion<CXXLifetimeExtendedObjectRegion>(
1252 return Class->isVirtuallyDerivedFrom(BaseClass);
1254 for (
const auto &I :
Class->bases()) {
1255 if (I.getType()->getAsCXXRecordDecl()->getCanonicalDecl() == BaseClass)
1266 if (isa<TypedValueRegion>(Super)) {
1273 while (
const auto *
Base = dyn_cast<CXXBaseObjectRegion>(Super))
1274 Super = cast<SubRegion>(
Base->getSuperRegion());
1275 assert(Super && !isa<MemSpaceRegion>(Super));
1279 return getSubRegion<CXXBaseObjectRegion>(RD, IsVirtual, Super);
1285 return getSubRegion<CXXDerivedObjectRegion>(RD, Super);
1295 const auto *D = dyn_cast<CXXMethodDecl>(LC->
getDecl());
1299 while (!LC->
inTopFrame() && (!D || D->isStatic() ||
1302 D = dyn_cast<CXXMethodDecl>(LC->
getDecl());
1319 const auto *SR = dyn_cast<SubRegion>(
this);
1322 R = SR->getSuperRegion();
1323 SR = dyn_cast<SubRegion>(R);
1326 return cast<MemSpaceRegion>(R);
1347 case MemRegion::ElementRegionKind:
1348 case MemRegion::FieldRegionKind:
1349 case MemRegion::ObjCIvarRegionKind:
1350 case MemRegion::CXXBaseObjectRegionKind:
1351 case MemRegion::CXXDerivedObjectRegionKind:
1352 R = cast<SubRegion>(R)->getSuperRegion();
1365 while (
const auto *BR = dyn_cast<CXXBaseObjectRegion>(R))
1366 R = BR->getSuperRegion();
1382 case ElementRegionKind: {
1383 const auto *ER = cast<ElementRegion>(R);
1384 if (!ER->getIndex().isZeroConstant())
1386 R = ER->getSuperRegion();
1389 case CXXBaseObjectRegionKind:
1390 case CXXDerivedObjectRegionKind:
1391 if (!StripBaseAndDerivedCasts)
1393 R = cast<TypedValueRegion>(R)->getSuperRegion();
1402 const auto *SubR = dyn_cast<SubRegion>(
this);
1405 if (
const auto *SymR = dyn_cast<SymbolicRegion>(SubR))
1407 SubR = dyn_cast<SubRegion>(SubR->getSuperRegion());
1427 int64_t i = CI->getValue().getSExtValue();
1438 int64_t size =
C.getTypeSizeInChars(elemType).getQuantity();
1439 if (
auto NewOffset = llvm::checkedMulAdd(i, size, offset)) {
1440 offset = *NewOffset;
1442 LLVM_DEBUG(llvm::dbgs() <<
"MemRegion::getAsArrayOffset: "
1443 <<
"offset overflowing, returning unknown\n");
1450 ER = dyn_cast<ElementRegion>(superR);
1457 assert(superR &&
"super region cannot be NULL");
1464 assert(Child &&
"Child must not be null");
1468 for (
const auto &I : Child->bases()) {
1469 if (I.getType()->getAsCXXRecordDecl() ==
Base)
1477 const MemRegion *SymbolicOffsetBase =
nullptr;
1482 case MemRegion::CodeSpaceRegionKind:
1483 case MemRegion::StackLocalsSpaceRegionKind:
1484 case MemRegion::StackArgumentsSpaceRegionKind:
1485 case MemRegion::HeapSpaceRegionKind:
1486 case MemRegion::UnknownSpaceRegionKind:
1487 case MemRegion::StaticGlobalSpaceRegionKind:
1488 case MemRegion::GlobalInternalSpaceRegionKind:
1489 case MemRegion::GlobalSystemSpaceRegionKind:
1490 case MemRegion::GlobalImmutableSpaceRegionKind:
1492 assert(Offset == 0 && !SymbolicOffsetBase);
1495 case MemRegion::FunctionCodeRegionKind:
1496 case MemRegion::BlockCodeRegionKind:
1497 case MemRegion::BlockDataRegionKind:
1501 SymbolicOffsetBase = R;
1504 case MemRegion::SymbolicRegionKind:
1505 case MemRegion::AllocaRegionKind:
1506 case MemRegion::CompoundLiteralRegionKind:
1507 case MemRegion::CXXThisRegionKind:
1508 case MemRegion::StringRegionKind:
1509 case MemRegion::ObjCStringRegionKind:
1510 case MemRegion::NonParamVarRegionKind:
1511 case MemRegion::ParamVarRegionKind:
1512 case MemRegion::CXXTempObjectRegionKind:
1513 case MemRegion::CXXLifetimeExtendedObjectRegionKind:
1517 case MemRegion::ObjCIvarRegionKind:
1525 case MemRegion::CXXBaseObjectRegionKind: {
1526 const auto *BOR = cast<CXXBaseObjectRegion>(R);
1527 R = BOR->getSuperRegion();
1530 bool RootIsSymbolic =
false;
1531 if (
const auto *TVR = dyn_cast<TypedValueRegion>(R)) {
1532 Ty = TVR->getDesugaredValueType(R->
getContext());
1533 }
else if (
const auto *SR = dyn_cast<SymbolicRegion>(R)) {
1537 Ty = SR->getPointeeStaticType();
1538 RootIsSymbolic =
true;
1544 SymbolicOffsetBase = R;
1546 if (RootIsSymbolic) {
1550 if (BOR->isVirtual()) {
1551 if (!Child->isVirtuallyDerivedFrom(BOR->getDecl()))
1552 SymbolicOffsetBase = R;
1555 SymbolicOffsetBase = R;
1562 if (SymbolicOffsetBase)
1567 if (BOR->isVirtual())
1577 case MemRegion::CXXDerivedObjectRegionKind: {
1582 case MemRegion::ElementRegionKind: {
1583 const auto *ER = cast<ElementRegion>(R);
1584 R = ER->getSuperRegion();
1586 QualType EleTy = ER->getValueType();
1589 SymbolicOffsetBase = R;
1593 SVal Index = ER->getIndex();
1594 if (std::optional<nonloc::ConcreteInt> CI =
1598 if (SymbolicOffsetBase)
1601 int64_t i = CI->getValue().getSExtValue();
1606 SymbolicOffsetBase = R;
1610 case MemRegion::FieldRegionKind: {
1611 const auto *FR = cast<FieldRegion>(R);
1612 R = FR->getSuperRegion();
1622 SymbolicOffsetBase = R;
1627 if (SymbolicOffsetBase)
1633 FE = RD->
field_end(); FI != FE; ++FI, ++idx) {
1634 if (FR->getDecl() == *FI)
1646 if (SymbolicOffsetBase)
1654 return *cachedOffset;
1661std::pair<const VarRegion *, const VarRegion *>
1662BlockDataRegion::getCaptureRegions(
const VarDecl *VD) {
1681 return std::make_pair(VR, OriginalVR);
1684void BlockDataRegion::LazyInitializeReferencedVars() {
1689 const auto &ReferencedBlockVars = AC->getReferencedBlockVars(BC->
getDecl());
1691 std::distance(ReferencedBlockVars.begin(), ReferencedBlockVars.end());
1693 if (NumBlockVars == 0) {
1694 ReferencedVars = (
void*) 0x1;
1704 auto *BV =
new (A) VarVec(BC, NumBlockVars);
1705 auto *BVOriginal =
new (A) VarVec(BC, NumBlockVars);
1707 for (
const auto *VD : ReferencedBlockVars) {
1710 std::tie(VR, OriginalVR) = getCaptureRegions(VD);
1713 BV->push_back(VR, BC);
1714 BVOriginal->push_back(OriginalVR, BC);
1717 ReferencedVars = BV;
1718 OriginalVars = BVOriginal;
1727 if (Vec == (
void*) 0x1)
1734 VecOriginal->begin());
1743 if (Vec == (
void*) 0x1)
1750 VecOriginal->end());
1753llvm::iterator_range<BlockDataRegion::referenced_vars_iterator>
1760 if (I.getCapturedRegion() == R)
1761 return I.getOriginalRegion();
1772 SymTraitsMap[Sym] |= IK;
1778 if (
const auto *SR = dyn_cast<SymbolicRegion>(MR))
1781 MRTraitsMap[MR] |= IK;
1786 const_symbol_iterator I = SymTraitsMap.find(Sym);
1787 if (I != SymTraitsMap.end())
1788 return I->second & IK;
1798 if (
const auto *SR = dyn_cast<SymbolicRegion>(MR))
1799 return hasTrait(SR->getSymbol(), IK);
1801 const_region_iterator I = MRTraitsMap.find(MR);
1802 if (I != MRTraitsMap.end())
1803 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 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)
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 ...
const LangOptions & getLangOpts() const
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.
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.
Decl - This represents one declaration (or definition), e.g.
SourceLocation getLocation() const
DeclContext * getDeclContext()
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.
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.
bool isConstQualified() const
Determine whether this type is const-qualified.
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 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.
VarDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
bool hasGlobalStorage() const
Returns true for all variables that do not have local storage.
VarDecl * getDefinition(ASTContext &)
Get the real (not just tentative) definition for this declaration.
bool isStaticLocal() const
Returns true if a variable with function scope is a static local variable.
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 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 ElementRegion * getElementRegion(QualType elementType, NonLoc Idx, const SubRegion *superRegion, ASTContext &Ctx)
getElementRegion - Retrieve the memory region associated with the associated element type,...
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.
LLVM_ATTRIBUTE_RETURNS_NONNULL const MemSpaceRegion * getMemorySpace() const
bool hasStackParametersStorage() 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...
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 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
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
const SymbolExtent * getExtentSymbol(const SubRegion *R)
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 VarDecl * getDecl() const override=0
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.
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.