MemRegion.h revision 1437425a62dbf7bdb0a855d3ed3b05ed2019ec1e
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 199ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck#include "clang/AST/CharUnits.h" 20993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek#include "clang/AST/Decl.h" 21993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek#include "clang/AST/DeclObjC.h" 22d47d3b0cfeb7e8564ff77f48130fe63282b6d127Chris Lattner#include "clang/Basic/LLVM.h" 239b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenek#include "clang/StaticAnalyzer/Core/PathSensitive/SVals.h" 249c1845dbed9817520f5a7db8bd80a560c6c6ae6bArgyrios Kyrtzidis#include "llvm/Support/ErrorHandling.h" 259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/ADT/FoldingSet.h" 269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include <string> 279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 285e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramernamespace llvm { 295e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramerclass BumpPtrAllocator; 305e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramer} 319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremeneknamespace clang { 331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenekclass LocationContext; 3567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackFrameContext; 365a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis 379ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremeneknamespace ento { 385a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis 395a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidisclass MemRegionManager; 405a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidisclass MemSpaceRegion; 41c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenekclass SValBuilder; 424240096011a187807058f887eb81df750ffa17feTed Kremenekclass VarRegion; 43dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekclass CodeTextRegion; 441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 45e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu/// Represent a region's offset within the top level base region. 46e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xuclass RegionOffset { 47e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu /// The base region. 48e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu const MemRegion *R; 49e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu 50e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu /// The bit offset within the base region. It shouldn't be negative. 51e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu int64_t Offset; 52e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu 53e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xupublic: 54e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu RegionOffset(const MemRegion *r) : R(r), Offset(0) {} 55e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu RegionOffset(const MemRegion *r, int64_t off) : R(r), Offset(off) {} 56e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu 57e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu const MemRegion *getRegion() const { return R; } 58e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu int64_t getOffset() const { return Offset; } 59e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu}; 60e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu 6119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===// 6219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// Base region classes. 6319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===// 641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemRegion - The root abstract class for all memory regions. 669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegion : public llvm::FoldingSetNode { 674240096011a187807058f887eb81df750ffa17feTed Kremenek friend class MemRegionManager; 689e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 6967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek enum Kind { 7067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek // Memory spaces. 71dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek GenericMemSpaceRegionKind, 7267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StackLocalsSpaceRegionKind, 7367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StackArgumentsSpaceRegionKind, 7467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek HeapSpaceRegionKind, 752b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek UnknownSpaceRegionKind, 76dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek StaticGlobalSpaceRegionKind, 77eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalInternalSpaceRegionKind, 78eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalSystemSpaceRegionKind, 79eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalImmutableSpaceRegionKind, 80eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks BEG_NON_STATIC_GLOBAL_MEMSPACES = GlobalInternalSpaceRegionKind, 81eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks END_NON_STATIC_GLOBAL_MEMSPACES = GlobalImmutableSpaceRegionKind, 82eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks BEG_GLOBAL_MEMSPACES = StaticGlobalSpaceRegionKind, 83eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks END_GLOBAL_MEMSPACES = GlobalImmutableSpaceRegionKind, 84dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek BEG_MEMSPACES = GenericMemSpaceRegionKind, 85eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks END_MEMSPACES = GlobalImmutableSpaceRegionKind, 8667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek // Untyped regions. 8767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek SymbolicRegionKind, 8867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek AllocaRegionKind, 899697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek BlockDataRegionKind, 9067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek // Typed regions. 9167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BEG_TYPED_REGIONS, 9267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek FunctionTextRegionKind = BEG_TYPED_REGIONS, 9367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BlockTextRegionKind, 949697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek BEG_TYPED_VALUE_REGIONS, 959697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek CompoundLiteralRegionKind = BEG_TYPED_VALUE_REGIONS, 96de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek CXXThisRegionKind, 9767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StringRegionKind, 9867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek ElementRegionKind, 9967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek // Decl Regions. 10067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BEG_DECL_REGIONS, 10167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek VarRegionKind = BEG_DECL_REGIONS, 10267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek FieldRegionKind, 10367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek ObjCIvarRegionKind, 1044fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu END_DECL_REGIONS = ObjCIvarRegionKind, 10502fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu CXXTempObjectRegionKind, 1064fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu CXXBaseObjectRegionKind, 107096aef9597b263b4cd6a0feaacf9e7214fa9c75aJordy Rose END_TYPED_VALUE_REGIONS = CXXBaseObjectRegionKind, 108096aef9597b263b4cd6a0feaacf9e7214fa9c75aJordy Rose END_TYPED_REGIONS = CXXBaseObjectRegionKind 10967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek }; 11067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 1119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate: 1129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const Kind kind; 1131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 1159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemRegion(Kind k) : kind(k) {} 1169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek virtual ~MemRegion(); 1179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 119a6275a534da701f37d19a068e6361e5f10f983a1Ted Kremenek ASTContext &getContext() const; 1201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek virtual void Profile(llvm::FoldingSetNodeID& ID) const = 0; 122a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 123a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek virtual MemRegionManager* getMemRegionManager() const = 0; 124a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 1259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek std::string getString() const; 1261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 127bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek const MemSpaceRegion *getMemorySpace() const; 1281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 129adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu const MemRegion *getBaseRegion() const; 130adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu 131479529e679957fbb92b56e116e3c86734429331eZhongxing Xu const MemRegion *StripCasts() const; 1321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1331508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek bool hasGlobalsOrParametersStorage() const; 1341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 135de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek bool hasStackStorage() const; 136de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 137de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek bool hasStackNonParametersStorage() const; 138de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 139de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek bool hasStackParametersStorage() const; 140b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 141e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu /// Compute the offset within the top level memory object. 142e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu RegionOffset getAsOffset() const; 143e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu 1449c378f705405d37f49795d5e915989de774fe11fTed Kremenek virtual void dumpToStream(raw_ostream &os) const; 1457f39d29cb69e7488f994870800d548008e50e1cbTed Kremenek 1468800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek void dump() const; 1471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Kind getKind() const { return kind; } 1491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 150ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek template<typename RegionTy> const RegionTy* getAs() const; 1511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 152f0f0605c87739c906861f73d4287798a4969b1e0Zhongxing Xu virtual bool isBoundable() const { return false; } 153b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 1549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion*) { return true; } 1559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 1561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 157eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// MemSpaceRegion - A memory region that represents a "memory space"; 1589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// for example, the set of global variables, the stack frame, etc. 1599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemSpaceRegion : public MemRegion { 160a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenekprotected: 16167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 16267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 163a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek MemRegionManager *Mgr; 164a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 16567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek MemSpaceRegion(MemRegionManager *mgr, Kind k = GenericMemSpaceRegionKind) 16667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : MemRegion(k), Mgr(mgr) { 16767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek assert(classof(this)); 16867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 16967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 17067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek MemRegionManager* getMemRegionManager() const { return Mgr; } 1711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 17367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek bool isBoundable() const { return false; } 17467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 17567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek void Profile(llvm::FoldingSetNodeID &ID) const; 17667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 17767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 17867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek Kind k = R->getKind(); 17967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return k >= BEG_MEMSPACES && k <= END_MEMSPACES; 180a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek } 18167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 18267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 18367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass GlobalsSpaceRegion : public MemSpaceRegion { 18499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 185dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekprotected: 186dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek GlobalsSpaceRegion(MemRegionManager *mgr, Kind k) 187dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek : MemSpaceRegion(mgr, k) {} 188dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekpublic: 189dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek static bool classof(const MemRegion *R) { 190dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek Kind k = R->getKind(); 191dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek return k >= BEG_GLOBAL_MEMSPACES && k <= END_GLOBAL_MEMSPACES; 192dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek } 193dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek}; 194eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 195eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// \class The region of the static variables within the current CodeTextRegion 196eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// scope. 197eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// Currently, only the static locals are placed there, so we know that these 198eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// variables do not get invalidated by calls to other functions. 199dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekclass StaticGlobalSpaceRegion : public GlobalsSpaceRegion { 20067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 201a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 202dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek const CodeTextRegion *CR; 203dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 204dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek StaticGlobalSpaceRegion(MemRegionManager *mgr, const CodeTextRegion *cr) 205dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek : GlobalsSpaceRegion(mgr, StaticGlobalSpaceRegionKind), CR(cr) {} 206dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 207dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekpublic: 208dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek void Profile(llvm::FoldingSetNodeID &ID) const; 209dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 2109c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 211fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek 212dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek const CodeTextRegion *getCodeRegion() const { return CR; } 213dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 214dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek static bool classof(const MemRegion *R) { 215dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek return R->getKind() == StaticGlobalSpaceRegionKind; 216dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek } 217dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek}; 218eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 219eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// \class The region for all the non-static global variables. 220eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// 221eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// This class is further split into subclasses for efficient implementation of 222eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// invalidating a set of related global values as is done in 223eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// RegionStoreManager::invalidateRegions (instead of finding all the dependent 224eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// globals, we invalidate the whole parent region). 225dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekclass NonStaticGlobalSpaceRegion : public GlobalsSpaceRegion { 226dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek friend class MemRegionManager; 227dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 228eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksprotected: 229eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks NonStaticGlobalSpaceRegion(MemRegionManager *mgr, Kind k) 230eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks : GlobalsSpaceRegion(mgr, k) {} 231dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 2329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 233fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek 2349c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 235fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek 23667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 237eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks Kind k = R->getKind(); 238eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks return k >= BEG_NON_STATIC_GLOBAL_MEMSPACES && 239eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks k <= END_NON_STATIC_GLOBAL_MEMSPACES; 24067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 24167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 242eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 243eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// \class The region containing globals which are defined in system/external 244eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// headers and are considered modifiable by system calls (ex: errno). 245eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksclass GlobalSystemSpaceRegion : public NonStaticGlobalSpaceRegion { 246eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks friend class MemRegionManager; 247eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 248eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalSystemSpaceRegion(MemRegionManager *mgr) 249eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks : NonStaticGlobalSpaceRegion(mgr, GlobalSystemSpaceRegionKind) {} 250eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 251eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zakspublic: 252eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 253eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks void dumpToStream(raw_ostream &os) const; 254eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 255eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks static bool classof(const MemRegion *R) { 256eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks return R->getKind() == GlobalSystemSpaceRegionKind; 257eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks } 258eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks}; 259eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 260eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// \class The region containing globals which are considered not to be modified 261eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// or point to data which could be modified as a result of a function call 262eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// (system or internal). Ex: Const global scalars would be modeled as part of 263eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// this region. This region also includes most system globals since they have 264eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// low chance of being modified. 265eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksclass GlobalImmutableSpaceRegion : public NonStaticGlobalSpaceRegion { 266eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks friend class MemRegionManager; 267eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 268eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalImmutableSpaceRegion(MemRegionManager *mgr) 269eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks : NonStaticGlobalSpaceRegion(mgr, GlobalImmutableSpaceRegionKind) {} 270eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 271eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zakspublic: 272eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 273eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks void dumpToStream(raw_ostream &os) const; 274eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 275eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks static bool classof(const MemRegion *R) { 276eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks return R->getKind() == GlobalImmutableSpaceRegionKind; 277eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks } 278eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks}; 279eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 280eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// \class The region containing globals which can be modified by calls to 281eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// "internally" defined functions - (for now just) functions other then system 282eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// calls. 283eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksclass GlobalInternalSpaceRegion : public NonStaticGlobalSpaceRegion { 284eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks friend class MemRegionManager; 285eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 286eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalInternalSpaceRegion(MemRegionManager *mgr) 287eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks : NonStaticGlobalSpaceRegion(mgr, GlobalInternalSpaceRegionKind) {} 288eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 289eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zakspublic: 290eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 291eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks void dumpToStream(raw_ostream &os) const; 292eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 293eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks static bool classof(const MemRegion *R) { 294eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks return R->getKind() == GlobalInternalSpaceRegionKind; 295eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks } 296eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks}; 297eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 29867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass HeapSpaceRegion : public MemSpaceRegion { 29999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 30067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 30167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 30267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek HeapSpaceRegion(MemRegionManager *mgr) 30367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : MemSpaceRegion(mgr, HeapSpaceRegionKind) {} 30467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 30567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 30667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return R->getKind() == HeapSpaceRegionKind; 30767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 30867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 30967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 3102b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenekclass UnknownSpaceRegion : public MemSpaceRegion { 31199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 3122b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek friend class MemRegionManager; 3132b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek UnknownSpaceRegion(MemRegionManager *mgr) 3142b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek : MemSpaceRegion(mgr, UnknownSpaceRegionKind) {} 3152b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenekpublic: 3162b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek static bool classof(const MemRegion *R) { 3172b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek return R->getKind() == UnknownSpaceRegionKind; 3182b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek } 3192b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek}; 3202b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek 32167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackSpaceRegion : public MemSpaceRegion { 32267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate: 32367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackFrameContext *SFC; 3249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 32567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprotected: 32667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StackSpaceRegion(MemRegionManager *mgr, Kind k, const StackFrameContext *sfc) 32767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : MemSpaceRegion(mgr, k), SFC(sfc) { 32867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek assert(classof(this)); 32967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 33041168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek 33167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 33267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackFrameContext *getStackFrame() const { return SFC; } 33367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 33467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek void Profile(llvm::FoldingSetNodeID &ID) const; 33567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 33667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 33767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek Kind k = R->getKind(); 33867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return k >= StackLocalsSpaceRegionKind && 33967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek k <= StackArgumentsSpaceRegionKind; 34067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 34167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 34267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 34367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackLocalsSpaceRegion : public StackSpaceRegion { 34499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 34567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 34667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StackLocalsSpaceRegion(MemRegionManager *mgr, const StackFrameContext *sfc) 34767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : StackSpaceRegion(mgr, StackLocalsSpaceRegionKind, sfc) {} 34867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 34967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 35067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return R->getKind() == StackLocalsSpaceRegionKind; 35167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 35267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 35367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 35467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackArgumentsSpaceRegion : public StackSpaceRegion { 35567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate: 35699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 35767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 35867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StackArgumentsSpaceRegion(MemRegionManager *mgr, const StackFrameContext *sfc) 35967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : StackSpaceRegion(mgr, StackArgumentsSpaceRegionKind, sfc) {} 36067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 36167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 36267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return R->getKind() == StackArgumentsSpaceRegionKind; 3639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 3659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3667caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 367993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// SubRegion - A region that subsets another larger region. Most regions 368993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// are subclasses of SubRegion. 369993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass SubRegion : public MemRegion { 37099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikieprivate: 37199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 3729e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 3731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const MemRegion* superRegion; 374993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek SubRegion(const MemRegion* sReg, Kind k) : MemRegion(k), superRegion(sReg) {} 3759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 3769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* getSuperRegion() const { 3779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return superRegion; 3789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 38032f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose /// getExtent - Returns the size of the region in bytes. 381c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek virtual DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const { 38232f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose return UnknownVal(); 38332f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose } 38432f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 385a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek MemRegionManager* getMemRegionManager() const; 3861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3877e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu bool isSubRegionOf(const MemRegion* R) const; 3881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 39067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return R->getKind() > END_MEMSPACES; 391993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek } 392993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek}; 3931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 39419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===// 39519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// MemRegion subclasses. 3961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump//===----------------------------------------------------------------------===// 397ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 39882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek/// AllocaRegion - A region that represents an untyped blob of bytes created 39982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek/// by a call to 'alloca'. 40082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekclass AllocaRegion : public SubRegion { 40182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek friend class MemRegionManager; 40282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekprotected: 40382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek unsigned Cnt; // Block counter. Used to distinguish different pieces of 40482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek // memory allocated by alloca at the same call site. 4059c378f705405d37f49795d5e915989de774fe11fTed Kremenek const Expr *Ex; 40682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 4079c378f705405d37f49795d5e915989de774fe11fTed Kremenek AllocaRegion(const Expr *ex, unsigned cnt, const MemRegion *superRegion) 40882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek : SubRegion(superRegion, AllocaRegionKind), Cnt(cnt), Ex(ex) {} 4091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 41082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekpublic: 4111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4129c378f705405d37f49795d5e915989de774fe11fTed Kremenek const Expr *getExpr() const { return Ex; } 4139852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu 4149852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu bool isBoundable() const { return true; } 4159852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu 416c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const; 41732f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 41882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 41982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 4209c378f705405d37f49795d5e915989de774fe11fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Expr *Ex, 4217ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek unsigned Cnt, const MemRegion *superRegion); 4221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4239c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 4241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 42582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek static bool classof(const MemRegion* R) { 42682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek return R->getKind() == AllocaRegionKind; 42782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek } 4281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}; 4291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 430993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// TypedRegion - An abstract class representing regions that are typed. 431993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass TypedRegion : public SubRegion { 43299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikiepublic: 43399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 434993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekprotected: 435993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek TypedRegion(const MemRegion* sReg, Kind k) : SubRegion(sReg, k) {} 4361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 437993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekpublic: 4389697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek virtual QualType getLocationType() const = 0; 4399697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek 4409697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek QualType getDesugaredLocationType(ASTContext &Context) const { 4419697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek return getLocationType().getDesugaredType(Context); 4429697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek } 4439697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek 4449697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek bool isBoundable() const { return true; } 4459697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek 4469697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek static bool classof(const MemRegion* R) { 4479697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek unsigned k = R->getKind(); 4489697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek return k >= BEG_TYPED_REGIONS && k <= END_TYPED_REGIONS; 4499697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek } 4509697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek}; 4519697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek 4529697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek/// TypedValueRegion - An abstract class representing regions having a typed value. 4539697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass TypedValueRegion : public TypedRegion { 45499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikiepublic: 45599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 4569697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekprotected: 4579697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek TypedValueRegion(const MemRegion* sReg, Kind k) : TypedRegion(sReg, k) {} 4589697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek 4599697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekpublic: 460018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu virtual QualType getValueType() const = 0; 4611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 462018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu virtual QualType getLocationType() const { 4636eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek // FIXME: We can possibly optimize this later to cache this value. 464a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek QualType T = getValueType(); 465a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek ASTContext &ctx = getContext(); 466a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek if (T->getAs<ObjCObjectType>()) 467a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek return ctx.getObjCObjectPointerType(T); 468a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek return ctx.getPointerType(getValueType()); 4696eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek } 4701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 47149f4e1cbd839da27ff4814b4ea6d85a79f786cbdJohn McCall QualType getDesugaredValueType(ASTContext &Context) const { 472018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType T = getValueType(); 4731ab55e9bb87d98bff1d42c7a0ee502c64755d9f5Douglas Gregor return T.getTypePtrOrNull() ? T.getDesugaredType(Context) : T; 47414553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek } 4751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 476993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek static bool classof(const MemRegion* R) { 4779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek unsigned k = R->getKind(); 4789697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek return k >= BEG_TYPED_VALUE_REGIONS && k <= END_TYPED_VALUE_REGIONS; 4799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 4809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 4819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 482ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 483eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass CodeTextRegion : public TypedRegion { 48499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikiepublic: 48599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 486eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekprotected: 487eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek CodeTextRegion(const MemRegion *sreg, Kind k) : TypedRegion(sreg, k) {} 488ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xupublic: 489eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek bool isBoundable() const { return false; } 490eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 491eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek static bool classof(const MemRegion* R) { 492eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek Kind k = R->getKind(); 493eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return k >= FunctionTextRegionKind && k <= BlockTextRegionKind; 494eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek } 495eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek}; 496ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 497eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek/// FunctionTextRegion - A region that represents code texts of function. 498eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass FunctionTextRegion : public CodeTextRegion { 499eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek const FunctionDecl *FD; 500eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekpublic: 5019c378f705405d37f49795d5e915989de774fe11fTed Kremenek FunctionTextRegion(const FunctionDecl *fd, const MemRegion* sreg) 502eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek : CodeTextRegion(sreg, FunctionTextRegionKind), FD(fd) {} 503eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 504018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getLocationType() const { 505018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu return getContext().getPointerType(FD->getType()); 506ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu } 507eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 508abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek const FunctionDecl *getDecl() const { 509abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek return FD; 51072e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek } 511eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 5129c378f705405d37f49795d5e915989de774fe11fTed Kremenek virtual void dumpToStream(raw_ostream &os) const; 513eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 514ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const; 515eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 516abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const FunctionDecl *FD, 517abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek const MemRegion*); 518eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 519ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu static bool classof(const MemRegion* R) { 520eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return R->getKind() == FunctionTextRegionKind; 521eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek } 522eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek}; 523eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 524eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 525eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek/// BlockTextRegion - A region that represents code texts of blocks (closures). 5260a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// Blocks are represented with two kinds of regions. BlockTextRegions 5270a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// represent the "code", while BlockDataRegions represent instances of blocks, 5280a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// which correspond to "code+data". The distinction is important, because 5290a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// like a closure a block captures the values of externally referenced 5300a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// variables. 531eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass BlockTextRegion : public CodeTextRegion { 53267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 53367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 534eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek const BlockDecl *BD; 5351d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContext *AC; 536eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek CanQualType locTy; 53767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 53867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BlockTextRegion(const BlockDecl *bd, CanQualType lTy, 5391d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContext *ac, const MemRegion* sreg) 54067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : CodeTextRegion(sreg, BlockTextRegionKind), BD(bd), AC(ac), locTy(lTy) {} 54167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 54267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 543018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getLocationType() const { 544eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return locTy; 545eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek } 546eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 547eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek const BlockDecl *getDecl() const { 548eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return BD; 549eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek } 55067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 5511d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContext *getAnalysisDeclContext() const { return AC; } 552eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 5539c378f705405d37f49795d5e915989de774fe11fTed Kremenek virtual void dumpToStream(raw_ostream &os) const; 554eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 555eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 556eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 557eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const BlockDecl *BD, 5581d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek CanQualType, const AnalysisDeclContext*, 55967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const MemRegion*); 560eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 561eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek static bool classof(const MemRegion* R) { 562eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return R->getKind() == BlockTextRegionKind; 563ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu } 564ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu}; 5650a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 5660a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// BlockDataRegion - A region that represents a block instance. 5670a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// Blocks are represented with two kinds of regions. BlockTextRegions 5680a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// represent the "code", while BlockDataRegions represent instances of blocks, 5690a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// which correspond to "code+data". The distinction is important, because 5700a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// like a closure a block captures the values of externally referenced 5710a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// variables. 5720a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenekclass BlockDataRegion : public SubRegion { 57367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 5740a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek const BlockTextRegion *BC; 57567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *LC; // Can be null */ 5764240096011a187807058f887eb81df750ffa17feTed Kremenek void *ReferencedVars; 57767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 57867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BlockDataRegion(const BlockTextRegion *bc, const LocationContext *lc, 5790a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek const MemRegion *sreg) 5804240096011a187807058f887eb81df750ffa17feTed Kremenek : SubRegion(sreg, BlockDataRegionKind), BC(bc), LC(lc), ReferencedVars(0) {} 5810a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 58267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 5830a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek const BlockTextRegion *getCodeRegion() const { return BC; } 5844240096011a187807058f887eb81df750ffa17feTed Kremenek 585d02e83a548359df978f40cc1a52ffd78b7ef371bTed Kremenek const BlockDecl *getDecl() const { return BC->getDecl(); } 586d02e83a548359df978f40cc1a52ffd78b7ef371bTed Kremenek 58781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek class referenced_vars_iterator { 58881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek const MemRegion * const *R; 58981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek public: 59081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek explicit referenced_vars_iterator(const MemRegion * const *r) : R(r) {} 59181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek 59281cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek operator const MemRegion * const *() const { 59381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return R; 59481cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 59581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek 59681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek const VarRegion* operator*() const { 59781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return cast<VarRegion>(*R); 59881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 59981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek 60081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek bool operator==(const referenced_vars_iterator &I) const { 60181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return I.R == R; 60281cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 60381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek bool operator!=(const referenced_vars_iterator &I) const { 60481cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return I.R != R; 60581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 6069c378f705405d37f49795d5e915989de774fe11fTed Kremenek referenced_vars_iterator &operator++() { 60781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek ++R; 60881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return *this; 60981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 61081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek }; 61181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek 6124240096011a187807058f887eb81df750ffa17feTed Kremenek referenced_vars_iterator referenced_vars_begin() const; 6134240096011a187807058f887eb81df750ffa17feTed Kremenek referenced_vars_iterator referenced_vars_end() const; 6140a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 6159c378f705405d37f49795d5e915989de774fe11fTed Kremenek virtual void dumpToStream(raw_ostream &os) const; 6160a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 6170a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 6180a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 61967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID&, const BlockTextRegion *, 62067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *, const MemRegion *); 6210a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 6220a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek static bool classof(const MemRegion* R) { 6230a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek return R->getKind() == BlockDataRegionKind; 6240a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek } 6254240096011a187807058f887eb81df750ffa17feTed Kremenekprivate: 6264240096011a187807058f887eb81df750ffa17feTed Kremenek void LazyInitializeReferencedVars(); 6270a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek}; 628ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 629026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// SymbolicRegion - A special, "non-concrete" region. Unlike other region 630026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// clases, SymbolicRegion represents a region that serves as an alias for 631026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// either a real region, a NULL pointer, etc. It essentially is used to 632026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// map the concept of symbolic values into the domain of regions. Symbolic 633026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// regions do not need to be typed. 634e8e86482da4c1872673bbb9c237649229d19793bTed Kremenekclass SymbolicRegion : public SubRegion { 635026c66395b88a09437319139a43b090093f7e1ddZhongxing Xuprotected: 636026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu const SymbolRef sym; 637026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 638026c66395b88a09437319139a43b090093f7e1ddZhongxing Xupublic: 6391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SymbolicRegion(const SymbolRef s, const MemRegion* sreg) 640e8e86482da4c1872673bbb9c237649229d19793bTed Kremenek : SubRegion(sreg, SymbolicRegionKind), sym(s) {} 6411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 642026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu SymbolRef getSymbol() const { 643026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu return sym; 644026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu } 645026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 6469852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu bool isBoundable() const { return true; } 6479852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu 648c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const; 64932f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 650026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const; 651026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 652250101353b711a409b075f1bc11070dddec7100bTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, 653250101353b711a409b075f1bc11070dddec7100bTed Kremenek SymbolRef sym, 654250101353b711a409b075f1bc11070dddec7100bTed Kremenek const MemRegion* superRegion); 6551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6569c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 6571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 658026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu static bool classof(const MemRegion* R) { 659026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu return R->getKind() == SymbolicRegionKind; 660026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu } 6611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}; 662026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 663e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu/// StringRegion - Region associated with a StringLiteral. 6649697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass StringRegion : public TypedValueRegion { 665e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu friend class MemRegionManager; 666e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const StringLiteral* Str; 667e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuprotected: 668e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 669250101353b711a409b075f1bc11070dddec7100bTed Kremenek StringRegion(const StringLiteral* str, const MemRegion* sreg) 6709697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sreg, StringRegionKind), Str(str) {} 671e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 672e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID& ID, 673e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const StringLiteral* Str, 674e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const MemRegion* superRegion); 675e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 676e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xupublic: 6776613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu 6786613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu const StringLiteral* getStringLiteral() const { return Str; } 6791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 680018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 681ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu return Str->getType(); 682ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu } 683e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 684c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const; 68532f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 6860a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu bool isBoundable() const { return false; } 6870a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu 688e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const { 689e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu ProfileRegion(ID, Str, superRegion); 690e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 691e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 6929c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 693cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu 694e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static bool classof(const MemRegion* R) { 695e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu return R->getKind() == StringRegionKind; 696e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 697e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu}; 698e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 699329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// CompoundLiteralRegion - A memory region representing a compound literal. 700329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// Compound literals are essentially temporaries that are stack allocated 701329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// or in the global constant pool. 7029697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CompoundLiteralRegion : public TypedValueRegion { 703329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekprivate: 704329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek friend class MemRegionManager; 7059c378f705405d37f49795d5e915989de774fe11fTed Kremenek const CompoundLiteralExpr *CL; 706329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 7079c378f705405d37f49795d5e915989de774fe11fTed Kremenek CompoundLiteralRegion(const CompoundLiteralExpr *cl, const MemRegion* sReg) 7089697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sReg, CompoundLiteralRegionKind), CL(cl) {} 7091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 710329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, 7119c378f705405d37f49795d5e915989de774fe11fTed Kremenek const CompoundLiteralExpr *CL, 712329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek const MemRegion* superRegion); 713329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekpublic: 714018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 715018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu return CL->getType(); 71677cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu } 7170a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu 7189a08fee80a34938b8c11c7166e009a89ced4c2b4Zhongxing Xu bool isBoundable() const { return !CL->isFileScope(); } 7199a08fee80a34938b8c11c7166e009a89ced4c2b4Zhongxing Xu 720329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 7211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7229c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 723329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 7249c378f705405d37f49795d5e915989de774fe11fTed Kremenek const CompoundLiteralExpr *getLiteralExpr() const { return CL; } 7251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 726329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek static bool classof(const MemRegion* R) { 727329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek return R->getKind() == CompoundLiteralRegionKind; 728329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek } 729329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek}; 730178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 7319697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass DeclRegion : public TypedValueRegion { 7329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 7339c378f705405d37f49795d5e915989de774fe11fTed Kremenek const Decl *D; 7349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 7359c378f705405d37f49795d5e915989de774fe11fTed Kremenek DeclRegion(const Decl *d, const MemRegion* sReg, Kind k) 7369697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sReg, k), D(d) {} 7379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 7389c378f705405d37f49795d5e915989de774fe11fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl *D, 7399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion, Kind k); 7401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 741bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xupublic: 7429c378f705405d37f49795d5e915989de774fe11fTed Kremenek const Decl *getDecl() const { return D; } 7439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 7441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 745c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const; 74632f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 747e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static bool classof(const MemRegion* R) { 748e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu unsigned k = R->getKind(); 74967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return k >= BEG_DECL_REGIONS && k <= END_DECL_REGIONS; 750e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 7519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 7521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass VarRegion : public DeclRegion { 7549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 755d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek 756d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek // Constructors and private methods. 7579c378f705405d37f49795d5e915989de774fe11fTed Kremenek VarRegion(const VarDecl *vd, const MemRegion* sReg) 75867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : DeclRegion(vd, sReg, VarRegionKind) {} 7599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 7609c378f705405d37f49795d5e915989de774fe11fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const VarDecl *VD, 761d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek const MemRegion *superRegion) { 7629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, VD, superRegion, VarRegionKind); 7639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 7641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 765d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 7661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic: 768d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek const VarDecl *getDecl() const { return cast<VarDecl>(D); } 7691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7705348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek const StackFrameContext *getStackFrame() const; 7715348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek 772018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 7736eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek // FIXME: We can cache this if needed. 774018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu return getDecl()->getType(); 7751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 7761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7779c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 7781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 7809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == VarRegionKind; 7811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 7829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 783de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 784de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek/// CXXThisRegion - Represents the region for the implicit 'this' parameter 785de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek/// in a call to a C++ method. This region doesn't represent the object 786de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek/// referred to by 'this', but rather 'this' itself. 7879697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CXXThisRegion : public TypedValueRegion { 788de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek friend class MemRegionManager; 789de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek CXXThisRegion(const PointerType *thisPointerTy, 790de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const MemRegion *sReg) 7919697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sReg, CXXThisRegionKind), ThisPointerTy(thisPointerTy) {} 792de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 793de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID &ID, 794de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const PointerType *PT, 795de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const MemRegion *sReg); 796de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 797de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek void Profile(llvm::FoldingSetNodeID &ID) const; 798de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 799de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekpublic: 800018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 801de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek return QualType(ThisPointerTy, 0); 802de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek } 8037caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 8049c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 805de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 806de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek static bool classof(const MemRegion* R) { 807de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek return R->getKind() == CXXThisRegionKind; 808de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek } 809de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 810de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekprivate: 811de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const PointerType *ThisPointerTy; 812de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek}; 8139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 8149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass FieldRegion : public DeclRegion { 8159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 8169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 8179c378f705405d37f49795d5e915989de774fe11fTed Kremenek FieldRegion(const FieldDecl *fd, const MemRegion* sReg) 8189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(fd, sReg, FieldRegionKind) {} 8199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 8204bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenekpublic: 8211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8229c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 8231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8249c378f705405d37f49795d5e915989de774fe11fTed Kremenek const FieldDecl *getDecl() const { return cast<FieldDecl>(D); } 8251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 826018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 8276eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek // FIXME: We can cache this if needed. 828018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu return getDecl()->getType(); 8291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 8304bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek 831c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const; 83232f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 8339c378f705405d37f49795d5e915989de774fe11fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const FieldDecl *FD, 8346304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek const MemRegion* superRegion) { 8359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, FD, superRegion, FieldRegionKind); 8369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 8371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 8399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == FieldRegionKind; 8409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 8419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 8421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass ObjCIvarRegion : public DeclRegion { 8441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 8461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8479c378f705405d37f49795d5e915989de774fe11fTed Kremenek ObjCIvarRegion(const ObjCIvarDecl *ivd, const MemRegion* sReg) 8489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(ivd, sReg, ObjCIvarRegionKind) {} 8499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 8509c378f705405d37f49795d5e915989de774fe11fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const ObjCIvarDecl *ivd, 8516304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek const MemRegion* superRegion) { 8529e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCIvarRegionKind); 8539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 8541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 8569c378f705405d37f49795d5e915989de774fe11fTed Kremenek const ObjCIvarDecl *getDecl() const { return cast<ObjCIvarDecl>(D); } 857018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { return getDecl()->getType(); } 8581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8599c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 8601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 8629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == ObjCIvarRegionKind; 8639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 8649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 8657caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu//===----------------------------------------------------------------------===// 866fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner// Auxiliary data classes for use with MemRegions. 8677caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu//===----------------------------------------------------------------------===// 8687caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 8697caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuclass ElementRegion; 8707caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 8717caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuclass RegionRawOffset { 8727caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuprivate: 8737caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu friend class ElementRegion; 8747caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 8757caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu const MemRegion *Region; 8769ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck CharUnits Offset; 8777caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 8789ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck RegionRawOffset(const MemRegion* reg, CharUnits offset = CharUnits::Zero()) 8797caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu : Region(reg), Offset(offset) {} 8807caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 8817caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xupublic: 8827caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu // FIXME: Eventually support symbolic offsets. 8839ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck CharUnits getOffset() const { return Offset; } 8847caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu const MemRegion *getRegion() const { return Region; } 8857caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 8869c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 8877caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu void dump() const; 8887caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu}; 889511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 8901437425a62dbf7bdb0a855d3ed3b05ed2019ec1eAnna Zaks/// \brief ElementRegin is used to represent both array elements and casts. 8919697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass ElementRegion : public TypedValueRegion { 892511191ce8920160525611be2be754c32a0724c3eZhongxing Xu friend class MemRegionManager; 893511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 894f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek QualType ElementType; 89502282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek NonLoc Index; 896511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 89702282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek ElementRegion(QualType elementType, NonLoc Idx, const MemRegion* sReg) 8989697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sReg, ElementRegionKind), 899f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek ElementType(elementType), Index(Idx) { 9003d8173c1c68f451c7492f92023d829c626845925Chris Lattner assert((!isa<nonloc::ConcreteInt>(&Idx) || 9013d8173c1c68f451c7492f92023d829c626845925Chris Lattner cast<nonloc::ConcreteInt>(&Idx)->getValue().isSigned()) && 90243b28d07019bc78447ecbbb721526de4ffd83f20Chris Lattner "The index must be signed"); 9030395b5d4987fe5baa818015e9d294c128619e4ecZhongxing Xu } 9041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 905f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, QualType elementType, 906f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek SVal Idx, const MemRegion* superRegion); 907511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 908511191ce8920160525611be2be754c32a0724c3eZhongxing Xupublic: 909511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 91002282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek NonLoc getIndex() const { return Index; } 9116e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu 912018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 913f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek return ElementType; 914f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek } 9151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 916f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek QualType getElementType() const { 917f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek return ElementType; 918abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek } 9197caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu /// Compute the offset within the array. The array might also be a subobject. 9207caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu RegionRawOffset getAsArrayOffset() const; 9211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9229c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 923b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 924511191ce8920160525611be2be754c32a0724c3eZhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const; 925511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 926511191ce8920160525611be2be754c32a0724c3eZhongxing Xu static bool classof(const MemRegion* R) { 927511191ce8920160525611be2be754c32a0724c3eZhongxing Xu return R->getKind() == ElementRegionKind; 928511191ce8920160525611be2be754c32a0724c3eZhongxing Xu } 929511191ce8920160525611be2be754c32a0724c3eZhongxing Xu}; 93019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 931bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu// C++ temporary object associated with an expression. 9329697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CXXTempObjectRegion : public TypedValueRegion { 933bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu friend class MemRegionManager; 934bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 935bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu Expr const *Ex; 936bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 93702fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu CXXTempObjectRegion(Expr const *E, MemRegion const *sReg) 9389697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sReg, CXXTempObjectRegionKind), Ex(E) {} 939bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 940bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID &ID, 941bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu Expr const *E, const MemRegion *sReg); 942bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 943bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xupublic: 944782f63ecd124f9384f988dc7e0cf4ae1540c15f6Jeffrey Yasskin const Expr *getExpr() const { return Ex; } 945782f63ecd124f9384f988dc7e0cf4ae1540c15f6Jeffrey Yasskin 946018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 947bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu return Ex->getType(); 948bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu } 949bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 9509c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 951e1aeb13251a4858724d2b7ad1925d25076f23d08Zhongxing Xu 952bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu void Profile(llvm::FoldingSetNodeID &ID) const; 953bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 954bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu static bool classof(const MemRegion* R) { 95502fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu return R->getKind() == CXXTempObjectRegionKind; 956bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu } 957bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu}; 958bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 9594fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu// CXXBaseObjectRegion represents a base object within a C++ object. It is 9604fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu// identified by the base class declaration and the region of its parent object. 9619697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CXXBaseObjectRegion : public TypedValueRegion { 9624fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu friend class MemRegionManager; 9634fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 9644fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu const CXXRecordDecl *decl; 9654fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 9664fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu CXXBaseObjectRegion(const CXXRecordDecl *d, const MemRegion *sReg) 9679697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sReg, CXXBaseObjectRegionKind), decl(d) {} 9684fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 9694fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID &ID, 9704fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu const CXXRecordDecl *decl, const MemRegion *sReg); 9714fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 9724fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xupublic: 973d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu const CXXRecordDecl *getDecl() const { return decl; } 974d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu 9754fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu QualType getValueType() const; 9764fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 9779c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 9784fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 9794fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu void Profile(llvm::FoldingSetNodeID &ID) const; 9804fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 9814fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu static bool classof(const MemRegion *region) { 9824fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu return region->getKind() == CXXBaseObjectRegionKind; 9834fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu } 9844fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu}; 9854fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 986ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenektemplate<typename RegionTy> 987ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenekconst RegionTy* MemRegion::getAs() const { 988f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek if (const RegionTy* RT = dyn_cast<RegionTy>(this)) 989f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek return RT; 9901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 991f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek return NULL; 992ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek} 993511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 9949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 9959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager - Factory object for creating regions. 9969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 9979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 9989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager { 999a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek ASTContext &C; 10009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek llvm::BumpPtrAllocator& A; 10019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek llvm::FoldingSet<MemRegion> Regions; 10021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1003eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalInternalSpaceRegion *InternalGlobals; 1004eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalSystemSpaceRegion *SystemGlobals; 1005eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalImmutableSpaceRegion *ImmutableGlobals; 1006eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 10072b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek 1008c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu llvm::DenseMap<const StackFrameContext *, StackLocalsSpaceRegion *> 1009c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu StackLocalsSpaceRegions; 1010c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu llvm::DenseMap<const StackFrameContext *, StackArgumentsSpaceRegion *> 1011c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu StackArgumentsSpaceRegions; 1012dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek llvm::DenseMap<const CodeTextRegion *, StaticGlobalSpaceRegion *> 1013dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek StaticsGlobalSpaceRegions; 10142b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek 101567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek HeapSpaceRegion *heap; 10162b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek UnknownSpaceRegion *unknown; 1017d05552a21377f493c882298c59e8829040b01d34Ted Kremenek MemSpaceRegion *code; 1018dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 10199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 1020a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek MemRegionManager(ASTContext &c, llvm::BumpPtrAllocator& a) 1021eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks : C(c), A(a), InternalGlobals(0), SystemGlobals(0), ImmutableGlobals(0), 1022eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks heap(0), unknown(0), code(0) {} 10231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 10244240096011a187807058f887eb81df750ffa17feTed Kremenek ~MemRegionManager(); 10251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1026a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek ASTContext &getContext() { return C; } 10274240096011a187807058f887eb81df750ffa17feTed Kremenek 10284240096011a187807058f887eb81df750ffa17feTed Kremenek llvm::BumpPtrAllocator &getAllocator() { return A; } 10291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 103067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// getStackLocalsRegion - Retrieve the memory region associated with the 103167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// specified stack frame. 103267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackLocalsSpaceRegion * 103367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek getStackLocalsRegion(const StackFrameContext *STC); 1034d05552a21377f493c882298c59e8829040b01d34Ted Kremenek 1035d05552a21377f493c882298c59e8829040b01d34Ted Kremenek /// getStackArgumentsRegion - Retrieve the memory region associated with 103667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// function/method arguments of the specified stack frame. 103767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackArgumentsSpaceRegion * 103867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek getStackArgumentsRegion(const StackFrameContext *STC); 10391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 10409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getGlobalsRegion - Retrieve the memory region associated with 1041dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek /// global variables. 1042eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks const GlobalsSpaceRegion *getGlobalsRegion( 1043eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks MemRegion::Kind K = MemRegion::GlobalInternalSpaceRegionKind, 1044eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks const CodeTextRegion *R = 0); 10451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 10469e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getHeapRegion - Retrieve the memory region associated with the 10479e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// generic "heap". 104867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const HeapSpaceRegion *getHeapRegion(); 1049178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 1050178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu /// getUnknownRegion - Retrieve the memory region associated with unknown 1051178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu /// memory space. 1052b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemSpaceRegion *getUnknownRegion(); 1053c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu 1054b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemSpaceRegion *getCodeRegion(); 1055ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 10567090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek /// getAllocaRegion - Retrieve a region associated with a call to alloca(). 10579c378f705405d37f49795d5e915989de774fe11fTed Kremenek const AllocaRegion *getAllocaRegion(const Expr *Ex, unsigned Cnt, 105867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *LC); 10591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1060329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek /// getCompoundLiteralRegion - Retrieve the region associated with a 1061329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek /// given CompoundLiteral. 1062b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const CompoundLiteralRegion* 10639c378f705405d37f49795d5e915989de774fe11fTed Kremenek getCompoundLiteralRegion(const CompoundLiteralExpr *CL, 106467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *LC); 1065de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 1066fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner /// getCXXThisRegion - Retrieve the [artificial] region associated with the 1067de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek /// parameter 'this'. 1068de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const CXXThisRegion *getCXXThisRegion(QualType thisPointerTy, 1069de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const LocationContext *LC); 10701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1071993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek /// getSymbolicRegion - Retrieve or create a "symbolic" memory region. 1072b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const SymbolicRegion* getSymbolicRegion(SymbolRef sym); 1073e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 1074b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const StringRegion* getStringRegion(const StringLiteral* Str); 1075e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 10769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getVarRegion - Retrieve or create the memory region associated with 1077d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek /// a specified VarDecl and LocationContext. 1078b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const VarRegion* getVarRegion(const VarDecl *D, const LocationContext *LC); 10791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 108067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// getVarRegion - Retrieve or create the memory region associated with 108167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// a specified VarDecl and super region. 108267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const VarRegion* getVarRegion(const VarDecl *D, const MemRegion *superR); 108367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 1084f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek /// getElementRegion - Retrieve the memory region associated with the 1085f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek /// associated element type, index, and super region. 108602282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek const ElementRegion *getElementRegion(QualType elementType, NonLoc Idx, 1087856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu const MemRegion *superRegion, 1088856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu ASTContext &Ctx); 10891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1090b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const ElementRegion *getElementRegionWithSuper(const ElementRegion *ER, 1091856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu const MemRegion *superRegion) { 1092a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek return getElementRegion(ER->getElementType(), ER->getIndex(), 1093a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek superRegion, ER->getContext()); 1094a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek } 1095511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 10969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getFieldRegion - Retrieve or create the memory region associated with 10979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a specified FieldDecl. 'superRegion' corresponds to the containing 10989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// memory region (which typically represents the memory representing 10999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a structure or class). 11009c378f705405d37f49795d5e915989de774fe11fTed Kremenek const FieldRegion *getFieldRegion(const FieldDecl *fd, 1101b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemRegion* superRegion); 11021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1103b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const FieldRegion *getFieldRegionWithSuper(const FieldRegion *FR, 1104b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemRegion *superRegion) { 1105a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek return getFieldRegion(FR->getDecl(), superRegion); 1106a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek } 11071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 11089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getObjCIvarRegion - Retrieve or create the memory region associated with 11099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a specified Objective-c instance variable. 'superRegion' corresponds 11109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// to the containing region (which typically represents the Objective-C 11119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// object). 11129c378f705405d37f49795d5e915989de774fe11fTed Kremenek const ObjCIvarRegion *getObjCIvarRegion(const ObjCIvarDecl *ivd, 1113b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemRegion* superRegion); 11141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 111502fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu const CXXTempObjectRegion *getCXXTempObjectRegion(Expr const *Ex, 111602fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu LocationContext const *LC); 1117bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 11184fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu const CXXBaseObjectRegion *getCXXBaseObjectRegion(const CXXRecordDecl *decl, 11194fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu const MemRegion *superRegion); 11204fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 1121d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu /// Create a CXXBaseObjectRegion with the same CXXRecordDecl but a different 1122d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu /// super region. 1123d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu const CXXBaseObjectRegion * 1124d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu getCXXBaseObjectRegionWithSuper(const CXXBaseObjectRegion *baseReg, 1125d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu const MemRegion *superRegion) { 1126d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu return getCXXBaseObjectRegion(baseReg->getDecl(), superRegion); 1127d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu } 1128d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu 1129b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const FunctionTextRegion *getFunctionTextRegion(const FunctionDecl *FD); 1130b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const BlockTextRegion *getBlockTextRegion(const BlockDecl *BD, 113167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek CanQualType locTy, 11321d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContext *AC); 113367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 113467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// getBlockDataRegion - Get the memory region associated with an instance 113567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// of a block. Unlike many other MemRegions, the LocationContext* 113667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// argument is allowed to be NULL for cases where we have no known 113767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// context. 1138b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const BlockDataRegion *getBlockDataRegion(const BlockTextRegion *bc, 113967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *lc = NULL); 11401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1141bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenekprivate: 1142250101353b711a409b075f1bc11070dddec7100bTed Kremenek template <typename RegionTy, typename A1> 1143250101353b711a409b075f1bc11070dddec7100bTed Kremenek RegionTy* getRegion(const A1 a1); 11441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 11456304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek template <typename RegionTy, typename A1> 1146eeea45611d45238c34474c183cee96d47ae79e24Ted Kremenek RegionTy* getSubRegion(const A1 a1, const MemRegion* superRegion); 11471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 11487ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek template <typename RegionTy, typename A1, typename A2> 11497ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek RegionTy* getRegion(const A1 a1, const A2 a2); 1150dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 11510a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek template <typename RegionTy, typename A1, typename A2> 11520a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek RegionTy* getSubRegion(const A1 a1, const A2 a2, 11530a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek const MemRegion* superRegion); 11540a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 115567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek template <typename RegionTy, typename A1, typename A2, typename A3> 115667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek RegionTy* getSubRegion(const A1 a1, const A2 a2, const A3 a3, 115767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const MemRegion* superRegion); 115867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 115967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek template <typename REG> 116067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const REG* LazyAllocate(REG*& region); 116167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 116267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek template <typename REG, typename ARG> 116367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const REG* LazyAllocate(REG*& region, ARG a); 1164ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek}; 11651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1166250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 1167a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek// Out-of-line member definitions. 1168250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 1169250101353b711a409b075f1bc11070dddec7100bTed Kremenek 11709c378f705405d37f49795d5e915989de774fe11fTed Kremenekinline ASTContext &MemRegion::getContext() const { 1171a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek return getMemRegionManager()->getContext(); 1172a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek} 1173eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 11745a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis} // end GR namespace 11755a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis 1176be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end clang namespace 11779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1178250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 1179250101353b711a409b075f1bc11070dddec7100bTed Kremenek// Pretty-printing regions. 1180250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 1181250101353b711a409b075f1bc11070dddec7100bTed Kremenek 1182be91224894e1501133e224934285ba6440bf5b59Ted Kremeneknamespace llvm { 11839c378f705405d37f49795d5e915989de774fe11fTed Kremenekstatic inline raw_ostream &operator<<(raw_ostream &os, 11849ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremenek const clang::ento::MemRegion* R) { 11858800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek R->dumpToStream(os); 11868800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek return os; 1187be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} 1188be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end llvm namespace 11899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 11909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#endif 1191