MemRegion.h revision 9e2f5977a180ae927d05e844c65b8a7873be48a4
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" 259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/ADT/FoldingSet.h" 2630a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include "llvm/Support/ErrorHandling.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, 10267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek // Typed regions. 10367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BEG_TYPED_REGIONS, 10467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek FunctionTextRegionKind = BEG_TYPED_REGIONS, 10567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BlockTextRegionKind, 1068ecf59afbab1dbf184dc4c0c47e7213cbd32ba0aJordan Rose BlockDataRegionKind, 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 143522fc21f3adc647817edc8017e6928a64c96899bAnna Zaks /// Check if the region is a subregion of the given region. 1445f7c0add1ea1d8e1d2f920d77fd1a7b6160c2d93Anna Zaks virtual bool isSubRegionOf(const MemRegion *R) const; 145522fc21f3adc647817edc8017e6928a64c96899bAnna Zaks 146b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose const MemRegion *StripCasts(bool StripBaseCasts = true) const; 1471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1481508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek bool hasGlobalsOrParametersStorage() const; 1491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 150de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek bool hasStackStorage() const; 151de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 152de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek bool hasStackNonParametersStorage() const; 153de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 154de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek bool hasStackParametersStorage() const; 155b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 156e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu /// Compute the offset within the top level memory object. 157e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu RegionOffset getAsOffset() const; 158e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu 1593d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks /// \brief Get a string representation of a region for debug use. 1603d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks std::string getString() const; 1613d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks 1629c378f705405d37f49795d5e915989de774fe11fTed Kremenek virtual void dumpToStream(raw_ostream &os) const; 1637f39d29cb69e7488f994870800d548008e50e1cbTed Kremenek 1648800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek void dump() const; 1651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 166919e8a1c6698bfa6848571d366430126bced727dJordan Rose /// \brief Returns true if this region can be printed in a user-friendly way. 167919e8a1c6698bfa6848571d366430126bced727dJordan Rose virtual bool canPrintPretty() const; 168919e8a1c6698bfa6848571d366430126bced727dJordan Rose 1693d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks /// \brief Print the region for use in diagnostics. 170919e8a1c6698bfa6848571d366430126bced727dJordan Rose virtual void printPretty(raw_ostream &os) const; 1713d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks 1729e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks virtual void printPrettyNoQuotes(raw_ostream &os) const; 1739e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks 1741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Kind getKind() const { return kind; } 1751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 176ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek template<typename RegionTy> const RegionTy* getAs() const; 1771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 178f0f0605c87739c906861f73d4287798a4969b1e0Zhongxing Xu virtual bool isBoundable() const { return false; } 1799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 1801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 181eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// MemSpaceRegion - A memory region that represents a "memory space"; 1829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// for example, the set of global variables, the stack frame, etc. 1839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemSpaceRegion : public MemRegion { 184a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenekprotected: 18567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 18667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 187a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek MemRegionManager *Mgr; 188a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 18967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek MemSpaceRegion(MemRegionManager *mgr, Kind k = GenericMemSpaceRegionKind) 19067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : MemRegion(k), Mgr(mgr) { 19167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek assert(classof(this)); 19267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 19367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 19467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek MemRegionManager* getMemRegionManager() const { return Mgr; } 1951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 19667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 19767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek bool isBoundable() const { return false; } 19867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 19967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek void Profile(llvm::FoldingSetNodeID &ID) const; 20067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 20167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 20267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek Kind k = R->getKind(); 20367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return k >= BEG_MEMSPACES && k <= END_MEMSPACES; 204a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek } 20567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 20667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 20767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass GlobalsSpaceRegion : public MemSpaceRegion { 20899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 209dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekprotected: 210dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek GlobalsSpaceRegion(MemRegionManager *mgr, Kind k) 211dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek : MemSpaceRegion(mgr, k) {} 212dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekpublic: 213dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek static bool classof(const MemRegion *R) { 214dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek Kind k = R->getKind(); 215dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek return k >= BEG_GLOBAL_MEMSPACES && k <= END_GLOBAL_MEMSPACES; 216dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek } 217dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek}; 218eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 219914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region of the static variables within the current CodeTextRegion 220eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// scope. 221914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// 222eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// Currently, only the static locals are placed there, so we know that these 223eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// variables do not get invalidated by calls to other functions. 224dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekclass StaticGlobalSpaceRegion : public GlobalsSpaceRegion { 22567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 226a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 227dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek const CodeTextRegion *CR; 228dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 229dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek StaticGlobalSpaceRegion(MemRegionManager *mgr, const CodeTextRegion *cr) 230dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek : GlobalsSpaceRegion(mgr, StaticGlobalSpaceRegionKind), CR(cr) {} 231dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 232dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekpublic: 233dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek void Profile(llvm::FoldingSetNodeID &ID) const; 234dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 2359c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 236fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek 237dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek const CodeTextRegion *getCodeRegion() const { return CR; } 238dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 239dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek static bool classof(const MemRegion *R) { 240dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek return R->getKind() == StaticGlobalSpaceRegionKind; 241dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek } 242dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek}; 243eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 244914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region for all the non-static global variables. 245eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// 246eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// This class is further split into subclasses for efficient implementation of 247eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// invalidating a set of related global values as is done in 248eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// RegionStoreManager::invalidateRegions (instead of finding all the dependent 249eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// globals, we invalidate the whole parent region). 250dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekclass NonStaticGlobalSpaceRegion : public GlobalsSpaceRegion { 251dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek friend class MemRegionManager; 252dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 253eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksprotected: 254eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks NonStaticGlobalSpaceRegion(MemRegionManager *mgr, Kind k) 255eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks : GlobalsSpaceRegion(mgr, k) {} 256dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 2579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 258fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek 25967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 260eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks Kind k = R->getKind(); 261eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks return k >= BEG_NON_STATIC_GLOBAL_MEMSPACES && 262eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks k <= END_NON_STATIC_GLOBAL_MEMSPACES; 26367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 26467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 265eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 266914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region containing globals which are defined in system/external 267eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// headers and are considered modifiable by system calls (ex: errno). 268eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksclass GlobalSystemSpaceRegion : public NonStaticGlobalSpaceRegion { 269eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks friend class MemRegionManager; 270eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 271eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalSystemSpaceRegion(MemRegionManager *mgr) 272eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks : NonStaticGlobalSpaceRegion(mgr, GlobalSystemSpaceRegionKind) {} 273eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 274eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zakspublic: 275eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 276eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks void dumpToStream(raw_ostream &os) const; 277eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 278eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks static bool classof(const MemRegion *R) { 279eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks return R->getKind() == GlobalSystemSpaceRegionKind; 280eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks } 281eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks}; 282eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 283914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region containing globals which are considered not to be modified 284eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// or point to data which could be modified as a result of a function call 285eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// (system or internal). Ex: Const global scalars would be modeled as part of 286eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// this region. This region also includes most system globals since they have 287eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// low chance of being modified. 288eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksclass GlobalImmutableSpaceRegion : public NonStaticGlobalSpaceRegion { 289eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks friend class MemRegionManager; 290eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 291eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalImmutableSpaceRegion(MemRegionManager *mgr) 292eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks : NonStaticGlobalSpaceRegion(mgr, GlobalImmutableSpaceRegionKind) {} 293eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 294eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zakspublic: 295eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 296eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks void dumpToStream(raw_ostream &os) const; 297eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 298eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks static bool classof(const MemRegion *R) { 299eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks return R->getKind() == GlobalImmutableSpaceRegionKind; 300eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks } 301eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks}; 302eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 303914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region containing globals which can be modified by calls to 304eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// "internally" defined functions - (for now just) functions other then system 305eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// calls. 306eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksclass GlobalInternalSpaceRegion : public NonStaticGlobalSpaceRegion { 307eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks friend class MemRegionManager; 308eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 309eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalInternalSpaceRegion(MemRegionManager *mgr) 310eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks : NonStaticGlobalSpaceRegion(mgr, GlobalInternalSpaceRegionKind) {} 311eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 312eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zakspublic: 313eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 314eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks void dumpToStream(raw_ostream &os) const; 315eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 316eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks static bool classof(const MemRegion *R) { 317eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks return R->getKind() == GlobalInternalSpaceRegionKind; 318eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks } 319eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks}; 320eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 32167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass HeapSpaceRegion : public MemSpaceRegion { 32299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 32367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 32467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 32567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek HeapSpaceRegion(MemRegionManager *mgr) 32667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : MemSpaceRegion(mgr, HeapSpaceRegionKind) {} 32767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 32836397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 32936397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose void dumpToStream(raw_ostream &os) const; 33036397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 33167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 33267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return R->getKind() == HeapSpaceRegionKind; 33367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 33467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 33567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 3362b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenekclass UnknownSpaceRegion : public MemSpaceRegion { 33799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 3382b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek friend class MemRegionManager; 3392b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek UnknownSpaceRegion(MemRegionManager *mgr) 3402b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek : MemSpaceRegion(mgr, UnknownSpaceRegionKind) {} 3412b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenekpublic: 34236397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 34336397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose void dumpToStream(raw_ostream &os) const; 34436397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 3452b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek static bool classof(const MemRegion *R) { 3462b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek return R->getKind() == UnknownSpaceRegionKind; 3472b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek } 3482b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek}; 3492b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek 35067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackSpaceRegion : public MemSpaceRegion { 35167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate: 35267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackFrameContext *SFC; 3539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 35467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprotected: 35567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StackSpaceRegion(MemRegionManager *mgr, Kind k, const StackFrameContext *sfc) 35667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : MemSpaceRegion(mgr, k), SFC(sfc) { 35767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek assert(classof(this)); 35867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 35941168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek 36067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 36167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackFrameContext *getStackFrame() const { return SFC; } 36267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 36367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek void Profile(llvm::FoldingSetNodeID &ID) const; 36467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 36567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 36667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek Kind k = R->getKind(); 36767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return k >= StackLocalsSpaceRegionKind && 36867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek k <= StackArgumentsSpaceRegionKind; 36967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 37067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 37167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 37267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackLocalsSpaceRegion : public StackSpaceRegion { 37399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 37467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 37567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StackLocalsSpaceRegion(MemRegionManager *mgr, const StackFrameContext *sfc) 37667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : StackSpaceRegion(mgr, StackLocalsSpaceRegionKind, sfc) {} 37767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 37836397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 37936397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose void dumpToStream(raw_ostream &os) const; 38036397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 38167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 38267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return R->getKind() == StackLocalsSpaceRegionKind; 38367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 38467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 38567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 38667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackArgumentsSpaceRegion : public StackSpaceRegion { 38767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate: 38899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 38967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 39067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StackArgumentsSpaceRegion(MemRegionManager *mgr, const StackFrameContext *sfc) 39167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : StackSpaceRegion(mgr, StackArgumentsSpaceRegionKind, sfc) {} 39267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 39336397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 39436397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose void dumpToStream(raw_ostream &os) const; 39536397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 39667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 39767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return R->getKind() == StackArgumentsSpaceRegionKind; 3989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 4009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4017caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 402993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// SubRegion - A region that subsets another larger region. Most regions 403993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// are subclasses of SubRegion. 404993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass SubRegion : public MemRegion { 40599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikieprivate: 40699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 4079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 4081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const MemRegion* superRegion; 409993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek SubRegion(const MemRegion* sReg, Kind k) : MemRegion(k), superRegion(sReg) {} 4109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 4119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* getSuperRegion() const { 4129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return superRegion; 4139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 4141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 41532f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose /// getExtent - Returns the size of the region in bytes. 416c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek virtual DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const { 41732f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose return UnknownVal(); 41832f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose } 41932f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 420a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek MemRegionManager* getMemRegionManager() const; 4211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4225f7c0add1ea1d8e1d2f920d77fd1a7b6160c2d93Anna Zaks virtual bool isSubRegionOf(const MemRegion* R) const; 4231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 42567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return R->getKind() > END_MEMSPACES; 426993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek } 427993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek}; 4281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 42919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===// 43019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// MemRegion subclasses. 4311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump//===----------------------------------------------------------------------===// 432ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 43382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek/// AllocaRegion - A region that represents an untyped blob of bytes created 43482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek/// by a call to 'alloca'. 43582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekclass AllocaRegion : public SubRegion { 43682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek friend class MemRegionManager; 43782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekprotected: 43882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek unsigned Cnt; // Block counter. Used to distinguish different pieces of 43982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek // memory allocated by alloca at the same call site. 4409c378f705405d37f49795d5e915989de774fe11fTed Kremenek const Expr *Ex; 44182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 4429c378f705405d37f49795d5e915989de774fe11fTed Kremenek AllocaRegion(const Expr *ex, unsigned cnt, const MemRegion *superRegion) 44382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek : SubRegion(superRegion, AllocaRegionKind), Cnt(cnt), Ex(ex) {} 4441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 44582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekpublic: 4461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4479c378f705405d37f49795d5e915989de774fe11fTed Kremenek const Expr *getExpr() const { return Ex; } 4489852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu 4499852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu bool isBoundable() const { return true; } 4509852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu 451c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const; 45232f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 45382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 45482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 4559c378f705405d37f49795d5e915989de774fe11fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Expr *Ex, 4567ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek unsigned Cnt, const MemRegion *superRegion); 4571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4589c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 4591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 46082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek static bool classof(const MemRegion* R) { 46182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek return R->getKind() == AllocaRegionKind; 46282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek } 4631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}; 4641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 465993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// TypedRegion - An abstract class representing regions that are typed. 466993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass TypedRegion : public SubRegion { 46799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikiepublic: 46899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 469993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekprotected: 470993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek TypedRegion(const MemRegion* sReg, Kind k) : SubRegion(sReg, k) {} 4711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 472993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekpublic: 4739697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek virtual QualType getLocationType() const = 0; 4749697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek 4759697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek QualType getDesugaredLocationType(ASTContext &Context) const { 4769697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek return getLocationType().getDesugaredType(Context); 4779697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek } 4789697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek 4799697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek bool isBoundable() const { return true; } 4809697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek 4819697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek static bool classof(const MemRegion* R) { 4829697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek unsigned k = R->getKind(); 4839697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek return k >= BEG_TYPED_REGIONS && k <= END_TYPED_REGIONS; 4849697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek } 4859697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek}; 4869697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek 4879697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek/// TypedValueRegion - An abstract class representing regions having a typed value. 4889697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass TypedValueRegion : public TypedRegion { 48999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikiepublic: 49099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 4919697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekprotected: 4929697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek TypedValueRegion(const MemRegion* sReg, Kind k) : TypedRegion(sReg, k) {} 4939697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek 4949697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekpublic: 495018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu virtual QualType getValueType() const = 0; 4961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 497018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu virtual QualType getLocationType() const { 4986eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek // FIXME: We can possibly optimize this later to cache this value. 499a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek QualType T = getValueType(); 500a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek ASTContext &ctx = getContext(); 501a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek if (T->getAs<ObjCObjectType>()) 502a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek return ctx.getObjCObjectPointerType(T); 503a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek return ctx.getPointerType(getValueType()); 5046eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek } 5051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 50649f4e1cbd839da27ff4814b4ea6d85a79f786cbdJohn McCall QualType getDesugaredValueType(ASTContext &Context) const { 507018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType T = getValueType(); 5081ab55e9bb87d98bff1d42c7a0ee502c64755d9f5Douglas Gregor return T.getTypePtrOrNull() ? T.getDesugaredType(Context) : T; 50914553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek } 5101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 511e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const; 512e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose 513993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek static bool classof(const MemRegion* R) { 5149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek unsigned k = R->getKind(); 5159697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek return k >= BEG_TYPED_VALUE_REGIONS && k <= END_TYPED_VALUE_REGIONS; 5169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 5179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 5189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 519ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 520eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass CodeTextRegion : public TypedRegion { 52199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikiepublic: 52299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 523eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekprotected: 524eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek CodeTextRegion(const MemRegion *sreg, Kind k) : TypedRegion(sreg, k) {} 525ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xupublic: 526eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek bool isBoundable() const { return false; } 527eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 528eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek static bool classof(const MemRegion* R) { 529eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek Kind k = R->getKind(); 530eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return k >= FunctionTextRegionKind && k <= BlockTextRegionKind; 531eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek } 532eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek}; 533ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 534eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek/// FunctionTextRegion - A region that represents code texts of function. 535eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass FunctionTextRegion : public CodeTextRegion { 5365fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks const NamedDecl *FD; 537eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekpublic: 5385fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks FunctionTextRegion(const NamedDecl *fd, const MemRegion* sreg) 5395fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks : CodeTextRegion(sreg, FunctionTextRegionKind), FD(fd) { 5405fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks assert(isa<ObjCMethodDecl>(fd) || isa<FunctionDecl>(fd)); 5415fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks } 542eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 543018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getLocationType() const { 5445fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks const ASTContext &Ctx = getContext(); 5455fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks if (const FunctionDecl *D = dyn_cast<FunctionDecl>(FD)) { 5465fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks return Ctx.getPointerType(D->getType()); 5475fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks } 5485fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks 5495fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks assert(isa<ObjCMethodDecl>(FD)); 5505fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks assert(false && "Getting the type of ObjCMethod is not supported yet"); 5515fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks 5525fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks // TODO: We might want to return a different type here (ex: id (*ty)(...)) 5535fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks // depending on how it is used. 5545fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks return QualType(); 555ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu } 5565fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks 5575fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks const NamedDecl *getDecl() const { 558abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek return FD; 55972e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek } 560eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 5619c378f705405d37f49795d5e915989de774fe11fTed Kremenek virtual void dumpToStream(raw_ostream &os) const; 562eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 563ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const; 564eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 5655fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks static void ProfileRegion(llvm::FoldingSetNodeID& ID, const NamedDecl *FD, 566abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek const MemRegion*); 567eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 568ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu static bool classof(const MemRegion* R) { 569eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return R->getKind() == FunctionTextRegionKind; 570eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek } 571eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek}; 572eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 573eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 574eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek/// BlockTextRegion - A region that represents code texts of blocks (closures). 5750a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// Blocks are represented with two kinds of regions. BlockTextRegions 5760a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// represent the "code", while BlockDataRegions represent instances of blocks, 5770a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// which correspond to "code+data". The distinction is important, because 5780a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// like a closure a block captures the values of externally referenced 5790a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// variables. 580eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass BlockTextRegion : public CodeTextRegion { 58167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 58267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 583eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek const BlockDecl *BD; 5841d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContext *AC; 585eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek CanQualType locTy; 58667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 58767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BlockTextRegion(const BlockDecl *bd, CanQualType lTy, 5881d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContext *ac, const MemRegion* sreg) 58967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : CodeTextRegion(sreg, BlockTextRegionKind), BD(bd), AC(ac), locTy(lTy) {} 59067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 59167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 592018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getLocationType() const { 593eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return locTy; 594eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek } 595eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 596eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek const BlockDecl *getDecl() const { 597eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return BD; 598eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek } 59967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 6001d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContext *getAnalysisDeclContext() const { return AC; } 601eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 6029c378f705405d37f49795d5e915989de774fe11fTed Kremenek virtual void dumpToStream(raw_ostream &os) const; 603eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 604eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 605eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 606eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const BlockDecl *BD, 6071d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek CanQualType, const AnalysisDeclContext*, 60867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const MemRegion*); 609eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 610eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek static bool classof(const MemRegion* R) { 611eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return R->getKind() == BlockTextRegionKind; 612ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu } 613ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu}; 6140a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 6150a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// BlockDataRegion - A region that represents a block instance. 6160a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// Blocks are represented with two kinds of regions. BlockTextRegions 6170a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// represent the "code", while BlockDataRegions represent instances of blocks, 6180a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// which correspond to "code+data". The distinction is important, because 6190a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// like a closure a block captures the values of externally referenced 6200a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// variables. 6218ecf59afbab1dbf184dc4c0c47e7213cbd32ba0aJordan Roseclass BlockDataRegion : public TypedRegion { 62267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 6230a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek const BlockTextRegion *BC; 62467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *LC; // Can be null */ 6254240096011a187807058f887eb81df750ffa17feTed Kremenek void *ReferencedVars; 62685d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek void *OriginalVars; 62767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 62867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BlockDataRegion(const BlockTextRegion *bc, const LocationContext *lc, 6290a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek const MemRegion *sreg) 6308ecf59afbab1dbf184dc4c0c47e7213cbd32ba0aJordan Rose : TypedRegion(sreg, BlockDataRegionKind), BC(bc), LC(lc), 63185d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek ReferencedVars(0), OriginalVars(0) {} 6320a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 63385d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenekpublic: 6340a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek const BlockTextRegion *getCodeRegion() const { return BC; } 6354240096011a187807058f887eb81df750ffa17feTed Kremenek 636d02e83a548359df978f40cc1a52ffd78b7ef371bTed Kremenek const BlockDecl *getDecl() const { return BC->getDecl(); } 6378ecf59afbab1dbf184dc4c0c47e7213cbd32ba0aJordan Rose 6388ecf59afbab1dbf184dc4c0c47e7213cbd32ba0aJordan Rose QualType getLocationType() const { return BC->getLocationType(); } 639d02e83a548359df978f40cc1a52ffd78b7ef371bTed Kremenek 64081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek class referenced_vars_iterator { 64181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek const MemRegion * const *R; 64285d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek const MemRegion * const *OriginalR; 64381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek public: 64485d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek explicit referenced_vars_iterator(const MemRegion * const *r, 64585d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek const MemRegion * const *originalR) 64685d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek : R(r), OriginalR(originalR) {} 64785d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek 648e3ce2c10c3f6ae7b26700d758de909deab190d42Ted Kremenek const VarRegion *getCapturedRegion() const { 64981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return cast<VarRegion>(*R); 65081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 651e3ce2c10c3f6ae7b26700d758de909deab190d42Ted Kremenek const VarRegion *getOriginalRegion() const { 652e3ce2c10c3f6ae7b26700d758de909deab190d42Ted Kremenek return cast<VarRegion>(*OriginalR); 653e3ce2c10c3f6ae7b26700d758de909deab190d42Ted Kremenek } 654e3ce2c10c3f6ae7b26700d758de909deab190d42Ted Kremenek 65581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek bool operator==(const referenced_vars_iterator &I) const { 65641f3f3a4792f46787632fdb94f952f6b3ce3f4aeJordan Rose assert((R == 0) == (I.R == 0)); 65781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return I.R == R; 65881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 65981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek bool operator!=(const referenced_vars_iterator &I) const { 66041f3f3a4792f46787632fdb94f952f6b3ce3f4aeJordan Rose assert((R == 0) == (I.R == 0)); 66181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return I.R != R; 66281cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 6639c378f705405d37f49795d5e915989de774fe11fTed Kremenek referenced_vars_iterator &operator++() { 66481cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek ++R; 66585d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek ++OriginalR; 66681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return *this; 66781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 66881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek }; 6695846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek 6705846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek /// Return the original region for a captured region, if 6715846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek /// one exists. 6725846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek const VarRegion *getOriginalRegion(const VarRegion *VR) const; 67381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek 6744240096011a187807058f887eb81df750ffa17feTed Kremenek referenced_vars_iterator referenced_vars_begin() const; 6754240096011a187807058f887eb81df750ffa17feTed Kremenek referenced_vars_iterator referenced_vars_end() const; 6760a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 6779c378f705405d37f49795d5e915989de774fe11fTed Kremenek virtual void dumpToStream(raw_ostream &os) const; 6780a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 6790a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 6800a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 68167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID&, const BlockTextRegion *, 68267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *, const MemRegion *); 6830a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 6840a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek static bool classof(const MemRegion* R) { 6850a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek return R->getKind() == BlockDataRegionKind; 6860a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek } 6874240096011a187807058f887eb81df750ffa17feTed Kremenekprivate: 6884240096011a187807058f887eb81df750ffa17feTed Kremenek void LazyInitializeReferencedVars(); 68924570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek std::pair<const VarRegion *, const VarRegion *> 69024570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek getCaptureRegions(const VarDecl *VD); 6910a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek}; 692ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 693026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// SymbolicRegion - A special, "non-concrete" region. Unlike other region 694026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// clases, SymbolicRegion represents a region that serves as an alias for 695026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// either a real region, a NULL pointer, etc. It essentially is used to 696026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// map the concept of symbolic values into the domain of regions. Symbolic 697026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// regions do not need to be typed. 698e8e86482da4c1872673bbb9c237649229d19793bTed Kremenekclass SymbolicRegion : public SubRegion { 699026c66395b88a09437319139a43b090093f7e1ddZhongxing Xuprotected: 700026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu const SymbolRef sym; 701026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 702026c66395b88a09437319139a43b090093f7e1ddZhongxing Xupublic: 7031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SymbolicRegion(const SymbolRef s, const MemRegion* sreg) 704e8e86482da4c1872673bbb9c237649229d19793bTed Kremenek : SubRegion(sreg, SymbolicRegionKind), sym(s) {} 7051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 706026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu SymbolRef getSymbol() const { 707026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu return sym; 708026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu } 709026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 7109852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu bool isBoundable() const { return true; } 7119852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu 712c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const; 71332f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 714026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const; 715026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 716250101353b711a409b075f1bc11070dddec7100bTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, 717250101353b711a409b075f1bc11070dddec7100bTed Kremenek SymbolRef sym, 718250101353b711a409b075f1bc11070dddec7100bTed Kremenek const MemRegion* superRegion); 7191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7209c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 7211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 722026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu static bool classof(const MemRegion* R) { 723026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu return R->getKind() == SymbolicRegionKind; 724026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu } 7251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}; 726026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 727e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu/// StringRegion - Region associated with a StringLiteral. 7289697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass StringRegion : public TypedValueRegion { 729e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu friend class MemRegionManager; 730e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const StringLiteral* Str; 731e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuprotected: 732e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 733250101353b711a409b075f1bc11070dddec7100bTed Kremenek StringRegion(const StringLiteral* str, const MemRegion* sreg) 7349697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sreg, StringRegionKind), Str(str) {} 735e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 736e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID& ID, 737e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const StringLiteral* Str, 738e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const MemRegion* superRegion); 739e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 740e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xupublic: 7416613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu 7426613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu const StringLiteral* getStringLiteral() const { return Str; } 7431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 744018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 745ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu return Str->getType(); 746ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu } 747e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 748c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const; 74932f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 7500a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu bool isBoundable() const { return false; } 7510a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu 752e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const { 753e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu ProfileRegion(ID, Str, superRegion); 754e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 755e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 7569c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 757cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu 758e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static bool classof(const MemRegion* R) { 759e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu return R->getKind() == StringRegionKind; 760e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 761e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu}; 7624c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7634c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek/// The region associated with an ObjCStringLiteral. 7644c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekclass ObjCStringRegion : public TypedValueRegion { 7654c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek friend class MemRegionManager; 7664c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek const ObjCStringLiteral* Str; 7674c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekprotected: 7684c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7694c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek ObjCStringRegion(const ObjCStringLiteral* str, const MemRegion* sreg) 7704c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek : TypedValueRegion(sreg, ObjCStringRegionKind), Str(str) {} 7714c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7724c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, 7734c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek const ObjCStringLiteral* Str, 7744c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek const MemRegion* superRegion); 7754c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7764c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekpublic: 7774c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7784c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek const ObjCStringLiteral* getObjCStringLiteral() const { return Str; } 7794c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7804c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek QualType getValueType() const { 7814c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek return Str->getType(); 7824c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek } 7834c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7844c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek bool isBoundable() const { return false; } 7854c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7864c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek void Profile(llvm::FoldingSetNodeID& ID) const { 7874c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek ProfileRegion(ID, Str, superRegion); 7884c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek } 7894c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7904c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek void dumpToStream(raw_ostream &os) const; 7914c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7924c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek static bool classof(const MemRegion* R) { 7934c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek return R->getKind() == ObjCStringRegionKind; 7944c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek } 7954c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek}; 796e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 797329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// CompoundLiteralRegion - A memory region representing a compound literal. 798329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// Compound literals are essentially temporaries that are stack allocated 799329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// or in the global constant pool. 8009697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CompoundLiteralRegion : public TypedValueRegion { 801329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekprivate: 802329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek friend class MemRegionManager; 8039c378f705405d37f49795d5e915989de774fe11fTed Kremenek const CompoundLiteralExpr *CL; 804329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 8059c378f705405d37f49795d5e915989de774fe11fTed Kremenek CompoundLiteralRegion(const CompoundLiteralExpr *cl, const MemRegion* sReg) 8069697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sReg, CompoundLiteralRegionKind), CL(cl) {} 8071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 808329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, 8099c378f705405d37f49795d5e915989de774fe11fTed Kremenek const CompoundLiteralExpr *CL, 810329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek const MemRegion* superRegion); 811329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekpublic: 812018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 813018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu return CL->getType(); 81477cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu } 8150a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu 8169a08fee80a34938b8c11c7166e009a89ced4c2b4Zhongxing Xu bool isBoundable() const { return !CL->isFileScope(); } 8179a08fee80a34938b8c11c7166e009a89ced4c2b4Zhongxing Xu 818329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 8191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8209c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 821329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 8229c378f705405d37f49795d5e915989de774fe11fTed Kremenek const CompoundLiteralExpr *getLiteralExpr() const { return CL; } 8231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 824329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek static bool classof(const MemRegion* R) { 825329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek return R->getKind() == CompoundLiteralRegionKind; 826329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek } 827329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek}; 828178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 8299697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass DeclRegion : public TypedValueRegion { 8309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 8319c378f705405d37f49795d5e915989de774fe11fTed Kremenek const Decl *D; 8329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 8339c378f705405d37f49795d5e915989de774fe11fTed Kremenek DeclRegion(const Decl *d, const MemRegion* sReg, Kind k) 8349697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sReg, k), D(d) {} 8359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 8369c378f705405d37f49795d5e915989de774fe11fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl *D, 8379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion, Kind k); 8381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 839bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xupublic: 8409c378f705405d37f49795d5e915989de774fe11fTed Kremenek const Decl *getDecl() const { return D; } 8419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 8421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 843e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static bool classof(const MemRegion* R) { 844e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu unsigned k = R->getKind(); 84567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return k >= BEG_DECL_REGIONS && k <= END_DECL_REGIONS; 846e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 8479e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 8481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass VarRegion : public DeclRegion { 8509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 851d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek 852d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek // Constructors and private methods. 8539c378f705405d37f49795d5e915989de774fe11fTed Kremenek VarRegion(const VarDecl *vd, const MemRegion* sReg) 85467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : DeclRegion(vd, sReg, VarRegionKind) {} 8559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 8569c378f705405d37f49795d5e915989de774fe11fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const VarDecl *VD, 857d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek const MemRegion *superRegion) { 8589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, VD, superRegion, VarRegionKind); 8599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 8601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 861d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 8621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic: 864d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek const VarDecl *getDecl() const { return cast<VarDecl>(D); } 8651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8665348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek const StackFrameContext *getStackFrame() const; 8675348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek 868018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 8696eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek // FIXME: We can cache this if needed. 870018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu return getDecl()->getType(); 8711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 8721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8739c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 8741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 8769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == VarRegionKind; 8771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 8783d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks 879919e8a1c6698bfa6848571d366430126bced727dJordan Rose bool canPrintPretty() const; 8809e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks 8819e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks void printPrettyNoQuotes(raw_ostream &os) const; 8829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 883de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 884de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek/// CXXThisRegion - Represents the region for the implicit 'this' parameter 885de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek/// in a call to a C++ method. This region doesn't represent the object 886de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek/// referred to by 'this', but rather 'this' itself. 8879697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CXXThisRegion : public TypedValueRegion { 888de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek friend class MemRegionManager; 889de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek CXXThisRegion(const PointerType *thisPointerTy, 890de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const MemRegion *sReg) 8919697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sReg, CXXThisRegionKind), ThisPointerTy(thisPointerTy) {} 892de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 893de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID &ID, 894de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const PointerType *PT, 895de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const MemRegion *sReg); 896de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 897de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek void Profile(llvm::FoldingSetNodeID &ID) const; 898de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 899de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekpublic: 900018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 901de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek return QualType(ThisPointerTy, 0); 902de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek } 9037caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 9049c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 905de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 906de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek static bool classof(const MemRegion* R) { 907de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek return R->getKind() == CXXThisRegionKind; 908de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek } 909de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 910de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekprivate: 911de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const PointerType *ThisPointerTy; 912de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek}; 9139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 9149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass FieldRegion : public DeclRegion { 9159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 9169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 9179c378f705405d37f49795d5e915989de774fe11fTed Kremenek FieldRegion(const FieldDecl *fd, const MemRegion* sReg) 9189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(fd, sReg, FieldRegionKind) {} 9199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 9204bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenekpublic: 9219c378f705405d37f49795d5e915989de774fe11fTed Kremenek const FieldDecl *getDecl() const { return cast<FieldDecl>(D); } 9221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 923018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 9246eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek // FIXME: We can cache this if needed. 925018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu return getDecl()->getType(); 9261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 9274bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek 928c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const; 92932f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 9309c378f705405d37f49795d5e915989de774fe11fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const FieldDecl *FD, 9316304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek const MemRegion* superRegion) { 9329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, FD, superRegion, FieldRegionKind); 9339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 9341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 9369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == FieldRegionKind; 9379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 9383d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks 9393d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks void dumpToStream(raw_ostream &os) const; 940919e8a1c6698bfa6848571d366430126bced727dJordan Rose 941919e8a1c6698bfa6848571d366430126bced727dJordan Rose bool canPrintPretty() const; 942919e8a1c6698bfa6848571d366430126bced727dJordan Rose void printPretty(raw_ostream &os) const; 9439e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks void printPrettyNoQuotes(raw_ostream &os) const; 9449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 9451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9469e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass ObjCIvarRegion : public DeclRegion { 9471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 9491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 950c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer ObjCIvarRegion(const ObjCIvarDecl *ivd, const MemRegion* sReg); 9519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 9529c378f705405d37f49795d5e915989de774fe11fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const ObjCIvarDecl *ivd, 953c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer const MemRegion* superRegion); 9541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 956c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer const ObjCIvarDecl *getDecl() const; 957c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer QualType getValueType() const; 9581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 95943b82b823a6113fdbee54243b280db9c55ef72cbTed Kremenek bool canPrintPretty() const; 9609e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks void printPrettyNoQuotes(raw_ostream &os) const; 96143b82b823a6113fdbee54243b280db9c55ef72cbTed Kremenek 9629c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 9631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 9659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == ObjCIvarRegionKind; 9669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 9679e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 9687caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu//===----------------------------------------------------------------------===// 969fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner// Auxiliary data classes for use with MemRegions. 9707caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu//===----------------------------------------------------------------------===// 9717caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 9727caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuclass ElementRegion; 9737caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 9747caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuclass RegionRawOffset { 9757caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuprivate: 9767caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu friend class ElementRegion; 9777caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 9787caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu const MemRegion *Region; 9799ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck CharUnits Offset; 9807caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 9819ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck RegionRawOffset(const MemRegion* reg, CharUnits offset = CharUnits::Zero()) 9827caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu : Region(reg), Offset(offset) {} 9837caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 9847caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xupublic: 9857caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu // FIXME: Eventually support symbolic offsets. 9869ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck CharUnits getOffset() const { return Offset; } 9877caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu const MemRegion *getRegion() const { return Region; } 9887caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 9899c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 9907caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu void dump() const; 9917caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu}; 992511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 9931437425a62dbf7bdb0a855d3ed3b05ed2019ec1eAnna Zaks/// \brief ElementRegin is used to represent both array elements and casts. 9949697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass ElementRegion : public TypedValueRegion { 995511191ce8920160525611be2be754c32a0724c3eZhongxing Xu friend class MemRegionManager; 996511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 997f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek QualType ElementType; 99802282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek NonLoc Index; 999511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 100002282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek ElementRegion(QualType elementType, NonLoc Idx, const MemRegion* sReg) 10019697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sReg, ElementRegionKind), 1002f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek ElementType(elementType), Index(Idx) { 10035251abea41b446c26e3239c8dd6c7edea6fc335dDavid Blaikie assert((!Idx.getAs<nonloc::ConcreteInt>() || 10045251abea41b446c26e3239c8dd6c7edea6fc335dDavid Blaikie Idx.castAs<nonloc::ConcreteInt>().getValue().isSigned()) && 100543b28d07019bc78447ecbbb721526de4ffd83f20Chris Lattner "The index must be signed"); 10060395b5d4987fe5baa818015e9d294c128619e4ecZhongxing Xu } 10071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1008f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, QualType elementType, 1009f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek SVal Idx, const MemRegion* superRegion); 1010511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 1011511191ce8920160525611be2be754c32a0724c3eZhongxing Xupublic: 1012511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 101302282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek NonLoc getIndex() const { return Index; } 10146e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu 1015018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 1016f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek return ElementType; 1017f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek } 10181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1019f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek QualType getElementType() const { 1020f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek return ElementType; 1021abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek } 10227caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu /// Compute the offset within the array. The array might also be a subobject. 10237caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu RegionRawOffset getAsArrayOffset() const; 10241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 10259c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 1026b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 1027511191ce8920160525611be2be754c32a0724c3eZhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const; 1028511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 1029511191ce8920160525611be2be754c32a0724c3eZhongxing Xu static bool classof(const MemRegion* R) { 1030511191ce8920160525611be2be754c32a0724c3eZhongxing Xu return R->getKind() == ElementRegionKind; 1031511191ce8920160525611be2be754c32a0724c3eZhongxing Xu } 1032511191ce8920160525611be2be754c32a0724c3eZhongxing Xu}; 103319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 1034bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu// C++ temporary object associated with an expression. 10359697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CXXTempObjectRegion : public TypedValueRegion { 1036bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu friend class MemRegionManager; 1037bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 1038bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu Expr const *Ex; 1039bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 104002fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu CXXTempObjectRegion(Expr const *E, MemRegion const *sReg) 10419697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sReg, CXXTempObjectRegionKind), Ex(E) {} 1042bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 1043bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID &ID, 1044bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu Expr const *E, const MemRegion *sReg); 1045bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 1046bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xupublic: 1047782f63ecd124f9384f988dc7e0cf4ae1540c15f6Jeffrey Yasskin const Expr *getExpr() const { return Ex; } 1048782f63ecd124f9384f988dc7e0cf4ae1540c15f6Jeffrey Yasskin 1049018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 1050bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu return Ex->getType(); 1051bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu } 1052bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 10539c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 1054e1aeb13251a4858724d2b7ad1925d25076f23d08Zhongxing Xu 1055bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu void Profile(llvm::FoldingSetNodeID &ID) const; 1056bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 1057bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu static bool classof(const MemRegion* R) { 105802fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu return R->getKind() == CXXTempObjectRegionKind; 1059bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu } 1060bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu}; 1061bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 10624fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu// CXXBaseObjectRegion represents a base object within a C++ object. It is 10634fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu// identified by the base class declaration and the region of its parent object. 10649697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CXXBaseObjectRegion : public TypedValueRegion { 10654fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu friend class MemRegionManager; 10664fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 10674411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose llvm::PointerIntPair<const CXXRecordDecl *, 1, bool> Data; 10684fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 10694411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose CXXBaseObjectRegion(const CXXRecordDecl *RD, bool IsVirtual, 10704411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose const MemRegion *SReg) 10714411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose : TypedValueRegion(SReg, CXXBaseObjectRegionKind), Data(RD, IsVirtual) {} 10724fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 10734411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose static void ProfileRegion(llvm::FoldingSetNodeID &ID, const CXXRecordDecl *RD, 10744411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose bool IsVirtual, const MemRegion *SReg); 10754fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 10764fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xupublic: 10774411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose const CXXRecordDecl *getDecl() const { return Data.getPointer(); } 10784411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose bool isVirtual() const { return Data.getInt(); } 1079d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu 10804fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu QualType getValueType() const; 10814fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 10829c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 10834fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 10844fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu void Profile(llvm::FoldingSetNodeID &ID) const; 10854fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 10864fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu static bool classof(const MemRegion *region) { 10874fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu return region->getKind() == CXXBaseObjectRegionKind; 10884fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu } 10894fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu}; 10904fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 1091ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenektemplate<typename RegionTy> 1092ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenekconst RegionTy* MemRegion::getAs() const { 1093f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek if (const RegionTy* RT = dyn_cast<RegionTy>(this)) 1094f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek return RT; 10951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1096f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek return NULL; 1097ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek} 1098511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 10999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 11009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager - Factory object for creating regions. 11019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 11029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 11039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager { 1104a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek ASTContext &C; 11059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek llvm::BumpPtrAllocator& A; 11069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek llvm::FoldingSet<MemRegion> Regions; 11071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1108eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalInternalSpaceRegion *InternalGlobals; 1109eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalSystemSpaceRegion *SystemGlobals; 1110eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalImmutableSpaceRegion *ImmutableGlobals; 1111eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 11122b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek 1113c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu llvm::DenseMap<const StackFrameContext *, StackLocalsSpaceRegion *> 1114c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu StackLocalsSpaceRegions; 1115c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu llvm::DenseMap<const StackFrameContext *, StackArgumentsSpaceRegion *> 1116c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu StackArgumentsSpaceRegions; 1117dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek llvm::DenseMap<const CodeTextRegion *, StaticGlobalSpaceRegion *> 1118dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek StaticsGlobalSpaceRegions; 11192b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek 112067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek HeapSpaceRegion *heap; 11212b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek UnknownSpaceRegion *unknown; 1122d05552a21377f493c882298c59e8829040b01d34Ted Kremenek MemSpaceRegion *code; 1123dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 11249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 1125a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek MemRegionManager(ASTContext &c, llvm::BumpPtrAllocator& a) 1126eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks : C(c), A(a), InternalGlobals(0), SystemGlobals(0), ImmutableGlobals(0), 1127eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks heap(0), unknown(0), code(0) {} 11281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 11294240096011a187807058f887eb81df750ffa17feTed Kremenek ~MemRegionManager(); 11301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1131a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek ASTContext &getContext() { return C; } 11324240096011a187807058f887eb81df750ffa17feTed Kremenek 11334240096011a187807058f887eb81df750ffa17feTed Kremenek llvm::BumpPtrAllocator &getAllocator() { return A; } 11341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 113567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// getStackLocalsRegion - Retrieve the memory region associated with the 113667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// specified stack frame. 113767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackLocalsSpaceRegion * 113867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek getStackLocalsRegion(const StackFrameContext *STC); 1139d05552a21377f493c882298c59e8829040b01d34Ted Kremenek 1140d05552a21377f493c882298c59e8829040b01d34Ted Kremenek /// getStackArgumentsRegion - Retrieve the memory region associated with 114167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// function/method arguments of the specified stack frame. 114267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackArgumentsSpaceRegion * 114367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek getStackArgumentsRegion(const StackFrameContext *STC); 11441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 11459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getGlobalsRegion - Retrieve the memory region associated with 1146dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek /// global variables. 1147eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks const GlobalsSpaceRegion *getGlobalsRegion( 1148eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks MemRegion::Kind K = MemRegion::GlobalInternalSpaceRegionKind, 1149eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks const CodeTextRegion *R = 0); 11501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 11519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getHeapRegion - Retrieve the memory region associated with the 11529e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// generic "heap". 115367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const HeapSpaceRegion *getHeapRegion(); 1154178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 1155178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu /// getUnknownRegion - Retrieve the memory region associated with unknown 1156178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu /// memory space. 1157b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemSpaceRegion *getUnknownRegion(); 1158c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu 1159b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemSpaceRegion *getCodeRegion(); 1160ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 11617090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek /// getAllocaRegion - Retrieve a region associated with a call to alloca(). 11629c378f705405d37f49795d5e915989de774fe11fTed Kremenek const AllocaRegion *getAllocaRegion(const Expr *Ex, unsigned Cnt, 116367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *LC); 11641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1165329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek /// getCompoundLiteralRegion - Retrieve the region associated with a 1166329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek /// given CompoundLiteral. 1167b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const CompoundLiteralRegion* 11689c378f705405d37f49795d5e915989de774fe11fTed Kremenek getCompoundLiteralRegion(const CompoundLiteralExpr *CL, 116967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *LC); 1170de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 1171fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner /// getCXXThisRegion - Retrieve the [artificial] region associated with the 1172de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek /// parameter 'this'. 1173de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const CXXThisRegion *getCXXThisRegion(QualType thisPointerTy, 1174de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const LocationContext *LC); 11751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1176e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks /// \brief Retrieve or create a "symbolic" memory region. 1177e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks const SymbolicRegion* getSymbolicRegion(SymbolRef Sym); 1178e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks 1179e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks /// \brief Return a unique symbolic region belonging to heap memory space. 1180e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks const SymbolicRegion *getSymbolicHeapRegion(SymbolRef sym); 1181e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 11824c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek const StringRegion *getStringRegion(const StringLiteral* Str); 11834c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 11844c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek const ObjCStringRegion *getObjCStringRegion(const ObjCStringLiteral *Str); 1185e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 11869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getVarRegion - Retrieve or create the memory region associated with 1187d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek /// a specified VarDecl and LocationContext. 1188b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const VarRegion* getVarRegion(const VarDecl *D, const LocationContext *LC); 11891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 119067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// getVarRegion - Retrieve or create the memory region associated with 119167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// a specified VarDecl and super region. 119267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const VarRegion* getVarRegion(const VarDecl *D, const MemRegion *superR); 119367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 1194f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek /// getElementRegion - Retrieve the memory region associated with the 1195f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek /// associated element type, index, and super region. 119602282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek const ElementRegion *getElementRegion(QualType elementType, NonLoc Idx, 1197856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu const MemRegion *superRegion, 1198856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu ASTContext &Ctx); 11991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1200b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const ElementRegion *getElementRegionWithSuper(const ElementRegion *ER, 1201856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu const MemRegion *superRegion) { 1202a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek return getElementRegion(ER->getElementType(), ER->getIndex(), 1203a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek superRegion, ER->getContext()); 1204a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek } 1205511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 12069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getFieldRegion - Retrieve or create the memory region associated with 12079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a specified FieldDecl. 'superRegion' corresponds to the containing 12089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// memory region (which typically represents the memory representing 12099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a structure or class). 12109c378f705405d37f49795d5e915989de774fe11fTed Kremenek const FieldRegion *getFieldRegion(const FieldDecl *fd, 1211b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemRegion* superRegion); 12121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1213b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const FieldRegion *getFieldRegionWithSuper(const FieldRegion *FR, 1214b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemRegion *superRegion) { 1215a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek return getFieldRegion(FR->getDecl(), superRegion); 1216a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek } 12171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 12189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getObjCIvarRegion - Retrieve or create the memory region associated with 12199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a specified Objective-c instance variable. 'superRegion' corresponds 12209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// to the containing region (which typically represents the Objective-C 12219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// object). 12229c378f705405d37f49795d5e915989de774fe11fTed Kremenek const ObjCIvarRegion *getObjCIvarRegion(const ObjCIvarDecl *ivd, 1223b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemRegion* superRegion); 12241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 122502fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu const CXXTempObjectRegion *getCXXTempObjectRegion(Expr const *Ex, 122602fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu LocationContext const *LC); 1227bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 12284411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose /// Create a CXXBaseObjectRegion with the given base class for region 12294411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose /// \p Super. 12304411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose /// 12314411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose /// The type of \p Super is assumed be a class deriving from \p BaseClass. 12324411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose const CXXBaseObjectRegion * 12334411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose getCXXBaseObjectRegion(const CXXRecordDecl *BaseClass, const MemRegion *Super, 12344411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose bool IsVirtual); 12354fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 1236d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu /// Create a CXXBaseObjectRegion with the same CXXRecordDecl but a different 1237d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu /// super region. 1238d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu const CXXBaseObjectRegion * 1239d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu getCXXBaseObjectRegionWithSuper(const CXXBaseObjectRegion *baseReg, 1240d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu const MemRegion *superRegion) { 12414411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose return getCXXBaseObjectRegion(baseReg->getDecl(), superRegion, 12424411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose baseReg->isVirtual()); 1243d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu } 1244d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu 12455fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks const FunctionTextRegion *getFunctionTextRegion(const NamedDecl *FD); 1246b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const BlockTextRegion *getBlockTextRegion(const BlockDecl *BD, 124767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek CanQualType locTy, 12481d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContext *AC); 124967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 125067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// getBlockDataRegion - Get the memory region associated with an instance 125167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// of a block. Unlike many other MemRegions, the LocationContext* 125267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// argument is allowed to be NULL for cases where we have no known 125367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// context. 1254b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const BlockDataRegion *getBlockDataRegion(const BlockTextRegion *bc, 125567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *lc = NULL); 12561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1257bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenekprivate: 1258250101353b711a409b075f1bc11070dddec7100bTed Kremenek template <typename RegionTy, typename A1> 1259250101353b711a409b075f1bc11070dddec7100bTed Kremenek RegionTy* getRegion(const A1 a1); 12601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 12616304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek template <typename RegionTy, typename A1> 1262eeea45611d45238c34474c183cee96d47ae79e24Ted Kremenek RegionTy* getSubRegion(const A1 a1, const MemRegion* superRegion); 12631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 12647ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek template <typename RegionTy, typename A1, typename A2> 12657ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek RegionTy* getRegion(const A1 a1, const A2 a2); 1266dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 12670a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek template <typename RegionTy, typename A1, typename A2> 12680a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek RegionTy* getSubRegion(const A1 a1, const A2 a2, 12690a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek const MemRegion* superRegion); 12700a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 127167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek template <typename RegionTy, typename A1, typename A2, typename A3> 127267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek RegionTy* getSubRegion(const A1 a1, const A2 a2, const A3 a3, 127367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const MemRegion* superRegion); 127467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 127567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek template <typename REG> 127667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const REG* LazyAllocate(REG*& region); 127767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 127867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek template <typename REG, typename ARG> 127967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const REG* LazyAllocate(REG*& region, ARG a); 1280ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek}; 12811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1282250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 1283a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek// Out-of-line member definitions. 1284250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 1285250101353b711a409b075f1bc11070dddec7100bTed Kremenek 12869c378f705405d37f49795d5e915989de774fe11fTed Kremenekinline ASTContext &MemRegion::getContext() const { 1287a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek return getMemRegionManager()->getContext(); 1288a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek} 1289eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 12905a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis} // end GR namespace 12915a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis 1292be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end clang namespace 12939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1294250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 1295250101353b711a409b075f1bc11070dddec7100bTed Kremenek// Pretty-printing regions. 1296250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 1297250101353b711a409b075f1bc11070dddec7100bTed Kremenek 1298be91224894e1501133e224934285ba6440bf5b59Ted Kremeneknamespace llvm { 12999c378f705405d37f49795d5e915989de774fe11fTed Kremenekstatic inline raw_ostream &operator<<(raw_ostream &os, 13009ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremenek const clang::ento::MemRegion* R) { 13018800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek R->dumpToStream(os); 13028800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek return os; 1303be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} 1304be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end llvm namespace 13059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 13069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#endif 1307