MemRegion.h revision 096aef9597b263b4cd6a0feaacf9e7214fa9c75a
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 NonStaticGlobalSpaceRegionKind, 77dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek StaticGlobalSpaceRegionKind, 78dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek BEG_GLOBAL_MEMSPACES = NonStaticGlobalSpaceRegionKind, 79dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek END_GLOBAL_MEMSPACES = StaticGlobalSpaceRegionKind, 80dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek BEG_MEMSPACES = GenericMemSpaceRegionKind, 81dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek END_MEMSPACES = StaticGlobalSpaceRegionKind, 8267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek // Untyped regions. 8367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek SymbolicRegionKind, 8467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek AllocaRegionKind, 859697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek BlockDataRegionKind, 8667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek // Typed regions. 8767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BEG_TYPED_REGIONS, 8867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek FunctionTextRegionKind = BEG_TYPED_REGIONS, 8967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BlockTextRegionKind, 909697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek BEG_TYPED_VALUE_REGIONS, 919697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek CompoundLiteralRegionKind = BEG_TYPED_VALUE_REGIONS, 92de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek CXXThisRegionKind, 9367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StringRegionKind, 9467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek ElementRegionKind, 9567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek // Decl Regions. 9667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BEG_DECL_REGIONS, 9767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek VarRegionKind = BEG_DECL_REGIONS, 9867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek FieldRegionKind, 9967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek ObjCIvarRegionKind, 1004fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu END_DECL_REGIONS = ObjCIvarRegionKind, 10102fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu CXXTempObjectRegionKind, 1024fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu CXXBaseObjectRegionKind, 103096aef9597b263b4cd6a0feaacf9e7214fa9c75aJordy Rose END_TYPED_VALUE_REGIONS = CXXBaseObjectRegionKind, 104096aef9597b263b4cd6a0feaacf9e7214fa9c75aJordy Rose END_TYPED_REGIONS = CXXBaseObjectRegionKind 10567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek }; 10667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 1079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate: 1089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const Kind kind; 1091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 1119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemRegion(Kind k) : kind(k) {} 1129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek virtual ~MemRegion(); 1139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 115a6275a534da701f37d19a068e6361e5f10f983a1Ted Kremenek ASTContext &getContext() const; 1161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek virtual void Profile(llvm::FoldingSetNodeID& ID) const = 0; 118a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 119a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek virtual MemRegionManager* getMemRegionManager() const = 0; 120a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 1219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek std::string getString() const; 1221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 123bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek const MemSpaceRegion *getMemorySpace() const; 1241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 125adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu const MemRegion *getBaseRegion() const; 126adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu 127479529e679957fbb92b56e116e3c86734429331eZhongxing Xu const MemRegion *StripCasts() const; 1281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1291508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek bool hasGlobalsOrParametersStorage() const; 1301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 131de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek bool hasStackStorage() const; 132de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 133de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek bool hasStackNonParametersStorage() const; 134de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 135de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek bool hasStackParametersStorage() const; 136b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 137e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu /// Compute the offset within the top level memory object. 138e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu RegionOffset getAsOffset() const; 139e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu 1408cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner virtual void dumpToStream(raw_ostream& os) const; 1417f39d29cb69e7488f994870800d548008e50e1cbTed Kremenek 1428800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek void dump() const; 1431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Kind getKind() const { return kind; } 1451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 146ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek template<typename RegionTy> const RegionTy* getAs() const; 1471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 148f0f0605c87739c906861f73d4287798a4969b1e0Zhongxing Xu virtual bool isBoundable() const { return false; } 149b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 1509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion*) { return true; } 1519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 1521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemSpaceRegion - A memory region that represents and "memory space"; 1549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// for example, the set of global variables, the stack frame, etc. 1559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemSpaceRegion : public MemRegion { 156a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenekprotected: 15767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 15867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 159a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek MemRegionManager *Mgr; 160a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 16167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek MemSpaceRegion(MemRegionManager *mgr, Kind k = GenericMemSpaceRegionKind) 16267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : MemRegion(k), Mgr(mgr) { 16367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek assert(classof(this)); 16467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 16567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 16667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek MemRegionManager* getMemRegionManager() const { return Mgr; } 1671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 16967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek bool isBoundable() const { return false; } 17067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 17167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek void Profile(llvm::FoldingSetNodeID &ID) const; 17267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 17367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 17467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek Kind k = R->getKind(); 17567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return k >= BEG_MEMSPACES && k <= END_MEMSPACES; 176a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek } 17767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 17867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 17967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass GlobalsSpaceRegion : public MemSpaceRegion { 180dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekprotected: 181dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek GlobalsSpaceRegion(MemRegionManager *mgr, Kind k) 182dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek : MemSpaceRegion(mgr, k) {} 183dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekpublic: 184dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek static bool classof(const MemRegion *R) { 185dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek Kind k = R->getKind(); 186dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek return k >= BEG_GLOBAL_MEMSPACES && k <= END_GLOBAL_MEMSPACES; 187dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek } 188dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek}; 189dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 190dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekclass StaticGlobalSpaceRegion : public GlobalsSpaceRegion { 19167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 192a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 193dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek const CodeTextRegion *CR; 194dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 195dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek StaticGlobalSpaceRegion(MemRegionManager *mgr, const CodeTextRegion *cr) 196dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek : GlobalsSpaceRegion(mgr, StaticGlobalSpaceRegionKind), CR(cr) {} 197dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 198dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekpublic: 199dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek void Profile(llvm::FoldingSetNodeID &ID) const; 200dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 2018cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner void dumpToStream(raw_ostream& os) const; 202fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek 203dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek const CodeTextRegion *getCodeRegion() const { return CR; } 204dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 205dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek static bool classof(const MemRegion *R) { 206dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek return R->getKind() == StaticGlobalSpaceRegionKind; 207dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek } 208dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek}; 209dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 210dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekclass NonStaticGlobalSpaceRegion : public GlobalsSpaceRegion { 211dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek friend class MemRegionManager; 212dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 213dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek NonStaticGlobalSpaceRegion(MemRegionManager *mgr) 214dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek : GlobalsSpaceRegion(mgr, NonStaticGlobalSpaceRegionKind) {} 215dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 2169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 217fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek 2188cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner void dumpToStream(raw_ostream& os) const; 219fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek 22067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 221dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek return R->getKind() == NonStaticGlobalSpaceRegionKind; 22267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 22367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 22467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 22567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass HeapSpaceRegion : public MemSpaceRegion { 22667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 22767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 22867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek HeapSpaceRegion(MemRegionManager *mgr) 22967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : MemSpaceRegion(mgr, HeapSpaceRegionKind) {} 23067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 23167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 23267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return R->getKind() == HeapSpaceRegionKind; 23367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 23467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 23567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 2362b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenekclass UnknownSpaceRegion : public MemSpaceRegion { 2372b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek friend class MemRegionManager; 2382b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek UnknownSpaceRegion(MemRegionManager *mgr) 2392b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek : MemSpaceRegion(mgr, UnknownSpaceRegionKind) {} 2402b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenekpublic: 2412b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek static bool classof(const MemRegion *R) { 2422b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek return R->getKind() == UnknownSpaceRegionKind; 2432b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek } 2442b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek}; 2452b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek 24667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackSpaceRegion : public MemSpaceRegion { 24767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate: 24867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackFrameContext *SFC; 2499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 25067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprotected: 25167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StackSpaceRegion(MemRegionManager *mgr, Kind k, const StackFrameContext *sfc) 25267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : MemSpaceRegion(mgr, k), SFC(sfc) { 25367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek assert(classof(this)); 25467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 25541168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek 25667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 25767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackFrameContext *getStackFrame() const { return SFC; } 25867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 25967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek void Profile(llvm::FoldingSetNodeID &ID) const; 26067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 26167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 26267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek Kind k = R->getKind(); 26367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return k >= StackLocalsSpaceRegionKind && 26467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek k <= StackArgumentsSpaceRegionKind; 26567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 26667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 26767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 26867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackLocalsSpaceRegion : public StackSpaceRegion { 26967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate: 27067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 27167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StackLocalsSpaceRegion(MemRegionManager *mgr, const StackFrameContext *sfc) 27267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : StackSpaceRegion(mgr, StackLocalsSpaceRegionKind, sfc) {} 27367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 27467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 27567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return R->getKind() == StackLocalsSpaceRegionKind; 27667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 27767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 27867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 27967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackArgumentsSpaceRegion : public StackSpaceRegion { 28067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate: 28167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 28267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StackArgumentsSpaceRegion(MemRegionManager *mgr, const StackFrameContext *sfc) 28367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : StackSpaceRegion(mgr, StackArgumentsSpaceRegionKind, sfc) {} 28467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 28567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 28667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return R->getKind() == StackArgumentsSpaceRegionKind; 2879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 2889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 2899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2907caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 291993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// SubRegion - A region that subsets another larger region. Most regions 292993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// are subclasses of SubRegion. 293993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass SubRegion : public MemRegion { 2949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 2951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const MemRegion* superRegion; 296993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek SubRegion(const MemRegion* sReg, Kind k) : MemRegion(k), superRegion(sReg) {} 2979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 2989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* getSuperRegion() const { 2999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return superRegion; 3009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 30232f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose /// getExtent - Returns the size of the region in bytes. 303c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek virtual DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const { 30432f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose return UnknownVal(); 30532f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose } 30632f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 307a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek MemRegionManager* getMemRegionManager() const; 3081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3097e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu bool isSubRegionOf(const MemRegion* R) const; 3101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 31267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return R->getKind() > END_MEMSPACES; 313993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek } 314993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek}; 3151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 31619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===// 31719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// MemRegion subclasses. 3181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump//===----------------------------------------------------------------------===// 319ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 32082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek/// AllocaRegion - A region that represents an untyped blob of bytes created 32182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek/// by a call to 'alloca'. 32282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekclass AllocaRegion : public SubRegion { 32382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek friend class MemRegionManager; 32482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekprotected: 32582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek unsigned Cnt; // Block counter. Used to distinguish different pieces of 32682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek // memory allocated by alloca at the same call site. 32782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek const Expr* Ex; 32882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 3297ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek AllocaRegion(const Expr* ex, unsigned cnt, const MemRegion *superRegion) 33082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek : SubRegion(superRegion, AllocaRegionKind), Cnt(cnt), Ex(ex) {} 3311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 33282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekpublic: 3331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 33482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek const Expr* getExpr() const { return Ex; } 3359852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu 3369852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu bool isBoundable() const { return true; } 3379852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu 338c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const; 33932f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 34082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 34182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 34282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Expr* Ex, 3437ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek unsigned Cnt, const MemRegion *superRegion); 3441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3458cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner void dumpToStream(raw_ostream& os) const; 3461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek static bool classof(const MemRegion* R) { 34882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek return R->getKind() == AllocaRegionKind; 34982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek } 3501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}; 3511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 352993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// TypedRegion - An abstract class representing regions that are typed. 353993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass TypedRegion : public SubRegion { 354993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekprotected: 355993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek TypedRegion(const MemRegion* sReg, Kind k) : SubRegion(sReg, k) {} 3561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 357993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekpublic: 3589697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek virtual QualType getLocationType() const = 0; 3599697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek 3609697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek QualType getDesugaredLocationType(ASTContext &Context) const { 3619697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek return getLocationType().getDesugaredType(Context); 3629697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek } 3639697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek 3649697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek bool isBoundable() const { return true; } 3659697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek 3669697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek static bool classof(const MemRegion* R) { 3679697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek unsigned k = R->getKind(); 3689697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek return k >= BEG_TYPED_REGIONS && k <= END_TYPED_REGIONS; 3699697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek } 3709697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek}; 3719697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek 3729697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek/// TypedValueRegion - An abstract class representing regions having a typed value. 3739697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass TypedValueRegion : public TypedRegion { 3749697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekprotected: 3759697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek TypedValueRegion(const MemRegion* sReg, Kind k) : TypedRegion(sReg, k) {} 3769697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek 3779697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekpublic: 378018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu virtual QualType getValueType() const = 0; 3791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 380018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu virtual QualType getLocationType() const { 3816eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek // FIXME: We can possibly optimize this later to cache this value. 382a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek QualType T = getValueType(); 383a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek ASTContext &ctx = getContext(); 384a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek if (T->getAs<ObjCObjectType>()) 385a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek return ctx.getObjCObjectPointerType(T); 386a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek return ctx.getPointerType(getValueType()); 3876eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek } 3881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 38949f4e1cbd839da27ff4814b4ea6d85a79f786cbdJohn McCall QualType getDesugaredValueType(ASTContext &Context) const { 390018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType T = getValueType(); 3911ab55e9bb87d98bff1d42c7a0ee502c64755d9f5Douglas Gregor return T.getTypePtrOrNull() ? T.getDesugaredType(Context) : T; 39214553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek } 3931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 394993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek static bool classof(const MemRegion* R) { 3959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek unsigned k = R->getKind(); 3969697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek return k >= BEG_TYPED_VALUE_REGIONS && k <= END_TYPED_VALUE_REGIONS; 3979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 3999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 400ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 401eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass CodeTextRegion : public TypedRegion { 402eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekprotected: 403eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek CodeTextRegion(const MemRegion *sreg, Kind k) : TypedRegion(sreg, k) {} 404ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xupublic: 405eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek bool isBoundable() const { return false; } 406eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 407eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek static bool classof(const MemRegion* R) { 408eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek Kind k = R->getKind(); 409eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return k >= FunctionTextRegionKind && k <= BlockTextRegionKind; 410eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek } 411eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek}; 412ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 413eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek/// FunctionTextRegion - A region that represents code texts of function. 414eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass FunctionTextRegion : public CodeTextRegion { 415eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek const FunctionDecl *FD; 416eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekpublic: 417eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek FunctionTextRegion(const FunctionDecl* fd, const MemRegion* sreg) 418eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek : CodeTextRegion(sreg, FunctionTextRegionKind), FD(fd) {} 419eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 420018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getLocationType() const { 421018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu return getContext().getPointerType(FD->getType()); 422ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu } 423eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 424abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek const FunctionDecl *getDecl() const { 425abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek return FD; 42672e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek } 427eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 4288cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner virtual void dumpToStream(raw_ostream& os) const; 429eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 430ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const; 431eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 432abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const FunctionDecl *FD, 433abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek const MemRegion*); 434eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 435ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu static bool classof(const MemRegion* R) { 436eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return R->getKind() == FunctionTextRegionKind; 437eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek } 438eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek}; 439eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 440eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 441eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek/// BlockTextRegion - A region that represents code texts of blocks (closures). 4420a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// Blocks are represented with two kinds of regions. BlockTextRegions 4430a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// represent the "code", while BlockDataRegions represent instances of blocks, 4440a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// which correspond to "code+data". The distinction is important, because 4450a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// like a closure a block captures the values of externally referenced 4460a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// variables. 447eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass BlockTextRegion : public CodeTextRegion { 44867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 44967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 450eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek const BlockDecl *BD; 45167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek AnalysisContext *AC; 452eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek CanQualType locTy; 45367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 45467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BlockTextRegion(const BlockDecl *bd, CanQualType lTy, 45567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek AnalysisContext *ac, const MemRegion* sreg) 45667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : CodeTextRegion(sreg, BlockTextRegionKind), BD(bd), AC(ac), locTy(lTy) {} 45767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 45867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 459018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getLocationType() const { 460eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return locTy; 461eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek } 462eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 463eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek const BlockDecl *getDecl() const { 464eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return BD; 465eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek } 46667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 46767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek AnalysisContext *getAnalysisContext() const { return AC; } 468eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 4698cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner virtual void dumpToStream(raw_ostream& os) const; 470eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 471eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 472eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 473eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const BlockDecl *BD, 47467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek CanQualType, const AnalysisContext*, 47567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const MemRegion*); 476eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 477eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek static bool classof(const MemRegion* R) { 478eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return R->getKind() == BlockTextRegionKind; 479ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu } 480ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu}; 4810a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 4820a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// BlockDataRegion - A region that represents a block instance. 4830a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// Blocks are represented with two kinds of regions. BlockTextRegions 4840a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// represent the "code", while BlockDataRegions represent instances of blocks, 4850a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// which correspond to "code+data". The distinction is important, because 4860a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// like a closure a block captures the values of externally referenced 4870a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// variables. 4880a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenekclass BlockDataRegion : public SubRegion { 48967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 4900a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek const BlockTextRegion *BC; 49167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *LC; // Can be null */ 4924240096011a187807058f887eb81df750ffa17feTed Kremenek void *ReferencedVars; 49367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 49467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BlockDataRegion(const BlockTextRegion *bc, const LocationContext *lc, 4950a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek const MemRegion *sreg) 4964240096011a187807058f887eb81df750ffa17feTed Kremenek : SubRegion(sreg, BlockDataRegionKind), BC(bc), LC(lc), ReferencedVars(0) {} 4970a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 49867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 4990a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek const BlockTextRegion *getCodeRegion() const { return BC; } 5004240096011a187807058f887eb81df750ffa17feTed Kremenek 501d02e83a548359df978f40cc1a52ffd78b7ef371bTed Kremenek const BlockDecl *getDecl() const { return BC->getDecl(); } 502d02e83a548359df978f40cc1a52ffd78b7ef371bTed Kremenek 50381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek class referenced_vars_iterator { 50481cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek const MemRegion * const *R; 50581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek public: 50681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek explicit referenced_vars_iterator(const MemRegion * const *r) : R(r) {} 50781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek 50881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek operator const MemRegion * const *() const { 50981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return R; 51081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 51181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek 51281cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek const VarRegion* operator*() const { 51381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return cast<VarRegion>(*R); 51481cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 51581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek 51681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek bool operator==(const referenced_vars_iterator &I) const { 51781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return I.R == R; 51881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 51981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek bool operator!=(const referenced_vars_iterator &I) const { 52081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return I.R != R; 52181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 52281cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek referenced_vars_iterator& operator++() { 52381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek ++R; 52481cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return *this; 52581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 52681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek }; 52781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek 5284240096011a187807058f887eb81df750ffa17feTed Kremenek referenced_vars_iterator referenced_vars_begin() const; 5294240096011a187807058f887eb81df750ffa17feTed Kremenek referenced_vars_iterator referenced_vars_end() const; 5300a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 5318cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner virtual void dumpToStream(raw_ostream& os) const; 5320a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 5330a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 5340a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 53567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID&, const BlockTextRegion *, 53667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *, const MemRegion *); 5370a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 5380a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek static bool classof(const MemRegion* R) { 5390a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek return R->getKind() == BlockDataRegionKind; 5400a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek } 5414240096011a187807058f887eb81df750ffa17feTed Kremenekprivate: 5424240096011a187807058f887eb81df750ffa17feTed Kremenek void LazyInitializeReferencedVars(); 5430a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek}; 544ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 545026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// SymbolicRegion - A special, "non-concrete" region. Unlike other region 546026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// clases, SymbolicRegion represents a region that serves as an alias for 547026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// either a real region, a NULL pointer, etc. It essentially is used to 548026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// map the concept of symbolic values into the domain of regions. Symbolic 549026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// regions do not need to be typed. 550e8e86482da4c1872673bbb9c237649229d19793bTed Kremenekclass SymbolicRegion : public SubRegion { 551026c66395b88a09437319139a43b090093f7e1ddZhongxing Xuprotected: 552026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu const SymbolRef sym; 553026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 554026c66395b88a09437319139a43b090093f7e1ddZhongxing Xupublic: 5551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SymbolicRegion(const SymbolRef s, const MemRegion* sreg) 556e8e86482da4c1872673bbb9c237649229d19793bTed Kremenek : SubRegion(sreg, SymbolicRegionKind), sym(s) {} 5571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 558026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu SymbolRef getSymbol() const { 559026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu return sym; 560026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu } 561026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 5629852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu bool isBoundable() const { return true; } 5639852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu 564c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const; 56532f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 566026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const; 567026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 568250101353b711a409b075f1bc11070dddec7100bTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, 569250101353b711a409b075f1bc11070dddec7100bTed Kremenek SymbolRef sym, 570250101353b711a409b075f1bc11070dddec7100bTed Kremenek const MemRegion* superRegion); 5711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5728cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner void dumpToStream(raw_ostream& os) const; 5731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 574026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu static bool classof(const MemRegion* R) { 575026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu return R->getKind() == SymbolicRegionKind; 576026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu } 5771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}; 578026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 579e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu/// StringRegion - Region associated with a StringLiteral. 5809697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass StringRegion : public TypedValueRegion { 581e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu friend class MemRegionManager; 582e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const StringLiteral* Str; 583e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuprotected: 584e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 585250101353b711a409b075f1bc11070dddec7100bTed Kremenek StringRegion(const StringLiteral* str, const MemRegion* sreg) 5869697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sreg, StringRegionKind), Str(str) {} 587e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 588e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID& ID, 589e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const StringLiteral* Str, 590e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const MemRegion* superRegion); 591e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 592e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xupublic: 5936613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu 5946613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu const StringLiteral* getStringLiteral() const { return Str; } 5951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 596018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 597ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu return Str->getType(); 598ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu } 599e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 600c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const; 60132f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 6020a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu bool isBoundable() const { return false; } 6030a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu 604e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const { 605e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu ProfileRegion(ID, Str, superRegion); 606e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 607e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 6088cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner void dumpToStream(raw_ostream& os) const; 609cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu 610e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static bool classof(const MemRegion* R) { 611e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu return R->getKind() == StringRegionKind; 612e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 613e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu}; 614e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 615329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// CompoundLiteralRegion - A memory region representing a compound literal. 616329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// Compound literals are essentially temporaries that are stack allocated 617329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// or in the global constant pool. 6189697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CompoundLiteralRegion : public TypedValueRegion { 619329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekprivate: 620329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek friend class MemRegionManager; 621329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek const CompoundLiteralExpr* CL; 622329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 623329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek CompoundLiteralRegion(const CompoundLiteralExpr* cl, const MemRegion* sReg) 6249697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sReg, CompoundLiteralRegionKind), CL(cl) {} 6251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 626329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, 627329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek const CompoundLiteralExpr* CL, 628329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek const MemRegion* superRegion); 629329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekpublic: 630018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 631018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu return CL->getType(); 63277cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu } 6330a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu 6349a08fee80a34938b8c11c7166e009a89ced4c2b4Zhongxing Xu bool isBoundable() const { return !CL->isFileScope(); } 6359a08fee80a34938b8c11c7166e009a89ced4c2b4Zhongxing Xu 636329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 6371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6388cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner void dumpToStream(raw_ostream& os) const; 639329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 64011a83dc7a9a5738cc0bc76180b508eae896eefa9Ted Kremenek const CompoundLiteralExpr* getLiteralExpr() const { return CL; } 6411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 642329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek static bool classof(const MemRegion* R) { 643329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek return R->getKind() == CompoundLiteralRegionKind; 644329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek } 645329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek}; 646178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 6479697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass DeclRegion : public TypedValueRegion { 6489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 6499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const Decl* D; 6509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 651993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek DeclRegion(const Decl* d, const MemRegion* sReg, Kind k) 6529697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sReg, k), D(d) {} 6539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 6549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl* D, 6559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion, Kind k); 6561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 657bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xupublic: 658bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xu const Decl* getDecl() const { return D; } 6599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 6601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 661c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const; 66232f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 663e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static bool classof(const MemRegion* R) { 664e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu unsigned k = R->getKind(); 66567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return k >= BEG_DECL_REGIONS && k <= END_DECL_REGIONS; 666e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 6679e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 6681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass VarRegion : public DeclRegion { 6709e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 671d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek 672d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek // Constructors and private methods. 67367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek VarRegion(const VarDecl* vd, const MemRegion* sReg) 67467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : DeclRegion(vd, sReg, VarRegionKind) {} 6759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 676250101353b711a409b075f1bc11070dddec7100bTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const VarDecl* VD, 677d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek const MemRegion *superRegion) { 6789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, VD, superRegion, VarRegionKind); 6799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 6801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 681d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 6821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic: 684d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek const VarDecl *getDecl() const { return cast<VarDecl>(D); } 6851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6865348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek const StackFrameContext *getStackFrame() const; 6875348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek 688018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 6896eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek // FIXME: We can cache this if needed. 690018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu return getDecl()->getType(); 6911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 6921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6938cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner void dumpToStream(raw_ostream& os) const; 6941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 6969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == VarRegionKind; 6971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 6989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 699de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 700de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek/// CXXThisRegion - Represents the region for the implicit 'this' parameter 701de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek/// in a call to a C++ method. This region doesn't represent the object 702de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek/// referred to by 'this', but rather 'this' itself. 7039697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CXXThisRegion : public TypedValueRegion { 704de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek friend class MemRegionManager; 705de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek CXXThisRegion(const PointerType *thisPointerTy, 706de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const MemRegion *sReg) 7079697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sReg, CXXThisRegionKind), ThisPointerTy(thisPointerTy) {} 708de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 709de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID &ID, 710de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const PointerType *PT, 711de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const MemRegion *sReg); 712de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 713de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek void Profile(llvm::FoldingSetNodeID &ID) const; 714de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 715de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekpublic: 716018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 717de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek return QualType(ThisPointerTy, 0); 718de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek } 7197caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 7208cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner void dumpToStream(raw_ostream& os) const; 721de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 722de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek static bool classof(const MemRegion* R) { 723de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek return R->getKind() == CXXThisRegionKind; 724de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek } 725de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 726de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekprivate: 727de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const PointerType *ThisPointerTy; 728de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek}; 7299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 7309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass FieldRegion : public DeclRegion { 7319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 7329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 733993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek FieldRegion(const FieldDecl* fd, const MemRegion* sReg) 7349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(fd, sReg, FieldRegionKind) {} 7359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 7364bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenekpublic: 7371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7388cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner void dumpToStream(raw_ostream& os) const; 7391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7404bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek const FieldDecl* getDecl() const { return cast<FieldDecl>(D); } 7411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 742018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 7436eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek // FIXME: We can cache this if needed. 744018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu return getDecl()->getType(); 7451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 7464bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek 747c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const; 74832f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 7496304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const FieldDecl* FD, 7506304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek const MemRegion* superRegion) { 7519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, FD, superRegion, FieldRegionKind); 7529e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 7531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 7559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == FieldRegionKind; 7569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 7579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 7581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass ObjCIvarRegion : public DeclRegion { 7601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 7621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 763993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek ObjCIvarRegion(const ObjCIvarDecl* ivd, const MemRegion* sReg) 7649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(ivd, sReg, ObjCIvarRegionKind) {} 7659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 7666304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const ObjCIvarDecl* ivd, 7676304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek const MemRegion* superRegion) { 7689e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCIvarRegionKind); 7699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 7701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7719e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 7729e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const ObjCIvarDecl* getDecl() const { return cast<ObjCIvarDecl>(D); } 773018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { return getDecl()->getType(); } 7741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7758cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner void dumpToStream(raw_ostream& os) const; 7761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 7789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == ObjCIvarRegionKind; 7799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 7809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 7817caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu//===----------------------------------------------------------------------===// 782fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner// Auxiliary data classes for use with MemRegions. 7837caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu//===----------------------------------------------------------------------===// 7847caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 7857caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuclass ElementRegion; 7867caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 7877caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuclass RegionRawOffset { 7887caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuprivate: 7897caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu friend class ElementRegion; 7907caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 7917caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu const MemRegion *Region; 7929ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck CharUnits Offset; 7937caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 7949ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck RegionRawOffset(const MemRegion* reg, CharUnits offset = CharUnits::Zero()) 7957caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu : Region(reg), Offset(offset) {} 7967caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 7977caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xupublic: 7987caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu // FIXME: Eventually support symbolic offsets. 7999ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck CharUnits getOffset() const { return Offset; } 8007caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu const MemRegion *getRegion() const { return Region; } 8017caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 8028cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner void dumpToStream(raw_ostream& os) const; 8037caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu void dump() const; 8047caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu}; 805511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 8069697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass ElementRegion : public TypedValueRegion { 807511191ce8920160525611be2be754c32a0724c3eZhongxing Xu friend class MemRegionManager; 808511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 809f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek QualType ElementType; 81002282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek NonLoc Index; 811511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 81202282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek ElementRegion(QualType elementType, NonLoc Idx, const MemRegion* sReg) 8139697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sReg, ElementRegionKind), 814f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek ElementType(elementType), Index(Idx) { 8153d8173c1c68f451c7492f92023d829c626845925Chris Lattner assert((!isa<nonloc::ConcreteInt>(&Idx) || 8163d8173c1c68f451c7492f92023d829c626845925Chris Lattner cast<nonloc::ConcreteInt>(&Idx)->getValue().isSigned()) && 81743b28d07019bc78447ecbbb721526de4ffd83f20Chris Lattner "The index must be signed"); 8180395b5d4987fe5baa818015e9d294c128619e4ecZhongxing Xu } 8191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 820f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, QualType elementType, 821f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek SVal Idx, const MemRegion* superRegion); 822511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 823511191ce8920160525611be2be754c32a0724c3eZhongxing Xupublic: 824511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 82502282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek NonLoc getIndex() const { return Index; } 8266e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu 827018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 828f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek return ElementType; 829f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek } 8301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 831f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek QualType getElementType() const { 832f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek return ElementType; 833abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek } 8347caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu /// Compute the offset within the array. The array might also be a subobject. 8357caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu RegionRawOffset getAsArrayOffset() const; 8361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8378cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner void dumpToStream(raw_ostream& os) const; 838b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 839511191ce8920160525611be2be754c32a0724c3eZhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const; 840511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 841511191ce8920160525611be2be754c32a0724c3eZhongxing Xu static bool classof(const MemRegion* R) { 842511191ce8920160525611be2be754c32a0724c3eZhongxing Xu return R->getKind() == ElementRegionKind; 843511191ce8920160525611be2be754c32a0724c3eZhongxing Xu } 844511191ce8920160525611be2be754c32a0724c3eZhongxing Xu}; 84519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 846bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu// C++ temporary object associated with an expression. 8479697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CXXTempObjectRegion : public TypedValueRegion { 848bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu friend class MemRegionManager; 849bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 850bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu Expr const *Ex; 851bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 85202fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu CXXTempObjectRegion(Expr const *E, MemRegion const *sReg) 8539697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sReg, CXXTempObjectRegionKind), Ex(E) {} 854bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 855bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID &ID, 856bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu Expr const *E, const MemRegion *sReg); 857bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 858bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xupublic: 859018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 860bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu return Ex->getType(); 861bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu } 862bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 8638cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner void dumpToStream(raw_ostream& os) const; 864e1aeb13251a4858724d2b7ad1925d25076f23d08Zhongxing Xu 865bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu void Profile(llvm::FoldingSetNodeID &ID) const; 866bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 867bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu static bool classof(const MemRegion* R) { 86802fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu return R->getKind() == CXXTempObjectRegionKind; 869bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu } 870bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu}; 871bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 8724fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu// CXXBaseObjectRegion represents a base object within a C++ object. It is 8734fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu// identified by the base class declaration and the region of its parent object. 8749697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CXXBaseObjectRegion : public TypedValueRegion { 8754fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu friend class MemRegionManager; 8764fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 8774fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu const CXXRecordDecl *decl; 8784fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 8794fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu CXXBaseObjectRegion(const CXXRecordDecl *d, const MemRegion *sReg) 8809697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sReg, CXXBaseObjectRegionKind), decl(d) {} 8814fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 8824fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID &ID, 8834fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu const CXXRecordDecl *decl, const MemRegion *sReg); 8844fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 8854fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xupublic: 886d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu const CXXRecordDecl *getDecl() const { return decl; } 887d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu 8884fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu QualType getValueType() const; 8894fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 8908cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner void dumpToStream(raw_ostream& os) const; 8914fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 8924fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu void Profile(llvm::FoldingSetNodeID &ID) const; 8934fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 8944fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu static bool classof(const MemRegion *region) { 8954fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu return region->getKind() == CXXBaseObjectRegionKind; 8964fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu } 8974fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu}; 8984fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 899ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenektemplate<typename RegionTy> 900ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenekconst RegionTy* MemRegion::getAs() const { 901f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek if (const RegionTy* RT = dyn_cast<RegionTy>(this)) 902f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek return RT; 9031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 904f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek return NULL; 905ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek} 906511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 9079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 9089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager - Factory object for creating regions. 9099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 9109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 9119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager { 912a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek ASTContext &C; 9139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek llvm::BumpPtrAllocator& A; 9149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek llvm::FoldingSet<MemRegion> Regions; 9151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 916dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek NonStaticGlobalSpaceRegion *globals; 9172b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek 918c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu llvm::DenseMap<const StackFrameContext *, StackLocalsSpaceRegion *> 919c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu StackLocalsSpaceRegions; 920c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu llvm::DenseMap<const StackFrameContext *, StackArgumentsSpaceRegion *> 921c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu StackArgumentsSpaceRegions; 922dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek llvm::DenseMap<const CodeTextRegion *, StaticGlobalSpaceRegion *> 923dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek StaticsGlobalSpaceRegions; 9242b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek 92567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek HeapSpaceRegion *heap; 9262b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek UnknownSpaceRegion *unknown; 927d05552a21377f493c882298c59e8829040b01d34Ted Kremenek MemSpaceRegion *code; 928dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 9299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 930a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek MemRegionManager(ASTContext &c, llvm::BumpPtrAllocator& a) 931c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu : C(c), A(a), globals(0), heap(0), unknown(0), code(0) {} 9321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9334240096011a187807058f887eb81df750ffa17feTed Kremenek ~MemRegionManager(); 9341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 935a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek ASTContext &getContext() { return C; } 9364240096011a187807058f887eb81df750ffa17feTed Kremenek 9374240096011a187807058f887eb81df750ffa17feTed Kremenek llvm::BumpPtrAllocator &getAllocator() { return A; } 9381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 93967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// getStackLocalsRegion - Retrieve the memory region associated with the 94067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// specified stack frame. 94167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackLocalsSpaceRegion * 94267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek getStackLocalsRegion(const StackFrameContext *STC); 943d05552a21377f493c882298c59e8829040b01d34Ted Kremenek 944d05552a21377f493c882298c59e8829040b01d34Ted Kremenek /// getStackArgumentsRegion - Retrieve the memory region associated with 94567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// function/method arguments of the specified stack frame. 94667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackArgumentsSpaceRegion * 94767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek getStackArgumentsRegion(const StackFrameContext *STC); 9481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getGlobalsRegion - Retrieve the memory region associated with 950dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek /// global variables. 951dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek const GlobalsSpaceRegion *getGlobalsRegion(const CodeTextRegion *R = 0); 9521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getHeapRegion - Retrieve the memory region associated with the 9549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// generic "heap". 95567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const HeapSpaceRegion *getHeapRegion(); 956178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 957178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu /// getUnknownRegion - Retrieve the memory region associated with unknown 958178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu /// memory space. 959b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemSpaceRegion *getUnknownRegion(); 960c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu 961b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemSpaceRegion *getCodeRegion(); 962ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 9637090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek /// getAllocaRegion - Retrieve a region associated with a call to alloca(). 96467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const AllocaRegion *getAllocaRegion(const Expr* Ex, unsigned Cnt, 96567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *LC); 9661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 967329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek /// getCompoundLiteralRegion - Retrieve the region associated with a 968329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek /// given CompoundLiteral. 969b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const CompoundLiteralRegion* 97067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek getCompoundLiteralRegion(const CompoundLiteralExpr* CL, 97167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *LC); 972de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 973fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner /// getCXXThisRegion - Retrieve the [artificial] region associated with the 974de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek /// parameter 'this'. 975de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const CXXThisRegion *getCXXThisRegion(QualType thisPointerTy, 976de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const LocationContext *LC); 9771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 978993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek /// getSymbolicRegion - Retrieve or create a "symbolic" memory region. 979b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const SymbolicRegion* getSymbolicRegion(SymbolRef sym); 980e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 981b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const StringRegion* getStringRegion(const StringLiteral* Str); 982e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 9839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getVarRegion - Retrieve or create the memory region associated with 984d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek /// a specified VarDecl and LocationContext. 985b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const VarRegion* getVarRegion(const VarDecl *D, const LocationContext *LC); 9861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 98767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// getVarRegion - Retrieve or create the memory region associated with 98867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// a specified VarDecl and super region. 98967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const VarRegion* getVarRegion(const VarDecl *D, const MemRegion *superR); 99067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 991f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek /// getElementRegion - Retrieve the memory region associated with the 992f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek /// associated element type, index, and super region. 99302282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek const ElementRegion *getElementRegion(QualType elementType, NonLoc Idx, 994856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu const MemRegion *superRegion, 995856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu ASTContext &Ctx); 9961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 997b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const ElementRegion *getElementRegionWithSuper(const ElementRegion *ER, 998856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu const MemRegion *superRegion) { 999a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek return getElementRegion(ER->getElementType(), ER->getIndex(), 1000a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek superRegion, ER->getContext()); 1001a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek } 1002511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 10039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getFieldRegion - Retrieve or create the memory region associated with 10049e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a specified FieldDecl. 'superRegion' corresponds to the containing 10059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// memory region (which typically represents the memory representing 10069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a structure or class). 1007b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const FieldRegion *getFieldRegion(const FieldDecl* fd, 1008b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemRegion* superRegion); 10091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1010b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const FieldRegion *getFieldRegionWithSuper(const FieldRegion *FR, 1011b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemRegion *superRegion) { 1012a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek return getFieldRegion(FR->getDecl(), superRegion); 1013a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek } 10141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 10159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getObjCIvarRegion - Retrieve or create the memory region associated with 10169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a specified Objective-c instance variable. 'superRegion' corresponds 10179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// to the containing region (which typically represents the Objective-C 10189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// object). 1019b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const ObjCIvarRegion *getObjCIvarRegion(const ObjCIvarDecl* ivd, 1020b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemRegion* superRegion); 10211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 102202fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu const CXXTempObjectRegion *getCXXTempObjectRegion(Expr const *Ex, 102302fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu LocationContext const *LC); 1024bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 10254fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu const CXXBaseObjectRegion *getCXXBaseObjectRegion(const CXXRecordDecl *decl, 10264fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu const MemRegion *superRegion); 10274fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 1028d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu /// Create a CXXBaseObjectRegion with the same CXXRecordDecl but a different 1029d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu /// super region. 1030d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu const CXXBaseObjectRegion * 1031d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu getCXXBaseObjectRegionWithSuper(const CXXBaseObjectRegion *baseReg, 1032d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu const MemRegion *superRegion) { 1033d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu return getCXXBaseObjectRegion(baseReg->getDecl(), superRegion); 1034d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu } 1035d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu 1036b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const FunctionTextRegion *getFunctionTextRegion(const FunctionDecl *FD); 1037b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const BlockTextRegion *getBlockTextRegion(const BlockDecl *BD, 103867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek CanQualType locTy, 103967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek AnalysisContext *AC); 104067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 104167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// getBlockDataRegion - Get the memory region associated with an instance 104267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// of a block. Unlike many other MemRegions, the LocationContext* 104367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// argument is allowed to be NULL for cases where we have no known 104467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// context. 1045b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const BlockDataRegion *getBlockDataRegion(const BlockTextRegion *bc, 104667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *lc = NULL); 10471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1048bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek bool isGlobalsRegion(const MemRegion* R) { 1049bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek assert(R); 1050bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek return R == globals; 1051bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek } 1052bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek 1053bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenekprivate: 1054250101353b711a409b075f1bc11070dddec7100bTed Kremenek template <typename RegionTy, typename A1> 1055250101353b711a409b075f1bc11070dddec7100bTed Kremenek RegionTy* getRegion(const A1 a1); 10561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 10576304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek template <typename RegionTy, typename A1> 1058eeea45611d45238c34474c183cee96d47ae79e24Ted Kremenek RegionTy* getSubRegion(const A1 a1, const MemRegion* superRegion); 10591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 10607ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek template <typename RegionTy, typename A1, typename A2> 10617ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek RegionTy* getRegion(const A1 a1, const A2 a2); 1062dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 10630a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek template <typename RegionTy, typename A1, typename A2> 10640a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek RegionTy* getSubRegion(const A1 a1, const A2 a2, 10650a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek const MemRegion* superRegion); 10660a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 106767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek template <typename RegionTy, typename A1, typename A2, typename A3> 106867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek RegionTy* getSubRegion(const A1 a1, const A2 a2, const A3 a3, 106967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const MemRegion* superRegion); 107067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 107167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek template <typename REG> 107267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const REG* LazyAllocate(REG*& region); 107367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 107467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek template <typename REG, typename ARG> 107567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const REG* LazyAllocate(REG*& region, ARG a); 1076ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek}; 10771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1078250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 1079a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek// Out-of-line member definitions. 1080250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 1081250101353b711a409b075f1bc11070dddec7100bTed Kremenek 1082a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenekinline ASTContext& MemRegion::getContext() const { 1083a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek return getMemRegionManager()->getContext(); 1084a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek} 1085eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 10865a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis} // end GR namespace 10875a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis 1088be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end clang namespace 10899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1090250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 1091250101353b711a409b075f1bc11070dddec7100bTed Kremenek// Pretty-printing regions. 1092250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 1093250101353b711a409b075f1bc11070dddec7100bTed Kremenek 1094be91224894e1501133e224934285ba6440bf5b59Ted Kremeneknamespace llvm { 10958800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenekstatic inline raw_ostream& operator<<(raw_ostream& os, 10969ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremenek const clang::ento::MemRegion* R) { 10978800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek R->dumpToStream(os); 10988800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek return os; 1099be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} 1100be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end llvm namespace 11019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 11029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#endif 1103