MemRegion.h revision 5375d82d1d096ddd8879d8e6641a8f042b0d1d43
19e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//== MemRegion.h - Abstract memory regions for static analysis --*- C++ -*--==// 29e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// 39e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// The LLVM Compiler Infrastructure 49e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// 59e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// This file is distributed under the University of Illinois Open Source 69e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// License. See LICENSE.TXT for details. 79e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// 89e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 99e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// 109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// This file defines MemRegion and its subclasses. MemRegion defines a 119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// partially-typed abstraction of memory useful for path-sensitive dataflow 129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// analyses. 139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// 149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 165a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis#ifndef LLVM_CLANG_GR_MEMREGION_H 175a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis#define LLVM_CLANG_GR_MEMREGION_H 189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 19478851c3ed6bd784e7377dffd8e57b200c1b9ba9Benjamin Kramer#include "clang/AST/ASTContext.h" 209ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck#include "clang/AST/CharUnits.h" 21993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek#include "clang/AST/Decl.h" 224c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek#include "clang/AST/ExprObjC.h" 23d47d3b0cfeb7e8564ff77f48130fe63282b6d127Chris Lattner#include "clang/Basic/LLVM.h" 249b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenek#include "clang/StaticAnalyzer/Core/PathSensitive/SVals.h" 259c1845dbed9817520f5a7db8bd80a560c6c6ae6bArgyrios Kyrtzidis#include "llvm/Support/ErrorHandling.h" 269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/ADT/FoldingSet.h" 279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include <string> 289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 295e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramernamespace llvm { 305e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramerclass BumpPtrAllocator; 315e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramer} 329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremeneknamespace clang { 341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenekclass LocationContext; 3667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackFrameContext; 375a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis 389ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremeneknamespace ento { 395a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis 405a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidisclass MemRegionManager; 415a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidisclass MemSpaceRegion; 42c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenekclass SValBuilder; 434240096011a187807058f887eb81df750ffa17feTed Kremenekclass VarRegion; 44dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekclass CodeTextRegion; 451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 46e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu/// Represent a region's offset within the top level base region. 47e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xuclass RegionOffset { 48e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu /// The base region. 49e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu const MemRegion *R; 50e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu 51e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu /// The bit offset within the base region. It shouldn't be negative. 52e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu int64_t Offset; 53e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu 54e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xupublic: 555375d82d1d096ddd8879d8e6641a8f042b0d1d43Aaron Ballman // We're using a const instead of an enumeration due to the size required; 565375d82d1d096ddd8879d8e6641a8f042b0d1d43Aaron Ballman // Visual Studio will only create enumerations of size int, not long long. 575375d82d1d096ddd8879d8e6641a8f042b0d1d43Aaron Ballman static const int64_t Symbolic = INT64_MAX; 58824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose 59e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose RegionOffset() : R(0) {} 60e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu RegionOffset(const MemRegion *r, int64_t off) : R(r), Offset(off) {} 61e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu 62e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu const MemRegion *getRegion() const { return R; } 63824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose 64824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose bool hasSymbolicOffset() const { return Offset == Symbolic; } 65824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose 66824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose int64_t getOffset() const { 67824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose assert(!hasSymbolicOffset()); 68824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose return Offset; 69824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose } 70e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose 71e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose bool isValid() const { return R; } 72e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu}; 73e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu 7419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===// 7519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// Base region classes. 7619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===// 771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemRegion - The root abstract class for all memory regions. 799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegion : public llvm::FoldingSetNode { 804240096011a187807058f887eb81df750ffa17feTed Kremenek friend class MemRegionManager; 819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 8267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek enum Kind { 8367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek // Memory spaces. 84dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek GenericMemSpaceRegionKind, 8567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StackLocalsSpaceRegionKind, 8667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StackArgumentsSpaceRegionKind, 8767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek HeapSpaceRegionKind, 882b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek UnknownSpaceRegionKind, 89dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek StaticGlobalSpaceRegionKind, 90eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalInternalSpaceRegionKind, 91eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalSystemSpaceRegionKind, 92eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalImmutableSpaceRegionKind, 93eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks BEG_NON_STATIC_GLOBAL_MEMSPACES = GlobalInternalSpaceRegionKind, 94eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks END_NON_STATIC_GLOBAL_MEMSPACES = GlobalImmutableSpaceRegionKind, 95eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks BEG_GLOBAL_MEMSPACES = StaticGlobalSpaceRegionKind, 96eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks END_GLOBAL_MEMSPACES = GlobalImmutableSpaceRegionKind, 97dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek BEG_MEMSPACES = GenericMemSpaceRegionKind, 98eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks END_MEMSPACES = GlobalImmutableSpaceRegionKind, 9967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek // Untyped regions. 10067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek SymbolicRegionKind, 10167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek AllocaRegionKind, 1029697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek BlockDataRegionKind, 10367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek // Typed regions. 10467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BEG_TYPED_REGIONS, 10567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek FunctionTextRegionKind = BEG_TYPED_REGIONS, 10667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BlockTextRegionKind, 1079697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek BEG_TYPED_VALUE_REGIONS, 1089697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek CompoundLiteralRegionKind = BEG_TYPED_VALUE_REGIONS, 109de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek CXXThisRegionKind, 11067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StringRegionKind, 1114c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek ObjCStringRegionKind, 11267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek ElementRegionKind, 11367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek // Decl Regions. 11467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BEG_DECL_REGIONS, 11567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek VarRegionKind = BEG_DECL_REGIONS, 11667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek FieldRegionKind, 11767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek ObjCIvarRegionKind, 1184fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu END_DECL_REGIONS = ObjCIvarRegionKind, 11902fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu CXXTempObjectRegionKind, 1204fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu CXXBaseObjectRegionKind, 121096aef9597b263b4cd6a0feaacf9e7214fa9c75aJordy Rose END_TYPED_VALUE_REGIONS = CXXBaseObjectRegionKind, 122096aef9597b263b4cd6a0feaacf9e7214fa9c75aJordy Rose END_TYPED_REGIONS = CXXBaseObjectRegionKind 12367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek }; 12467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 1259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate: 1269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const Kind kind; 1271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 1299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemRegion(Kind k) : kind(k) {} 1309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek virtual ~MemRegion(); 1319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 133a6275a534da701f37d19a068e6361e5f10f983a1Ted Kremenek ASTContext &getContext() const; 1341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek virtual void Profile(llvm::FoldingSetNodeID& ID) const = 0; 136a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 137a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek virtual MemRegionManager* getMemRegionManager() const = 0; 138a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 139bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek const MemSpaceRegion *getMemorySpace() const; 1401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 141adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu const MemRegion *getBaseRegion() const; 142adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu 143b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose const MemRegion *StripCasts(bool StripBaseCasts = true) const; 1441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1451508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek bool hasGlobalsOrParametersStorage() const; 1461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 147de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek bool hasStackStorage() const; 148de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 149de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek bool hasStackNonParametersStorage() const; 150de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 151de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek bool hasStackParametersStorage() const; 152b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 153e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu /// Compute the offset within the top level memory object. 154e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu RegionOffset getAsOffset() const; 155e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu 1563d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks /// \brief Get a string representation of a region for debug use. 1573d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks std::string getString() const; 1583d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks 1599c378f705405d37f49795d5e915989de774fe11fTed Kremenek virtual void dumpToStream(raw_ostream &os) const; 1607f39d29cb69e7488f994870800d548008e50e1cbTed Kremenek 1618800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek void dump() const; 1621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 163919e8a1c6698bfa6848571d366430126bced727dJordan Rose /// \brief Returns true if this region can be printed in a user-friendly way. 164919e8a1c6698bfa6848571d366430126bced727dJordan Rose virtual bool canPrintPretty() const; 165919e8a1c6698bfa6848571d366430126bced727dJordan Rose 1663d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks /// \brief Print the region for use in diagnostics. 167919e8a1c6698bfa6848571d366430126bced727dJordan Rose virtual void printPretty(raw_ostream &os) const; 1683d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks 1691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Kind getKind() const { return kind; } 1701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 171ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek template<typename RegionTy> const RegionTy* getAs() const; 1721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 173f0f0605c87739c906861f73d4287798a4969b1e0Zhongxing Xu virtual bool isBoundable() const { return false; } 174b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 1759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion*) { return true; } 1769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 1771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 178eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// MemSpaceRegion - A memory region that represents a "memory space"; 1799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// for example, the set of global variables, the stack frame, etc. 1809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemSpaceRegion : public MemRegion { 181a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenekprotected: 18267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 18367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 184a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek MemRegionManager *Mgr; 185a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 18667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek MemSpaceRegion(MemRegionManager *mgr, Kind k = GenericMemSpaceRegionKind) 18767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : MemRegion(k), Mgr(mgr) { 18867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek assert(classof(this)); 18967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 19067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 19167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek MemRegionManager* getMemRegionManager() const { return Mgr; } 1921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 19367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 19467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek bool isBoundable() const { return false; } 19567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 19667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek void Profile(llvm::FoldingSetNodeID &ID) const; 19767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 19867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 19967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek Kind k = R->getKind(); 20067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return k >= BEG_MEMSPACES && k <= END_MEMSPACES; 201a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek } 20267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 20367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 20467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass GlobalsSpaceRegion : public MemSpaceRegion { 20599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 206dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekprotected: 207dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek GlobalsSpaceRegion(MemRegionManager *mgr, Kind k) 208dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek : MemSpaceRegion(mgr, k) {} 209dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekpublic: 210dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek static bool classof(const MemRegion *R) { 211dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek Kind k = R->getKind(); 212dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek return k >= BEG_GLOBAL_MEMSPACES && k <= END_GLOBAL_MEMSPACES; 213dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek } 214dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek}; 215eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 216914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region of the static variables within the current CodeTextRegion 217eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// scope. 218914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// 219eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// Currently, only the static locals are placed there, so we know that these 220eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// variables do not get invalidated by calls to other functions. 221dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekclass StaticGlobalSpaceRegion : public GlobalsSpaceRegion { 22267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 223a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 224dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek const CodeTextRegion *CR; 225dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 226dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek StaticGlobalSpaceRegion(MemRegionManager *mgr, const CodeTextRegion *cr) 227dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek : GlobalsSpaceRegion(mgr, StaticGlobalSpaceRegionKind), CR(cr) {} 228dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 229dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekpublic: 230dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek void Profile(llvm::FoldingSetNodeID &ID) const; 231dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 2329c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 233fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek 234dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek const CodeTextRegion *getCodeRegion() const { return CR; } 235dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 236dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek static bool classof(const MemRegion *R) { 237dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek return R->getKind() == StaticGlobalSpaceRegionKind; 238dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek } 239dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek}; 240eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 241914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region for all the non-static global variables. 242eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// 243eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// This class is further split into subclasses for efficient implementation of 244eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// invalidating a set of related global values as is done in 245eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// RegionStoreManager::invalidateRegions (instead of finding all the dependent 246eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// globals, we invalidate the whole parent region). 247dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekclass NonStaticGlobalSpaceRegion : public GlobalsSpaceRegion { 248dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek friend class MemRegionManager; 249dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 250eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksprotected: 251eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks NonStaticGlobalSpaceRegion(MemRegionManager *mgr, Kind k) 252eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks : GlobalsSpaceRegion(mgr, k) {} 253dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 2549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 255fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek 25667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 257eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks Kind k = R->getKind(); 258eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks return k >= BEG_NON_STATIC_GLOBAL_MEMSPACES && 259eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks k <= END_NON_STATIC_GLOBAL_MEMSPACES; 26067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 26167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 262eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 263914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region containing globals which are defined in system/external 264eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// headers and are considered modifiable by system calls (ex: errno). 265eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksclass GlobalSystemSpaceRegion : public NonStaticGlobalSpaceRegion { 266eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks friend class MemRegionManager; 267eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 268eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalSystemSpaceRegion(MemRegionManager *mgr) 269eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks : NonStaticGlobalSpaceRegion(mgr, GlobalSystemSpaceRegionKind) {} 270eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 271eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zakspublic: 272eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 273eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks void dumpToStream(raw_ostream &os) const; 274eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 275eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks static bool classof(const MemRegion *R) { 276eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks return R->getKind() == GlobalSystemSpaceRegionKind; 277eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks } 278eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks}; 279eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 280914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region containing globals which are considered not to be modified 281eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// or point to data which could be modified as a result of a function call 282eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// (system or internal). Ex: Const global scalars would be modeled as part of 283eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// this region. This region also includes most system globals since they have 284eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// low chance of being modified. 285eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksclass GlobalImmutableSpaceRegion : public NonStaticGlobalSpaceRegion { 286eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks friend class MemRegionManager; 287eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 288eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalImmutableSpaceRegion(MemRegionManager *mgr) 289eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks : NonStaticGlobalSpaceRegion(mgr, GlobalImmutableSpaceRegionKind) {} 290eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 291eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zakspublic: 292eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 293eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks void dumpToStream(raw_ostream &os) const; 294eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 295eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks static bool classof(const MemRegion *R) { 296eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks return R->getKind() == GlobalImmutableSpaceRegionKind; 297eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks } 298eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks}; 299eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 300914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region containing globals which can be modified by calls to 301eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// "internally" defined functions - (for now just) functions other then system 302eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// calls. 303eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksclass GlobalInternalSpaceRegion : public NonStaticGlobalSpaceRegion { 304eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks friend class MemRegionManager; 305eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 306eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalInternalSpaceRegion(MemRegionManager *mgr) 307eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks : NonStaticGlobalSpaceRegion(mgr, GlobalInternalSpaceRegionKind) {} 308eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 309eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zakspublic: 310eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 311eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks void dumpToStream(raw_ostream &os) const; 312eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 313eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks static bool classof(const MemRegion *R) { 314eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks return R->getKind() == GlobalInternalSpaceRegionKind; 315eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks } 316eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks}; 317eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 31867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass HeapSpaceRegion : public MemSpaceRegion { 31999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 32067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 32167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 32267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek HeapSpaceRegion(MemRegionManager *mgr) 32367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : MemSpaceRegion(mgr, HeapSpaceRegionKind) {} 32467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 32536397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 32636397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose void dumpToStream(raw_ostream &os) const; 32736397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 32867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 32967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return R->getKind() == HeapSpaceRegionKind; 33067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 33167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 33267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 3332b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenekclass UnknownSpaceRegion : public MemSpaceRegion { 33499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 3352b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek friend class MemRegionManager; 3362b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek UnknownSpaceRegion(MemRegionManager *mgr) 3372b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek : MemSpaceRegion(mgr, UnknownSpaceRegionKind) {} 3382b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenekpublic: 33936397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 34036397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose void dumpToStream(raw_ostream &os) const; 34136397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 3422b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek static bool classof(const MemRegion *R) { 3432b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek return R->getKind() == UnknownSpaceRegionKind; 3442b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek } 3452b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek}; 3462b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek 34767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackSpaceRegion : public MemSpaceRegion { 34867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate: 34967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackFrameContext *SFC; 3509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 35167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprotected: 35267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StackSpaceRegion(MemRegionManager *mgr, Kind k, const StackFrameContext *sfc) 35367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : MemSpaceRegion(mgr, k), SFC(sfc) { 35467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek assert(classof(this)); 35567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 35641168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek 35767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 35867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackFrameContext *getStackFrame() const { return SFC; } 35967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 36067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek void Profile(llvm::FoldingSetNodeID &ID) const; 36167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 36267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 36367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek Kind k = R->getKind(); 36467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return k >= StackLocalsSpaceRegionKind && 36567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek k <= StackArgumentsSpaceRegionKind; 36667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 36767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 36867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 36967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackLocalsSpaceRegion : public StackSpaceRegion { 37099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 37167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 37267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StackLocalsSpaceRegion(MemRegionManager *mgr, const StackFrameContext *sfc) 37367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : StackSpaceRegion(mgr, StackLocalsSpaceRegionKind, sfc) {} 37467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 37536397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 37636397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose void dumpToStream(raw_ostream &os) const; 37736397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 37867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 37967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return R->getKind() == StackLocalsSpaceRegionKind; 38067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 38167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 38267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 38367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackArgumentsSpaceRegion : public StackSpaceRegion { 38467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate: 38599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 38667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 38767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StackArgumentsSpaceRegion(MemRegionManager *mgr, const StackFrameContext *sfc) 38867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : StackSpaceRegion(mgr, StackArgumentsSpaceRegionKind, sfc) {} 38967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 39036397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 39136397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose void dumpToStream(raw_ostream &os) const; 39236397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 39367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 39467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return R->getKind() == StackArgumentsSpaceRegionKind; 3959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 3979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3987caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 399993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// SubRegion - A region that subsets another larger region. Most regions 400993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// are subclasses of SubRegion. 401993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass SubRegion : public MemRegion { 40299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikieprivate: 40399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 4049e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 4051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const MemRegion* superRegion; 406993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek SubRegion(const MemRegion* sReg, Kind k) : MemRegion(k), superRegion(sReg) {} 4079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 4089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* getSuperRegion() const { 4099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return superRegion; 4109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 4111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 41232f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose /// getExtent - Returns the size of the region in bytes. 413c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek virtual DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const { 41432f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose return UnknownVal(); 41532f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose } 41632f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 417a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek MemRegionManager* getMemRegionManager() const; 4181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4197e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu bool isSubRegionOf(const MemRegion* R) const; 4201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 42267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return R->getKind() > END_MEMSPACES; 423993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek } 424993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek}; 4251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 42619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===// 42719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// MemRegion subclasses. 4281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump//===----------------------------------------------------------------------===// 429ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 43082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek/// AllocaRegion - A region that represents an untyped blob of bytes created 43182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek/// by a call to 'alloca'. 43282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekclass AllocaRegion : public SubRegion { 43382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek friend class MemRegionManager; 43482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekprotected: 43582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek unsigned Cnt; // Block counter. Used to distinguish different pieces of 43682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek // memory allocated by alloca at the same call site. 4379c378f705405d37f49795d5e915989de774fe11fTed Kremenek const Expr *Ex; 43882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 4399c378f705405d37f49795d5e915989de774fe11fTed Kremenek AllocaRegion(const Expr *ex, unsigned cnt, const MemRegion *superRegion) 44082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek : SubRegion(superRegion, AllocaRegionKind), Cnt(cnt), Ex(ex) {} 4411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 44282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekpublic: 4431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4449c378f705405d37f49795d5e915989de774fe11fTed Kremenek const Expr *getExpr() const { return Ex; } 4459852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu 4469852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu bool isBoundable() const { return true; } 4479852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu 448c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const; 44932f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 45082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 45182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 4529c378f705405d37f49795d5e915989de774fe11fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Expr *Ex, 4537ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek unsigned Cnt, const MemRegion *superRegion); 4541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4559c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 4561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 45782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek static bool classof(const MemRegion* R) { 45882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek return R->getKind() == AllocaRegionKind; 45982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek } 4601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}; 4611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 462993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// TypedRegion - An abstract class representing regions that are typed. 463993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass TypedRegion : public SubRegion { 46499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikiepublic: 46599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 466993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekprotected: 467993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek TypedRegion(const MemRegion* sReg, Kind k) : SubRegion(sReg, k) {} 4681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 469993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekpublic: 4709697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek virtual QualType getLocationType() const = 0; 4719697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek 4729697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek QualType getDesugaredLocationType(ASTContext &Context) const { 4739697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek return getLocationType().getDesugaredType(Context); 4749697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek } 4759697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek 4769697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek bool isBoundable() const { return true; } 4779697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek 4789697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek static bool classof(const MemRegion* R) { 4799697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek unsigned k = R->getKind(); 4809697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek return k >= BEG_TYPED_REGIONS && k <= END_TYPED_REGIONS; 4819697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek } 4829697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek}; 4839697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek 4849697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek/// TypedValueRegion - An abstract class representing regions having a typed value. 4859697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass TypedValueRegion : public TypedRegion { 48699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikiepublic: 48799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 4889697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekprotected: 4899697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek TypedValueRegion(const MemRegion* sReg, Kind k) : TypedRegion(sReg, k) {} 4909697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek 4919697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekpublic: 492018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu virtual QualType getValueType() const = 0; 4931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 494018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu virtual QualType getLocationType() const { 4956eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek // FIXME: We can possibly optimize this later to cache this value. 496a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek QualType T = getValueType(); 497a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek ASTContext &ctx = getContext(); 498a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek if (T->getAs<ObjCObjectType>()) 499a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek return ctx.getObjCObjectPointerType(T); 500a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek return ctx.getPointerType(getValueType()); 5016eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek } 5021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 50349f4e1cbd839da27ff4814b4ea6d85a79f786cbdJohn McCall QualType getDesugaredValueType(ASTContext &Context) const { 504018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType T = getValueType(); 5051ab55e9bb87d98bff1d42c7a0ee502c64755d9f5Douglas Gregor return T.getTypePtrOrNull() ? T.getDesugaredType(Context) : T; 50614553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek } 5071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 508e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const; 509e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose 510993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek static bool classof(const MemRegion* R) { 5119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek unsigned k = R->getKind(); 5129697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek return k >= BEG_TYPED_VALUE_REGIONS && k <= END_TYPED_VALUE_REGIONS; 5139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 5149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 5159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 516ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 517eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass CodeTextRegion : public TypedRegion { 51899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikiepublic: 51999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 520eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekprotected: 521eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek CodeTextRegion(const MemRegion *sreg, Kind k) : TypedRegion(sreg, k) {} 522ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xupublic: 523eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek bool isBoundable() const { return false; } 524eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 525eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek static bool classof(const MemRegion* R) { 526eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek Kind k = R->getKind(); 527eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return k >= FunctionTextRegionKind && k <= BlockTextRegionKind; 528eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek } 529eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek}; 530ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 531eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek/// FunctionTextRegion - A region that represents code texts of function. 532eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass FunctionTextRegion : public CodeTextRegion { 533eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek const FunctionDecl *FD; 534eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekpublic: 5359c378f705405d37f49795d5e915989de774fe11fTed Kremenek FunctionTextRegion(const FunctionDecl *fd, const MemRegion* sreg) 536eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek : CodeTextRegion(sreg, FunctionTextRegionKind), FD(fd) {} 537eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 538018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getLocationType() const { 539018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu return getContext().getPointerType(FD->getType()); 540ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu } 541eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 542abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek const FunctionDecl *getDecl() const { 543abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek return FD; 54472e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek } 545eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 5469c378f705405d37f49795d5e915989de774fe11fTed Kremenek virtual void dumpToStream(raw_ostream &os) const; 547eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 548ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const; 549eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 550abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const FunctionDecl *FD, 551abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek const MemRegion*); 552eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 553ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu static bool classof(const MemRegion* R) { 554eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return R->getKind() == FunctionTextRegionKind; 555eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek } 556eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek}; 557eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 558eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 559eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek/// BlockTextRegion - A region that represents code texts of blocks (closures). 5600a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// Blocks are represented with two kinds of regions. BlockTextRegions 5610a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// represent the "code", while BlockDataRegions represent instances of blocks, 5620a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// which correspond to "code+data". The distinction is important, because 5630a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// like a closure a block captures the values of externally referenced 5640a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// variables. 565eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass BlockTextRegion : public CodeTextRegion { 56667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 56767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 568eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek const BlockDecl *BD; 5691d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContext *AC; 570eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek CanQualType locTy; 57167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 57267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BlockTextRegion(const BlockDecl *bd, CanQualType lTy, 5731d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContext *ac, const MemRegion* sreg) 57467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : CodeTextRegion(sreg, BlockTextRegionKind), BD(bd), AC(ac), locTy(lTy) {} 57567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 57667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 577018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getLocationType() const { 578eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return locTy; 579eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek } 580eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 581eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek const BlockDecl *getDecl() const { 582eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return BD; 583eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek } 58467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 5851d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContext *getAnalysisDeclContext() const { return AC; } 586eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 5879c378f705405d37f49795d5e915989de774fe11fTed Kremenek virtual void dumpToStream(raw_ostream &os) const; 588eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 589eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 590eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 591eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const BlockDecl *BD, 5921d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek CanQualType, const AnalysisDeclContext*, 59367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const MemRegion*); 594eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 595eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek static bool classof(const MemRegion* R) { 596eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return R->getKind() == BlockTextRegionKind; 597ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu } 598ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu}; 5990a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 6000a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// BlockDataRegion - A region that represents a block instance. 6010a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// Blocks are represented with two kinds of regions. BlockTextRegions 6020a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// represent the "code", while BlockDataRegions represent instances of blocks, 6030a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// which correspond to "code+data". The distinction is important, because 6040a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// like a closure a block captures the values of externally referenced 6050a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// variables. 6060a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenekclass BlockDataRegion : public SubRegion { 60767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 6080a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek const BlockTextRegion *BC; 60967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *LC; // Can be null */ 6104240096011a187807058f887eb81df750ffa17feTed Kremenek void *ReferencedVars; 61185d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek void *OriginalVars; 61267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 61367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BlockDataRegion(const BlockTextRegion *bc, const LocationContext *lc, 6140a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek const MemRegion *sreg) 61585d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek : SubRegion(sreg, BlockDataRegionKind), BC(bc), LC(lc), 61685d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek ReferencedVars(0), OriginalVars(0) {} 6170a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 61885d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenekpublic: 6190a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek const BlockTextRegion *getCodeRegion() const { return BC; } 6204240096011a187807058f887eb81df750ffa17feTed Kremenek 621d02e83a548359df978f40cc1a52ffd78b7ef371bTed Kremenek const BlockDecl *getDecl() const { return BC->getDecl(); } 622d02e83a548359df978f40cc1a52ffd78b7ef371bTed Kremenek 62381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek class referenced_vars_iterator { 62481cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek const MemRegion * const *R; 62585d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek const MemRegion * const *OriginalR; 62681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek public: 62785d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek explicit referenced_vars_iterator(const MemRegion * const *r, 62885d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek const MemRegion * const *originalR) 62985d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek : R(r), OriginalR(originalR) {} 63081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek 63181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek operator const MemRegion * const *() const { 63281cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return R; 63381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 63485d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek 63585d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek const MemRegion *getCapturedRegion() const { 63685d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek return *R; 63785d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek } 63885d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek const MemRegion *getOriginalRegion() const { 63985d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek return *OriginalR; 64085d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek } 64185d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek 64281cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek const VarRegion* operator*() const { 64381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return cast<VarRegion>(*R); 64481cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 64581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek 64681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek bool operator==(const referenced_vars_iterator &I) const { 64781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return I.R == R; 64881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 64981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek bool operator!=(const referenced_vars_iterator &I) const { 65081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return I.R != R; 65181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 6529c378f705405d37f49795d5e915989de774fe11fTed Kremenek referenced_vars_iterator &operator++() { 65381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek ++R; 65485d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek ++OriginalR; 65581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return *this; 65681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 65781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek }; 65881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek 6594240096011a187807058f887eb81df750ffa17feTed Kremenek referenced_vars_iterator referenced_vars_begin() const; 6604240096011a187807058f887eb81df750ffa17feTed Kremenek referenced_vars_iterator referenced_vars_end() const; 6610a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 6629c378f705405d37f49795d5e915989de774fe11fTed Kremenek virtual void dumpToStream(raw_ostream &os) const; 6630a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 6640a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 6650a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 66667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID&, const BlockTextRegion *, 66767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *, const MemRegion *); 6680a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 6690a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek static bool classof(const MemRegion* R) { 6700a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek return R->getKind() == BlockDataRegionKind; 6710a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek } 6724240096011a187807058f887eb81df750ffa17feTed Kremenekprivate: 6734240096011a187807058f887eb81df750ffa17feTed Kremenek void LazyInitializeReferencedVars(); 6740a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek}; 675ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 676026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// SymbolicRegion - A special, "non-concrete" region. Unlike other region 677026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// clases, SymbolicRegion represents a region that serves as an alias for 678026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// either a real region, a NULL pointer, etc. It essentially is used to 679026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// map the concept of symbolic values into the domain of regions. Symbolic 680026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// regions do not need to be typed. 681e8e86482da4c1872673bbb9c237649229d19793bTed Kremenekclass SymbolicRegion : public SubRegion { 682026c66395b88a09437319139a43b090093f7e1ddZhongxing Xuprotected: 683026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu const SymbolRef sym; 684026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 685026c66395b88a09437319139a43b090093f7e1ddZhongxing Xupublic: 6861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SymbolicRegion(const SymbolRef s, const MemRegion* sreg) 687e8e86482da4c1872673bbb9c237649229d19793bTed Kremenek : SubRegion(sreg, SymbolicRegionKind), sym(s) {} 6881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 689026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu SymbolRef getSymbol() const { 690026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu return sym; 691026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu } 692026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 6939852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu bool isBoundable() const { return true; } 6949852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu 695c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const; 69632f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 697026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const; 698026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 699250101353b711a409b075f1bc11070dddec7100bTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, 700250101353b711a409b075f1bc11070dddec7100bTed Kremenek SymbolRef sym, 701250101353b711a409b075f1bc11070dddec7100bTed Kremenek const MemRegion* superRegion); 7021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7039c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 7041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 705026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu static bool classof(const MemRegion* R) { 706026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu return R->getKind() == SymbolicRegionKind; 707026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu } 7081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}; 709026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 710e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu/// StringRegion - Region associated with a StringLiteral. 7119697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass StringRegion : public TypedValueRegion { 712e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu friend class MemRegionManager; 713e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const StringLiteral* Str; 714e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuprotected: 715e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 716250101353b711a409b075f1bc11070dddec7100bTed Kremenek StringRegion(const StringLiteral* str, const MemRegion* sreg) 7179697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sreg, StringRegionKind), Str(str) {} 718e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 719e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID& ID, 720e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const StringLiteral* Str, 721e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const MemRegion* superRegion); 722e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 723e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xupublic: 7246613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu 7256613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu const StringLiteral* getStringLiteral() const { return Str; } 7261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 727018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 728ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu return Str->getType(); 729ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu } 730e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 731c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const; 73232f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 7330a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu bool isBoundable() const { return false; } 7340a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu 735e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const { 736e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu ProfileRegion(ID, Str, superRegion); 737e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 738e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 7399c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 740cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu 741e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static bool classof(const MemRegion* R) { 742e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu return R->getKind() == StringRegionKind; 743e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 744e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu}; 7454c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7464c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek/// The region associated with an ObjCStringLiteral. 7474c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekclass ObjCStringRegion : public TypedValueRegion { 7484c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek friend class MemRegionManager; 7494c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek const ObjCStringLiteral* Str; 7504c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekprotected: 7514c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7524c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek ObjCStringRegion(const ObjCStringLiteral* str, const MemRegion* sreg) 7534c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek : TypedValueRegion(sreg, ObjCStringRegionKind), Str(str) {} 7544c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7554c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, 7564c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek const ObjCStringLiteral* Str, 7574c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek const MemRegion* superRegion); 7584c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7594c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekpublic: 7604c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7614c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek const ObjCStringLiteral* getObjCStringLiteral() const { return Str; } 7624c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7634c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek QualType getValueType() const { 7644c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek return Str->getType(); 7654c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek } 7664c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7674c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek bool isBoundable() const { return false; } 7684c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7694c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek void Profile(llvm::FoldingSetNodeID& ID) const { 7704c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek ProfileRegion(ID, Str, superRegion); 7714c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek } 7724c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7734c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek void dumpToStream(raw_ostream &os) const; 7744c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7754c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek static bool classof(const MemRegion* R) { 7764c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek return R->getKind() == ObjCStringRegionKind; 7774c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek } 7784c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek}; 779e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 780329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// CompoundLiteralRegion - A memory region representing a compound literal. 781329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// Compound literals are essentially temporaries that are stack allocated 782329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// or in the global constant pool. 7839697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CompoundLiteralRegion : public TypedValueRegion { 784329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekprivate: 785329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek friend class MemRegionManager; 7869c378f705405d37f49795d5e915989de774fe11fTed Kremenek const CompoundLiteralExpr *CL; 787329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 7889c378f705405d37f49795d5e915989de774fe11fTed Kremenek CompoundLiteralRegion(const CompoundLiteralExpr *cl, const MemRegion* sReg) 7899697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sReg, CompoundLiteralRegionKind), CL(cl) {} 7901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 791329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, 7929c378f705405d37f49795d5e915989de774fe11fTed Kremenek const CompoundLiteralExpr *CL, 793329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek const MemRegion* superRegion); 794329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekpublic: 795018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 796018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu return CL->getType(); 79777cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu } 7980a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu 7999a08fee80a34938b8c11c7166e009a89ced4c2b4Zhongxing Xu bool isBoundable() const { return !CL->isFileScope(); } 8009a08fee80a34938b8c11c7166e009a89ced4c2b4Zhongxing Xu 801329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 8021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8039c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 804329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 8059c378f705405d37f49795d5e915989de774fe11fTed Kremenek const CompoundLiteralExpr *getLiteralExpr() const { return CL; } 8061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 807329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek static bool classof(const MemRegion* R) { 808329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek return R->getKind() == CompoundLiteralRegionKind; 809329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek } 810329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek}; 811178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 8129697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass DeclRegion : public TypedValueRegion { 8139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 8149c378f705405d37f49795d5e915989de774fe11fTed Kremenek const Decl *D; 8159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 8169c378f705405d37f49795d5e915989de774fe11fTed Kremenek DeclRegion(const Decl *d, const MemRegion* sReg, Kind k) 8179697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sReg, k), D(d) {} 8189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 8199c378f705405d37f49795d5e915989de774fe11fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl *D, 8209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion, Kind k); 8211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 822bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xupublic: 8239c378f705405d37f49795d5e915989de774fe11fTed Kremenek const Decl *getDecl() const { return D; } 8249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 8251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 826e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static bool classof(const MemRegion* R) { 827e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu unsigned k = R->getKind(); 82867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return k >= BEG_DECL_REGIONS && k <= END_DECL_REGIONS; 829e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 8309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 8311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass VarRegion : public DeclRegion { 8339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 834d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek 835d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek // Constructors and private methods. 8369c378f705405d37f49795d5e915989de774fe11fTed Kremenek VarRegion(const VarDecl *vd, const MemRegion* sReg) 83767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : DeclRegion(vd, sReg, VarRegionKind) {} 8389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 8399c378f705405d37f49795d5e915989de774fe11fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const VarDecl *VD, 840d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek const MemRegion *superRegion) { 8419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, VD, superRegion, VarRegionKind); 8429e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 8431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 844d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 8451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic: 847d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek const VarDecl *getDecl() const { return cast<VarDecl>(D); } 8481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8495348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek const StackFrameContext *getStackFrame() const; 8505348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek 851018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 8526eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek // FIXME: We can cache this if needed. 853018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu return getDecl()->getType(); 8541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 8551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8569c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 8571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 8599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == VarRegionKind; 8601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 8613d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks 862919e8a1c6698bfa6848571d366430126bced727dJordan Rose bool canPrintPretty() const; 863919e8a1c6698bfa6848571d366430126bced727dJordan Rose void printPretty(raw_ostream &os) const; 8649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 865de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 866de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek/// CXXThisRegion - Represents the region for the implicit 'this' parameter 867de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek/// in a call to a C++ method. This region doesn't represent the object 868de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek/// referred to by 'this', but rather 'this' itself. 8699697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CXXThisRegion : public TypedValueRegion { 870de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek friend class MemRegionManager; 871de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek CXXThisRegion(const PointerType *thisPointerTy, 872de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const MemRegion *sReg) 8739697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sReg, CXXThisRegionKind), ThisPointerTy(thisPointerTy) {} 874de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 875de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID &ID, 876de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const PointerType *PT, 877de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const MemRegion *sReg); 878de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 879de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek void Profile(llvm::FoldingSetNodeID &ID) const; 880de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 881de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekpublic: 882018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 883de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek return QualType(ThisPointerTy, 0); 884de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek } 8857caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 8869c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 887de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 888de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek static bool classof(const MemRegion* R) { 889de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek return R->getKind() == CXXThisRegionKind; 890de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek } 891de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 892de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekprivate: 893de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const PointerType *ThisPointerTy; 894de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek}; 8959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 8969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass FieldRegion : public DeclRegion { 8979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 8989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 8999c378f705405d37f49795d5e915989de774fe11fTed Kremenek FieldRegion(const FieldDecl *fd, const MemRegion* sReg) 9009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(fd, sReg, FieldRegionKind) {} 9019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 9024bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenekpublic: 9039c378f705405d37f49795d5e915989de774fe11fTed Kremenek const FieldDecl *getDecl() const { return cast<FieldDecl>(D); } 9041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 905018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 9066eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek // FIXME: We can cache this if needed. 907018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu return getDecl()->getType(); 9081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 9094bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek 910c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const; 91132f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 9129c378f705405d37f49795d5e915989de774fe11fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const FieldDecl *FD, 9136304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek const MemRegion* superRegion) { 9149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, FD, superRegion, FieldRegionKind); 9159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 9161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 9189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == FieldRegionKind; 9199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 9203d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks 9213d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks void dumpToStream(raw_ostream &os) const; 922919e8a1c6698bfa6848571d366430126bced727dJordan Rose 923919e8a1c6698bfa6848571d366430126bced727dJordan Rose bool canPrintPretty() const; 924919e8a1c6698bfa6848571d366430126bced727dJordan Rose void printPretty(raw_ostream &os) const; 9259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 9261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass ObjCIvarRegion : public DeclRegion { 9281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 9301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 931c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer ObjCIvarRegion(const ObjCIvarDecl *ivd, const MemRegion* sReg); 9329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 9339c378f705405d37f49795d5e915989de774fe11fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const ObjCIvarDecl *ivd, 934c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer const MemRegion* superRegion); 9351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 937c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer const ObjCIvarDecl *getDecl() const; 938c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer QualType getValueType() const; 9391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9409c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 9411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9429e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 9439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == ObjCIvarRegionKind; 9449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 9459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 9467caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu//===----------------------------------------------------------------------===// 947fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner// Auxiliary data classes for use with MemRegions. 9487caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu//===----------------------------------------------------------------------===// 9497caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 9507caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuclass ElementRegion; 9517caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 9527caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuclass RegionRawOffset { 9537caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuprivate: 9547caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu friend class ElementRegion; 9557caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 9567caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu const MemRegion *Region; 9579ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck CharUnits Offset; 9587caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 9599ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck RegionRawOffset(const MemRegion* reg, CharUnits offset = CharUnits::Zero()) 9607caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu : Region(reg), Offset(offset) {} 9617caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 9627caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xupublic: 9637caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu // FIXME: Eventually support symbolic offsets. 9649ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck CharUnits getOffset() const { return Offset; } 9657caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu const MemRegion *getRegion() const { return Region; } 9667caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 9679c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 9687caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu void dump() const; 9697caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu}; 970511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 9711437425a62dbf7bdb0a855d3ed3b05ed2019ec1eAnna Zaks/// \brief ElementRegin is used to represent both array elements and casts. 9729697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass ElementRegion : public TypedValueRegion { 973511191ce8920160525611be2be754c32a0724c3eZhongxing Xu friend class MemRegionManager; 974511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 975f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek QualType ElementType; 97602282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek NonLoc Index; 977511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 97802282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek ElementRegion(QualType elementType, NonLoc Idx, const MemRegion* sReg) 9799697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sReg, ElementRegionKind), 980f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek ElementType(elementType), Index(Idx) { 9813d8173c1c68f451c7492f92023d829c626845925Chris Lattner assert((!isa<nonloc::ConcreteInt>(&Idx) || 9823d8173c1c68f451c7492f92023d829c626845925Chris Lattner cast<nonloc::ConcreteInt>(&Idx)->getValue().isSigned()) && 98343b28d07019bc78447ecbbb721526de4ffd83f20Chris Lattner "The index must be signed"); 9840395b5d4987fe5baa818015e9d294c128619e4ecZhongxing Xu } 9851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 986f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, QualType elementType, 987f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek SVal Idx, const MemRegion* superRegion); 988511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 989511191ce8920160525611be2be754c32a0724c3eZhongxing Xupublic: 990511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 99102282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek NonLoc getIndex() const { return Index; } 9926e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu 993018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 994f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek return ElementType; 995f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek } 9961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 997f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek QualType getElementType() const { 998f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek return ElementType; 999abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek } 10007caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu /// Compute the offset within the array. The array might also be a subobject. 10017caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu RegionRawOffset getAsArrayOffset() const; 10021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 10039c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 1004b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 1005511191ce8920160525611be2be754c32a0724c3eZhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const; 1006511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 1007511191ce8920160525611be2be754c32a0724c3eZhongxing Xu static bool classof(const MemRegion* R) { 1008511191ce8920160525611be2be754c32a0724c3eZhongxing Xu return R->getKind() == ElementRegionKind; 1009511191ce8920160525611be2be754c32a0724c3eZhongxing Xu } 1010511191ce8920160525611be2be754c32a0724c3eZhongxing Xu}; 101119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 1012bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu// C++ temporary object associated with an expression. 10139697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CXXTempObjectRegion : public TypedValueRegion { 1014bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu friend class MemRegionManager; 1015bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 1016bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu Expr const *Ex; 1017bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 101802fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu CXXTempObjectRegion(Expr const *E, MemRegion const *sReg) 10199697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sReg, CXXTempObjectRegionKind), Ex(E) {} 1020bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 1021bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID &ID, 1022bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu Expr const *E, const MemRegion *sReg); 1023bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 1024bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xupublic: 1025782f63ecd124f9384f988dc7e0cf4ae1540c15f6Jeffrey Yasskin const Expr *getExpr() const { return Ex; } 1026782f63ecd124f9384f988dc7e0cf4ae1540c15f6Jeffrey Yasskin 1027018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 1028bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu return Ex->getType(); 1029bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu } 1030bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 10319c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 1032e1aeb13251a4858724d2b7ad1925d25076f23d08Zhongxing Xu 1033bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu void Profile(llvm::FoldingSetNodeID &ID) const; 1034bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 1035bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu static bool classof(const MemRegion* R) { 103602fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu return R->getKind() == CXXTempObjectRegionKind; 1037bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu } 1038bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu}; 1039bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 10404fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu// CXXBaseObjectRegion represents a base object within a C++ object. It is 10414fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu// identified by the base class declaration and the region of its parent object. 10429697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CXXBaseObjectRegion : public TypedValueRegion { 10434fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu friend class MemRegionManager; 10444fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 10454fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu const CXXRecordDecl *decl; 10464fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 10474fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu CXXBaseObjectRegion(const CXXRecordDecl *d, const MemRegion *sReg) 10489697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sReg, CXXBaseObjectRegionKind), decl(d) {} 10494fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 10504fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID &ID, 10514fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu const CXXRecordDecl *decl, const MemRegion *sReg); 10524fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 10534fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xupublic: 1054d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu const CXXRecordDecl *getDecl() const { return decl; } 1055d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu 10564fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu QualType getValueType() const; 10574fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 10589c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 10594fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 10604fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu void Profile(llvm::FoldingSetNodeID &ID) const; 10614fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 10624fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu static bool classof(const MemRegion *region) { 10634fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu return region->getKind() == CXXBaseObjectRegionKind; 10644fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu } 10654fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu}; 10664fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 1067ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenektemplate<typename RegionTy> 1068ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenekconst RegionTy* MemRegion::getAs() const { 1069f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek if (const RegionTy* RT = dyn_cast<RegionTy>(this)) 1070f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek return RT; 10711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1072f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek return NULL; 1073ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek} 1074511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 10759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 10769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager - Factory object for creating regions. 10779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 10789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 10799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager { 1080a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek ASTContext &C; 10819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek llvm::BumpPtrAllocator& A; 10829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek llvm::FoldingSet<MemRegion> Regions; 10831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1084eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalInternalSpaceRegion *InternalGlobals; 1085eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalSystemSpaceRegion *SystemGlobals; 1086eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalImmutableSpaceRegion *ImmutableGlobals; 1087eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 10882b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek 1089c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu llvm::DenseMap<const StackFrameContext *, StackLocalsSpaceRegion *> 1090c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu StackLocalsSpaceRegions; 1091c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu llvm::DenseMap<const StackFrameContext *, StackArgumentsSpaceRegion *> 1092c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu StackArgumentsSpaceRegions; 1093dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek llvm::DenseMap<const CodeTextRegion *, StaticGlobalSpaceRegion *> 1094dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek StaticsGlobalSpaceRegions; 10952b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek 109667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek HeapSpaceRegion *heap; 10972b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek UnknownSpaceRegion *unknown; 1098d05552a21377f493c882298c59e8829040b01d34Ted Kremenek MemSpaceRegion *code; 1099dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 11009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 1101a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek MemRegionManager(ASTContext &c, llvm::BumpPtrAllocator& a) 1102eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks : C(c), A(a), InternalGlobals(0), SystemGlobals(0), ImmutableGlobals(0), 1103eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks heap(0), unknown(0), code(0) {} 11041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 11054240096011a187807058f887eb81df750ffa17feTed Kremenek ~MemRegionManager(); 11061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1107a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek ASTContext &getContext() { return C; } 11084240096011a187807058f887eb81df750ffa17feTed Kremenek 11094240096011a187807058f887eb81df750ffa17feTed Kremenek llvm::BumpPtrAllocator &getAllocator() { return A; } 11101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 111167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// getStackLocalsRegion - Retrieve the memory region associated with the 111267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// specified stack frame. 111367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackLocalsSpaceRegion * 111467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek getStackLocalsRegion(const StackFrameContext *STC); 1115d05552a21377f493c882298c59e8829040b01d34Ted Kremenek 1116d05552a21377f493c882298c59e8829040b01d34Ted Kremenek /// getStackArgumentsRegion - Retrieve the memory region associated with 111767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// function/method arguments of the specified stack frame. 111867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackArgumentsSpaceRegion * 111967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek getStackArgumentsRegion(const StackFrameContext *STC); 11201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 11219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getGlobalsRegion - Retrieve the memory region associated with 1122dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek /// global variables. 1123eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks const GlobalsSpaceRegion *getGlobalsRegion( 1124eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks MemRegion::Kind K = MemRegion::GlobalInternalSpaceRegionKind, 1125eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks const CodeTextRegion *R = 0); 11261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 11279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getHeapRegion - Retrieve the memory region associated with the 11289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// generic "heap". 112967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const HeapSpaceRegion *getHeapRegion(); 1130178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 1131178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu /// getUnknownRegion - Retrieve the memory region associated with unknown 1132178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu /// memory space. 1133b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemSpaceRegion *getUnknownRegion(); 1134c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu 1135b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemSpaceRegion *getCodeRegion(); 1136ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 11377090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek /// getAllocaRegion - Retrieve a region associated with a call to alloca(). 11389c378f705405d37f49795d5e915989de774fe11fTed Kremenek const AllocaRegion *getAllocaRegion(const Expr *Ex, unsigned Cnt, 113967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *LC); 11401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1141329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek /// getCompoundLiteralRegion - Retrieve the region associated with a 1142329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek /// given CompoundLiteral. 1143b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const CompoundLiteralRegion* 11449c378f705405d37f49795d5e915989de774fe11fTed Kremenek getCompoundLiteralRegion(const CompoundLiteralExpr *CL, 114567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *LC); 1146de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 1147fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner /// getCXXThisRegion - Retrieve the [artificial] region associated with the 1148de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek /// parameter 'this'. 1149de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const CXXThisRegion *getCXXThisRegion(QualType thisPointerTy, 1150de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const LocationContext *LC); 11511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1152e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks /// \brief Retrieve or create a "symbolic" memory region. 1153e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks const SymbolicRegion* getSymbolicRegion(SymbolRef Sym); 1154e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks 1155e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks /// \brief Return a unique symbolic region belonging to heap memory space. 1156e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks const SymbolicRegion *getSymbolicHeapRegion(SymbolRef sym); 1157e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 11584c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek const StringRegion *getStringRegion(const StringLiteral* Str); 11594c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 11604c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek const ObjCStringRegion *getObjCStringRegion(const ObjCStringLiteral *Str); 1161e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 11629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getVarRegion - Retrieve or create the memory region associated with 1163d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek /// a specified VarDecl and LocationContext. 1164b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const VarRegion* getVarRegion(const VarDecl *D, const LocationContext *LC); 11651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 116667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// getVarRegion - Retrieve or create the memory region associated with 116767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// a specified VarDecl and super region. 116867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const VarRegion* getVarRegion(const VarDecl *D, const MemRegion *superR); 116967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 1170f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek /// getElementRegion - Retrieve the memory region associated with the 1171f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek /// associated element type, index, and super region. 117202282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek const ElementRegion *getElementRegion(QualType elementType, NonLoc Idx, 1173856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu const MemRegion *superRegion, 1174856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu ASTContext &Ctx); 11751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1176b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const ElementRegion *getElementRegionWithSuper(const ElementRegion *ER, 1177856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu const MemRegion *superRegion) { 1178a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek return getElementRegion(ER->getElementType(), ER->getIndex(), 1179a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek superRegion, ER->getContext()); 1180a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek } 1181511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 11829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getFieldRegion - Retrieve or create the memory region associated with 11839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a specified FieldDecl. 'superRegion' corresponds to the containing 11849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// memory region (which typically represents the memory representing 11859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a structure or class). 11869c378f705405d37f49795d5e915989de774fe11fTed Kremenek const FieldRegion *getFieldRegion(const FieldDecl *fd, 1187b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemRegion* superRegion); 11881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1189b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const FieldRegion *getFieldRegionWithSuper(const FieldRegion *FR, 1190b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemRegion *superRegion) { 1191a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek return getFieldRegion(FR->getDecl(), superRegion); 1192a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek } 11931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 11949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getObjCIvarRegion - Retrieve or create the memory region associated with 11959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a specified Objective-c instance variable. 'superRegion' corresponds 11969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// to the containing region (which typically represents the Objective-C 11979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// object). 11989c378f705405d37f49795d5e915989de774fe11fTed Kremenek const ObjCIvarRegion *getObjCIvarRegion(const ObjCIvarDecl *ivd, 1199b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemRegion* superRegion); 12001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 120102fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu const CXXTempObjectRegion *getCXXTempObjectRegion(Expr const *Ex, 120202fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu LocationContext const *LC); 1203bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 12044fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu const CXXBaseObjectRegion *getCXXBaseObjectRegion(const CXXRecordDecl *decl, 12054fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu const MemRegion *superRegion); 12064fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 1207d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu /// Create a CXXBaseObjectRegion with the same CXXRecordDecl but a different 1208d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu /// super region. 1209d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu const CXXBaseObjectRegion * 1210d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu getCXXBaseObjectRegionWithSuper(const CXXBaseObjectRegion *baseReg, 1211d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu const MemRegion *superRegion) { 1212d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu return getCXXBaseObjectRegion(baseReg->getDecl(), superRegion); 1213d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu } 1214d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu 1215b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const FunctionTextRegion *getFunctionTextRegion(const FunctionDecl *FD); 1216b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const BlockTextRegion *getBlockTextRegion(const BlockDecl *BD, 121767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek CanQualType locTy, 12181d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContext *AC); 121967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 122067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// getBlockDataRegion - Get the memory region associated with an instance 122167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// of a block. Unlike many other MemRegions, the LocationContext* 122267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// argument is allowed to be NULL for cases where we have no known 122367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// context. 1224b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const BlockDataRegion *getBlockDataRegion(const BlockTextRegion *bc, 122567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *lc = NULL); 12261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1227bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenekprivate: 1228250101353b711a409b075f1bc11070dddec7100bTed Kremenek template <typename RegionTy, typename A1> 1229250101353b711a409b075f1bc11070dddec7100bTed Kremenek RegionTy* getRegion(const A1 a1); 12301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 12316304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek template <typename RegionTy, typename A1> 1232eeea45611d45238c34474c183cee96d47ae79e24Ted Kremenek RegionTy* getSubRegion(const A1 a1, const MemRegion* superRegion); 12331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 12347ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek template <typename RegionTy, typename A1, typename A2> 12357ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek RegionTy* getRegion(const A1 a1, const A2 a2); 1236dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 12370a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek template <typename RegionTy, typename A1, typename A2> 12380a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek RegionTy* getSubRegion(const A1 a1, const A2 a2, 12390a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek const MemRegion* superRegion); 12400a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 124167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek template <typename RegionTy, typename A1, typename A2, typename A3> 124267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek RegionTy* getSubRegion(const A1 a1, const A2 a2, const A3 a3, 124367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const MemRegion* superRegion); 124467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 124567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek template <typename REG> 124667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const REG* LazyAllocate(REG*& region); 124767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 124867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek template <typename REG, typename ARG> 124967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const REG* LazyAllocate(REG*& region, ARG a); 1250ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek}; 12511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1252250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 1253a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek// Out-of-line member definitions. 1254250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 1255250101353b711a409b075f1bc11070dddec7100bTed Kremenek 12569c378f705405d37f49795d5e915989de774fe11fTed Kremenekinline ASTContext &MemRegion::getContext() const { 1257a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek return getMemRegionManager()->getContext(); 1258a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek} 1259eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 12605a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis} // end GR namespace 12615a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis 1262be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end clang namespace 12639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1264250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 1265250101353b711a409b075f1bc11070dddec7100bTed Kremenek// Pretty-printing regions. 1266250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 1267250101353b711a409b075f1bc11070dddec7100bTed Kremenek 1268be91224894e1501133e224934285ba6440bf5b59Ted Kremeneknamespace llvm { 12699c378f705405d37f49795d5e915989de774fe11fTed Kremenekstatic inline raw_ostream &operator<<(raw_ostream &os, 12709ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremenek const clang::ento::MemRegion* R) { 12718800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek R->dumpToStream(os); 12728800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek return os; 1273be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} 1274be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end llvm namespace 12759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 12769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#endif 1277