MemRegion.h revision 2b87ae45e129b941d0a4d221c9d4842385a119bd
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 169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#ifndef LLVM_CLANG_ANALYSIS_MEMREGION_H 179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#define LLVM_CLANG_ANALYSIS_MEMREGION_H 189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 19993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek#include "clang/AST/Decl.h" 20993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek#include "clang/AST/DeclObjC.h" 21993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek#include "clang/Analysis/PathSensitive/SymbolManager.h" 2222ab7a4d900ed53285fd0b6720e7b43af84724d8Zhongxing Xu#include "clang/Analysis/PathSensitive/SVals.h" 23a693d4fa7a6dc31b23837cf38cba7aa2af8f00f3Ted Kremenek#include "clang/AST/ASTContext.h" 249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/Support/Casting.h" 259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/ADT/FoldingSet.h" 26dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu#include "llvm/ADT/ImmutableList.h" 27dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu#include "llvm/ADT/ImmutableMap.h" 289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/Support/Allocator.h" 299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include <string> 309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremeneknamespace llvm { class raw_ostream; } 329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremeneknamespace clang { 341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager; 36d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenekclass MemSpaceRegion; 37d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenekclass LocationContext; 3867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackFrameContext; 394240096011a187807058f887eb81df750ffa17feTed Kremenekclass VarRegion; 401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===// 4219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// Base region classes. 4319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===// 441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemRegion - The root abstract class for all memory regions. 469e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegion : public llvm::FoldingSetNode { 474240096011a187807058f887eb81df750ffa17feTed Kremenek friend class MemRegionManager; 489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 4967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek enum Kind { 5067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek // Memory spaces. 5167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BEG_MEMSPACES, 5267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek GenericMemSpaceRegionKind = BEG_MEMSPACES, 5367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StackLocalsSpaceRegionKind, 5467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StackArgumentsSpaceRegionKind, 5567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek HeapSpaceRegionKind, 562b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek UnknownSpaceRegionKind, 5767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek GlobalsSpaceRegionKind, 5867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek END_MEMSPACES = GlobalsSpaceRegionKind, 5967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek // Untyped regions. 6067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek SymbolicRegionKind, 6167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek AllocaRegionKind, 6267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek // Typed regions. 6367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BEG_TYPED_REGIONS, 6467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek FunctionTextRegionKind = BEG_TYPED_REGIONS, 6567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BlockTextRegionKind, 6667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BlockDataRegionKind, 6767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek CompoundLiteralRegionKind, 6867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StringRegionKind, 6967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek ElementRegionKind, 7067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek // Decl Regions. 7167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BEG_DECL_REGIONS, 7267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek VarRegionKind = BEG_DECL_REGIONS, 7367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek FieldRegionKind, 7467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek ObjCIvarRegionKind, 7567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek ObjCObjectRegionKind, 7667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek END_DECL_REGIONS = ObjCObjectRegionKind, 7767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek END_TYPED_REGIONS = END_DECL_REGIONS 7867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek }; 7967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate: 819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const Kind kind; 821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemRegion(Kind k) : kind(k) {} 859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek virtual ~MemRegion(); 869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 88a6275a534da701f37d19a068e6361e5f10f983a1Ted Kremenek ASTContext &getContext() const; 891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek virtual void Profile(llvm::FoldingSetNodeID& ID) const = 0; 91a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 92a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek virtual MemRegionManager* getMemRegionManager() const = 0; 93a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek std::string getString() const; 951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 96bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek const MemSpaceRegion *getMemorySpace() const; 971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 98adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu const MemRegion *getBaseRegion() const; 99adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu 100479529e679957fbb92b56e116e3c86734429331eZhongxing Xu const MemRegion *StripCasts() const; 1011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 102ea20cd74793d257679267032419a9ff7fc89dc05Ted Kremenek bool hasStackStorage() const; 1031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1041508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek bool hasParametersStorage() const; 1051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1061508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek bool hasGlobalsStorage() const; 1071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1081508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek bool hasGlobalsOrParametersStorage() const; 1091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 110ea20cd74793d257679267032419a9ff7fc89dc05Ted Kremenek bool hasHeapStorage() const; 1111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 112bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek bool hasHeapOrStackStorage() const; 113b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 1148800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek virtual void dumpToStream(llvm::raw_ostream& os) const; 1157f39d29cb69e7488f994870800d548008e50e1cbTed Kremenek 1168800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek void dump() const; 1171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Kind getKind() const { return kind; } 1191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 120ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek template<typename RegionTy> const RegionTy* getAs() const; 1211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 122f0f0605c87739c906861f73d4287798a4969b1e0Zhongxing Xu virtual bool isBoundable() const { return false; } 123b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 1249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion*) { return true; } 1259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 1261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemSpaceRegion - A memory region that represents and "memory space"; 1289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// for example, the set of global variables, the stack frame, etc. 1299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemSpaceRegion : public MemRegion { 130a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenekprotected: 13167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 13267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 133a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek MemRegionManager *Mgr; 134a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 13567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek MemSpaceRegion(MemRegionManager *mgr, Kind k = GenericMemSpaceRegionKind) 13667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : MemRegion(k), Mgr(mgr) { 13767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek assert(classof(this)); 13867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 13967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 14067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek MemRegionManager* getMemRegionManager() const { return Mgr; } 1411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 14267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 14367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek bool isBoundable() const { return false; } 14467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 14567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek void Profile(llvm::FoldingSetNodeID &ID) const; 14667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 14767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 14867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek Kind k = R->getKind(); 14967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return k >= BEG_MEMSPACES && k <= END_MEMSPACES; 150a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek } 15167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 15267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 15367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass GlobalsSpaceRegion : public MemSpaceRegion { 15467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 155a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 15667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek GlobalsSpaceRegion(MemRegionManager *mgr) 15767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : MemSpaceRegion(mgr, GlobalsSpaceRegionKind) {} 1589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 15967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 16067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return R->getKind() == GlobalsSpaceRegionKind; 16167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 16267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 16367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 16467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass HeapSpaceRegion : public MemSpaceRegion { 16567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 16667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 16767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek HeapSpaceRegion(MemRegionManager *mgr) 16867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : MemSpaceRegion(mgr, HeapSpaceRegionKind) {} 16967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 17067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 17167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return R->getKind() == HeapSpaceRegionKind; 17267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 17367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 17467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 1752b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenekclass UnknownSpaceRegion : public MemSpaceRegion { 1762b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek friend class MemRegionManager; 1772b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek UnknownSpaceRegion(MemRegionManager *mgr) 1782b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek : MemSpaceRegion(mgr, UnknownSpaceRegionKind) {} 1792b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenekpublic: 1802b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek static bool classof(const MemRegion *R) { 1812b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek return R->getKind() == UnknownSpaceRegionKind; 1822b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek } 1832b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek}; 1842b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek 18567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackSpaceRegion : public MemSpaceRegion { 18667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate: 18767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackFrameContext *SFC; 1889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 18967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprotected: 19067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StackSpaceRegion(MemRegionManager *mgr, Kind k, const StackFrameContext *sfc) 19167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : MemSpaceRegion(mgr, k), SFC(sfc) { 19267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek assert(classof(this)); 19367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 19441168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek 19567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 19667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackFrameContext *getStackFrame() const { return SFC; } 19767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 19867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek void Profile(llvm::FoldingSetNodeID &ID) const; 19967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 20067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 20167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek Kind k = R->getKind(); 20267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return k >= StackLocalsSpaceRegionKind && 20367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek k <= StackArgumentsSpaceRegionKind; 20467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 20567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 20667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 20767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackLocalsSpaceRegion : public StackSpaceRegion { 20867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate: 20967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 21067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StackLocalsSpaceRegion(MemRegionManager *mgr, const StackFrameContext *sfc) 21167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : StackSpaceRegion(mgr, StackLocalsSpaceRegionKind, sfc) {} 21267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 21367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 21467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return R->getKind() == StackLocalsSpaceRegionKind; 21567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 21667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 21767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 21867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackArgumentsSpaceRegion : public StackSpaceRegion { 21967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate: 22067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 22167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StackArgumentsSpaceRegion(MemRegionManager *mgr, const StackFrameContext *sfc) 22267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : StackSpaceRegion(mgr, StackArgumentsSpaceRegionKind, sfc) {} 22367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 22467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 22567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return R->getKind() == StackArgumentsSpaceRegionKind; 2269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 2279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 2289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 229993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// SubRegion - A region that subsets another larger region. Most regions 230993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// are subclasses of SubRegion. 231993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass SubRegion : public MemRegion { 2329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 2331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const MemRegion* superRegion; 234993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek SubRegion(const MemRegion* sReg, Kind k) : MemRegion(k), superRegion(sReg) {} 2359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 2369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* getSuperRegion() const { 2379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return superRegion; 2389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 2391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 240a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek MemRegionManager* getMemRegionManager() const; 2411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2427e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu bool isSubRegionOf(const MemRegion* R) const; 2431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 24567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return R->getKind() > END_MEMSPACES; 246993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek } 247993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek}; 2481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 24919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===// 25019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// Auxillary data classes for use with MemRegions. 25119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===// 25219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 25319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenekclass ElementRegion; 2541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 25519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenekclass RegionRawOffset : public std::pair<const MemRegion*, int64_t> { 25619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenekprivate: 25719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek friend class ElementRegion; 25819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 25919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek RegionRawOffset(const MemRegion* reg, int64_t offset = 0) 26019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek : std::pair<const MemRegion*, int64_t>(reg, offset) {} 26119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 2621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic: 26319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek // FIXME: Eventually support symbolic offsets. 26419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek int64_t getByteOffset() const { return second; } 26519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek const MemRegion *getRegion() const { return first; } 26619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 26719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek void dumpToStream(llvm::raw_ostream& os) const; 26819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek void dump() const; 26919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek}; 27019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 27119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===// 27219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// MemRegion subclasses. 2731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump//===----------------------------------------------------------------------===// 274ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 27582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek/// AllocaRegion - A region that represents an untyped blob of bytes created 27682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek/// by a call to 'alloca'. 27782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekclass AllocaRegion : public SubRegion { 27882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek friend class MemRegionManager; 27982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekprotected: 28082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek unsigned Cnt; // Block counter. Used to distinguish different pieces of 28182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek // memory allocated by alloca at the same call site. 28282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek const Expr* Ex; 28382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 2847ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek AllocaRegion(const Expr* ex, unsigned cnt, const MemRegion *superRegion) 28582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek : SubRegion(superRegion, AllocaRegionKind), Cnt(cnt), Ex(ex) {} 2861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 28782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekpublic: 2881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 28982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek const Expr* getExpr() const { return Ex; } 2909852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu 2919852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu bool isBoundable() const { return true; } 2929852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu 29382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 29482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 29582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Expr* Ex, 2967ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek unsigned Cnt, const MemRegion *superRegion); 2971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2988800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek void dumpToStream(llvm::raw_ostream& os) const; 2991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 30082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek static bool classof(const MemRegion* R) { 30182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek return R->getKind() == AllocaRegionKind; 30282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek } 3031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}; 3041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 305993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// TypedRegion - An abstract class representing regions that are typed. 306993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass TypedRegion : public SubRegion { 307993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekprotected: 308993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek TypedRegion(const MemRegion* sReg, Kind k) : SubRegion(sReg, k) {} 3091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 310993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekpublic: 311a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu virtual QualType getValueType(ASTContext &C) const = 0; 3121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 313ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu virtual QualType getLocationType(ASTContext& C) const { 3146eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek // FIXME: We can possibly optimize this later to cache this value. 315a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu return C.getPointerType(getValueType(C)); 3166eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek } 3171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 318a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu QualType getDesugaredValueType(ASTContext& C) const { 319a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu QualType T = getValueType(C); 320bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall return T.getTypePtr() ? T.getDesugaredType() : T; 32114553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek } 3221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 323ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu QualType getDesugaredLocationType(ASTContext& C) const { 324bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall return getLocationType(C).getDesugaredType(); 32514553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek } 3261b9b883a95215e38e153d253a46a2a2fcac25896Ted Kremenek 327a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek bool isBoundable() const { 328a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek return !getValueType(getContext()).isNull(); 32941168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek } 3306eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek 331993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek static bool classof(const MemRegion* R) { 3329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek unsigned k = R->getKind(); 33367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return k >= BEG_TYPED_REGIONS && k <= END_TYPED_REGIONS; 3349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 3369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 337ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 338eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass CodeTextRegion : public TypedRegion { 339eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekprotected: 340eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek CodeTextRegion(const MemRegion *sreg, Kind k) : TypedRegion(sreg, k) {} 341ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xupublic: 342a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu QualType getValueType(ASTContext &C) const { 343ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu // Do not get the object type of a CodeTextRegion. 344ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu assert(0); 345ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu return QualType(); 346ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu } 347eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 348eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek bool isBoundable() const { return false; } 349eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 350eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek static bool classof(const MemRegion* R) { 351eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek Kind k = R->getKind(); 352eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return k >= FunctionTextRegionKind && k <= BlockTextRegionKind; 353eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek } 354eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek}; 355ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 356eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek/// FunctionTextRegion - A region that represents code texts of function. 357eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass FunctionTextRegion : public CodeTextRegion { 358eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek const FunctionDecl *FD; 359eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekpublic: 360eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek FunctionTextRegion(const FunctionDecl* fd, const MemRegion* sreg) 361eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek : CodeTextRegion(sreg, FunctionTextRegionKind), FD(fd) {} 362eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 363ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu QualType getLocationType(ASTContext &C) const { 364abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek return C.getPointerType(FD->getType()); 365ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu } 366eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 367abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek const FunctionDecl *getDecl() const { 368abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek return FD; 36972e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek } 370eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 3718800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek virtual void dumpToStream(llvm::raw_ostream& os) const; 372eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 373ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const; 374eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 375abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const FunctionDecl *FD, 376abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek const MemRegion*); 377eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 378ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu static bool classof(const MemRegion* R) { 379eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return R->getKind() == FunctionTextRegionKind; 380eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek } 381eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek}; 382eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 383eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 384eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek/// BlockTextRegion - A region that represents code texts of blocks (closures). 3850a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// Blocks are represented with two kinds of regions. BlockTextRegions 3860a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// represent the "code", while BlockDataRegions represent instances of blocks, 3870a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// which correspond to "code+data". The distinction is important, because 3880a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// like a closure a block captures the values of externally referenced 3890a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// variables. 390eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass BlockTextRegion : public CodeTextRegion { 39167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 39267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 393eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek const BlockDecl *BD; 39467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek AnalysisContext *AC; 395eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek CanQualType locTy; 39667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 39767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BlockTextRegion(const BlockDecl *bd, CanQualType lTy, 39867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek AnalysisContext *ac, const MemRegion* sreg) 39967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : CodeTextRegion(sreg, BlockTextRegionKind), BD(bd), AC(ac), locTy(lTy) {} 40067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 40167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 402eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek QualType getLocationType(ASTContext &C) const { 403eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return locTy; 404eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek } 405eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 406eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek const BlockDecl *getDecl() const { 407eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return BD; 408eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek } 40967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 41067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek AnalysisContext *getAnalysisContext() const { return AC; } 411eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 412eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek virtual void dumpToStream(llvm::raw_ostream& os) const; 413eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 414eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 415eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 416eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const BlockDecl *BD, 41767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek CanQualType, const AnalysisContext*, 41867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const MemRegion*); 419eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 420eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek static bool classof(const MemRegion* R) { 421eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return R->getKind() == BlockTextRegionKind; 422ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu } 423ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu}; 4240a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 4250a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// BlockDataRegion - A region that represents a block instance. 4260a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// Blocks are represented with two kinds of regions. BlockTextRegions 4270a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// represent the "code", while BlockDataRegions represent instances of blocks, 4280a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// which correspond to "code+data". The distinction is important, because 4290a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// like a closure a block captures the values of externally referenced 4300a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// variables. 4310a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// BlockDataRegion - A region that represents code texts of blocks (closures). 4320a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenekclass BlockDataRegion : public SubRegion { 43367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 4340a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek const BlockTextRegion *BC; 43567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *LC; // Can be null */ 4364240096011a187807058f887eb81df750ffa17feTed Kremenek void *ReferencedVars; 43767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 43867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BlockDataRegion(const BlockTextRegion *bc, const LocationContext *lc, 4390a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek const MemRegion *sreg) 4404240096011a187807058f887eb81df750ffa17feTed Kremenek : SubRegion(sreg, BlockDataRegionKind), BC(bc), LC(lc), ReferencedVars(0) {} 4410a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 44267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 4430a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek const BlockTextRegion *getCodeRegion() const { return BC; } 4444240096011a187807058f887eb81df750ffa17feTed Kremenek 445d02e83a548359df978f40cc1a52ffd78b7ef371bTed Kremenek const BlockDecl *getDecl() const { return BC->getDecl(); } 446d02e83a548359df978f40cc1a52ffd78b7ef371bTed Kremenek 44781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek class referenced_vars_iterator { 44881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek const MemRegion * const *R; 44981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek public: 45081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek explicit referenced_vars_iterator(const MemRegion * const *r) : R(r) {} 45181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek 45281cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek operator const MemRegion * const *() const { 45381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return R; 45481cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 45581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek 45681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek const VarRegion* operator*() const { 45781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return cast<VarRegion>(*R); 45881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 45981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek 46081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek bool operator==(const referenced_vars_iterator &I) const { 46181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return I.R == R; 46281cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 46381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek bool operator!=(const referenced_vars_iterator &I) const { 46481cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return I.R != R; 46581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 46681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek referenced_vars_iterator& operator++() { 46781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek ++R; 46881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return *this; 46981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 47081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek }; 47181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek 4724240096011a187807058f887eb81df750ffa17feTed Kremenek referenced_vars_iterator referenced_vars_begin() const; 4734240096011a187807058f887eb81df750ffa17feTed Kremenek referenced_vars_iterator referenced_vars_end() const; 4740a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 4750a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek virtual void dumpToStream(llvm::raw_ostream& os) const; 4760a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 4770a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 4780a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 47967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID&, const BlockTextRegion *, 48067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *, const MemRegion *); 4810a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 4820a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek static bool classof(const MemRegion* R) { 4830a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek return R->getKind() == BlockDataRegionKind; 4840a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek } 4854240096011a187807058f887eb81df750ffa17feTed Kremenekprivate: 4864240096011a187807058f887eb81df750ffa17feTed Kremenek void LazyInitializeReferencedVars(); 4870a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek}; 488ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 489026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// SymbolicRegion - A special, "non-concrete" region. Unlike other region 490026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// clases, SymbolicRegion represents a region that serves as an alias for 491026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// either a real region, a NULL pointer, etc. It essentially is used to 492026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// map the concept of symbolic values into the domain of regions. Symbolic 493026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// regions do not need to be typed. 494e8e86482da4c1872673bbb9c237649229d19793bTed Kremenekclass SymbolicRegion : public SubRegion { 495026c66395b88a09437319139a43b090093f7e1ddZhongxing Xuprotected: 496026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu const SymbolRef sym; 497026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 498026c66395b88a09437319139a43b090093f7e1ddZhongxing Xupublic: 4991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SymbolicRegion(const SymbolRef s, const MemRegion* sreg) 500e8e86482da4c1872673bbb9c237649229d19793bTed Kremenek : SubRegion(sreg, SymbolicRegionKind), sym(s) {} 5011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 502026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu SymbolRef getSymbol() const { 503026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu return sym; 504026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu } 505026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 5069852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu bool isBoundable() const { return true; } 5079852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu 508026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const; 509026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 510250101353b711a409b075f1bc11070dddec7100bTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, 511250101353b711a409b075f1bc11070dddec7100bTed Kremenek SymbolRef sym, 512250101353b711a409b075f1bc11070dddec7100bTed Kremenek const MemRegion* superRegion); 5131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5148800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek void dumpToStream(llvm::raw_ostream& os) const; 5151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 516026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu static bool classof(const MemRegion* R) { 517026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu return R->getKind() == SymbolicRegionKind; 518026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu } 5191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}; 520026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 521e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu/// StringRegion - Region associated with a StringLiteral. 522e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuclass StringRegion : public TypedRegion { 523e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu friend class MemRegionManager; 524e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const StringLiteral* Str; 525e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuprotected: 526e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 527250101353b711a409b075f1bc11070dddec7100bTed Kremenek StringRegion(const StringLiteral* str, const MemRegion* sreg) 528e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu : TypedRegion(sreg, StringRegionKind), Str(str) {} 529e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 530e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID& ID, 531e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const StringLiteral* Str, 532e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const MemRegion* superRegion); 533e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 534e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xupublic: 5356613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu 5366613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu const StringLiteral* getStringLiteral() const { return Str; } 5371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 538a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu QualType getValueType(ASTContext& C) const { 539ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu return Str->getType(); 540ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu } 541e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 5420a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu bool isBoundable() const { return false; } 5430a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu 544e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const { 545e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu ProfileRegion(ID, Str, superRegion); 546e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 547e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 5488800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek void dumpToStream(llvm::raw_ostream& os) const; 549cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu 550e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static bool classof(const MemRegion* R) { 551e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu return R->getKind() == StringRegionKind; 552e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 553e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu}; 554e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 555329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// CompoundLiteralRegion - A memory region representing a compound literal. 556329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// Compound literals are essentially temporaries that are stack allocated 557329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// or in the global constant pool. 55877cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xuclass CompoundLiteralRegion : public TypedRegion { 559329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekprivate: 560329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek friend class MemRegionManager; 561329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek const CompoundLiteralExpr* CL; 562329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 563329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek CompoundLiteralRegion(const CompoundLiteralExpr* cl, const MemRegion* sReg) 56477cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu : TypedRegion(sReg, CompoundLiteralRegionKind), CL(cl) {} 5651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 566329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, 567329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek const CompoundLiteralExpr* CL, 568329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek const MemRegion* superRegion); 569329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekpublic: 570a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu QualType getValueType(ASTContext& C) const { 57177cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu return C.getCanonicalType(CL->getType()); 57277cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu } 5730a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu 5749a08fee80a34938b8c11c7166e009a89ced4c2b4Zhongxing Xu bool isBoundable() const { return !CL->isFileScope(); } 5759a08fee80a34938b8c11c7166e009a89ced4c2b4Zhongxing Xu 576329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 5771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5788800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek void dumpToStream(llvm::raw_ostream& os) const; 579329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 58011a83dc7a9a5738cc0bc76180b508eae896eefa9Ted Kremenek const CompoundLiteralExpr* getLiteralExpr() const { return CL; } 5811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 582329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek static bool classof(const MemRegion* R) { 583329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek return R->getKind() == CompoundLiteralRegionKind; 584329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek } 585329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek}; 586178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 5879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass DeclRegion : public TypedRegion { 5889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 5899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const Decl* D; 5909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 591993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek DeclRegion(const Decl* d, const MemRegion* sReg, Kind k) 5929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : TypedRegion(sReg, k), D(d) {} 5939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 5949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl* D, 5959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion, Kind k); 5961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 597bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xupublic: 598bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xu const Decl* getDecl() const { return D; } 5999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 6001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 601e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static bool classof(const MemRegion* R) { 602e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu unsigned k = R->getKind(); 60367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return k >= BEG_DECL_REGIONS && k <= END_DECL_REGIONS; 604e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 6059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 6061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass VarRegion : public DeclRegion { 6089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 609d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek 610d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek // Constructors and private methods. 61167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek VarRegion(const VarDecl* vd, const MemRegion* sReg) 61267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : DeclRegion(vd, sReg, VarRegionKind) {} 6139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 614250101353b711a409b075f1bc11070dddec7100bTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const VarDecl* VD, 615d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek const MemRegion *superRegion) { 6169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, VD, superRegion, VarRegionKind); 6179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 6181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 619d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 6201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic: 622d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek const VarDecl *getDecl() const { return cast<VarDecl>(D); } 6231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType getValueType(ASTContext& C) const { 6256eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek // FIXME: We can cache this if needed. 6266eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek return C.getCanonicalType(getDecl()->getType()); 6271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 6281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6298800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek void dumpToStream(llvm::raw_ostream& os) const; 6301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 6329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == VarRegionKind; 6331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 6349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 6359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 6369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass FieldRegion : public DeclRegion { 6379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 6389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 639993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek FieldRegion(const FieldDecl* fd, const MemRegion* sReg) 6409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(fd, sReg, FieldRegionKind) {} 6419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 6424bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenekpublic: 6431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6448800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek void dumpToStream(llvm::raw_ostream& os) const; 6451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6464bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek const FieldDecl* getDecl() const { return cast<FieldDecl>(D); } 6471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType getValueType(ASTContext& C) const { 6496eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek // FIXME: We can cache this if needed. 650e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu return C.getCanonicalType(getDecl()->getType()); 6511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 6524bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek 6536304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const FieldDecl* FD, 6546304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek const MemRegion* superRegion) { 6559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, FD, superRegion, FieldRegionKind); 6569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 6571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 6599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == FieldRegionKind; 6609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 6619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 6621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 663a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenekclass ObjCObjectRegion : public DeclRegion { 6641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 665a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek friend class MemRegionManager; 6661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 667a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek ObjCObjectRegion(const ObjCInterfaceDecl* ivd, const MemRegion* sReg) 668a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek : DeclRegion(ivd, sReg, ObjCObjectRegionKind) {} 6691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6706304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, 6716304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek const ObjCInterfaceDecl* ivd, 672a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek const MemRegion* superRegion) { 673a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCObjectRegionKind); 674a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek } 6751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 676a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenekpublic: 677a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek const ObjCInterfaceDecl* getInterface() const { 678a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek return cast<ObjCInterfaceDecl>(D); 679a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek } 6801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 681a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu QualType getValueType(ASTContext& C) const { 6823b3a45858c6b2a45114e91902c3bf3c4b7f5f302Daniel Dunbar return C.getObjCInterfaceType(getInterface()); 683a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek } 6841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 685a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek static bool classof(const MemRegion* R) { 686a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek return R->getKind() == ObjCObjectRegionKind; 687a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek } 6881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}; 6891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass ObjCIvarRegion : public DeclRegion { 6911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 6931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 694993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek ObjCIvarRegion(const ObjCIvarDecl* ivd, const MemRegion* sReg) 6959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(ivd, sReg, ObjCIvarRegionKind) {} 6969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 6976304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const ObjCIvarDecl* ivd, 6986304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek const MemRegion* superRegion) { 6999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCIvarRegionKind); 7009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 7011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 7039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const ObjCIvarDecl* getDecl() const { return cast<ObjCIvarDecl>(D); } 704a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu QualType getValueType(ASTContext&) const { return getDecl()->getType(); } 7051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 706bcfe03a0beb61082fa2f40887216d8dbca19a024Ted Kremenek void dumpToStream(llvm::raw_ostream& os) const; 7071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 7099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == ObjCIvarRegionKind; 7109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 7119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 712511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 71327b57063d83b00474d7563fb5d608544e2364862Zhongxing Xuclass ElementRegion : public TypedRegion { 714511191ce8920160525611be2be754c32a0724c3eZhongxing Xu friend class MemRegionManager; 715511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 716f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek QualType ElementType; 717511191ce8920160525611be2be754c32a0724c3eZhongxing Xu SVal Index; 718511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 719f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek ElementRegion(QualType elementType, SVal Idx, const MemRegion* sReg) 720f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek : TypedRegion(sReg, ElementRegionKind), 721f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek ElementType(elementType), Index(Idx) { 7223d8173c1c68f451c7492f92023d829c626845925Chris Lattner assert((!isa<nonloc::ConcreteInt>(&Idx) || 7233d8173c1c68f451c7492f92023d829c626845925Chris Lattner cast<nonloc::ConcreteInt>(&Idx)->getValue().isSigned()) && 72443b28d07019bc78447ecbbb721526de4ffd83f20Chris Lattner "The index must be signed"); 7250395b5d4987fe5baa818015e9d294c128619e4ecZhongxing Xu } 7261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 727f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, QualType elementType, 728f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek SVal Idx, const MemRegion* superRegion); 729511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 730511191ce8920160525611be2be754c32a0724c3eZhongxing Xupublic: 731511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 7326e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu SVal getIndex() const { return Index; } 7336e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu 734a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu QualType getValueType(ASTContext&) const { 735f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek return ElementType; 736f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek } 7371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 738f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek QualType getElementType() const { 739f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek return ElementType; 740abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek } 7411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 74219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek RegionRawOffset getAsRawOffset() const; 7431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7448800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek void dumpToStream(llvm::raw_ostream& os) const; 745b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 746511191ce8920160525611be2be754c32a0724c3eZhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const; 747511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 748511191ce8920160525611be2be754c32a0724c3eZhongxing Xu static bool classof(const MemRegion* R) { 749511191ce8920160525611be2be754c32a0724c3eZhongxing Xu return R->getKind() == ElementRegionKind; 750511191ce8920160525611be2be754c32a0724c3eZhongxing Xu } 751511191ce8920160525611be2be754c32a0724c3eZhongxing Xu}; 75219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 753ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenektemplate<typename RegionTy> 754ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenekconst RegionTy* MemRegion::getAs() const { 755f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek if (const RegionTy* RT = dyn_cast<RegionTy>(this)) 756f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek return RT; 7571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 758f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek return NULL; 759ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek} 760511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 7619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 7629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager - Factory object for creating regions. 7639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 7649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 7659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager { 766a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek ASTContext &C; 7679e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek llvm::BumpPtrAllocator& A; 7689e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek llvm::FoldingSet<MemRegion> Regions; 7691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 77067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek GlobalsSpaceRegion *globals; 7712b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek 7722b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek const StackFrameContext *cachedStackLocalsFrame; 7732b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek StackLocalsSpaceRegion *cachedStackLocalsRegion; 7742b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek 7752b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek const StackFrameContext *cachedStackArgumentsFrame; 7762b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek StackArgumentsSpaceRegion *cachedStackArgumentsRegion; 7772b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek 77867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek HeapSpaceRegion *heap; 7792b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek UnknownSpaceRegion *unknown; 780d05552a21377f493c882298c59e8829040b01d34Ted Kremenek MemSpaceRegion *code; 781dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 7829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 783a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek MemRegionManager(ASTContext &c, llvm::BumpPtrAllocator& a) 7842b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek : C(c), A(a), globals(0), 7852b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek cachedStackLocalsFrame(0), cachedStackLocalsRegion(0), 7862b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek cachedStackArgumentsFrame(0), cachedStackArgumentsRegion(0), 7872b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek heap(0), unknown(0), code(0) {} 7881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7894240096011a187807058f887eb81df750ffa17feTed Kremenek ~MemRegionManager(); 7901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 791a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek ASTContext &getContext() { return C; } 7924240096011a187807058f887eb81df750ffa17feTed Kremenek 7934240096011a187807058f887eb81df750ffa17feTed Kremenek llvm::BumpPtrAllocator &getAllocator() { return A; } 7941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 79567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// getStackLocalsRegion - Retrieve the memory region associated with the 79667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// specified stack frame. 79767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackLocalsSpaceRegion * 79867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek getStackLocalsRegion(const StackFrameContext *STC); 799d05552a21377f493c882298c59e8829040b01d34Ted Kremenek 800d05552a21377f493c882298c59e8829040b01d34Ted Kremenek /// getStackArgumentsRegion - Retrieve the memory region associated with 80167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// function/method arguments of the specified stack frame. 80267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackArgumentsSpaceRegion * 80367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek getStackArgumentsRegion(const StackFrameContext *STC); 8041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getGlobalsRegion - Retrieve the memory region associated with 8069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// all global variables. 80767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const GlobalsSpaceRegion *getGlobalsRegion(); 8081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getHeapRegion - Retrieve the memory region associated with the 8109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// generic "heap". 81167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const HeapSpaceRegion *getHeapRegion(); 812178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 813178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu /// getUnknownRegion - Retrieve the memory region associated with unknown 814178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu /// memory space. 815b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemSpaceRegion *getUnknownRegion(); 816c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu 817b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemSpaceRegion *getCodeRegion(); 818ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 8197090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek /// getAllocaRegion - Retrieve a region associated with a call to alloca(). 82067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const AllocaRegion *getAllocaRegion(const Expr* Ex, unsigned Cnt, 82167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *LC); 8221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 823329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek /// getCompoundLiteralRegion - Retrieve the region associated with a 824329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek /// given CompoundLiteral. 825b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const CompoundLiteralRegion* 82667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek getCompoundLiteralRegion(const CompoundLiteralExpr* CL, 82767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *LC); 8281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 829993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek /// getSymbolicRegion - Retrieve or create a "symbolic" memory region. 830b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const SymbolicRegion* getSymbolicRegion(SymbolRef sym); 831e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 832b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const StringRegion* getStringRegion(const StringLiteral* Str); 833e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 8349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getVarRegion - Retrieve or create the memory region associated with 835d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek /// a specified VarDecl and LocationContext. 836b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const VarRegion* getVarRegion(const VarDecl *D, const LocationContext *LC); 8371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 83867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// getVarRegion - Retrieve or create the memory region associated with 83967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// a specified VarDecl and super region. 84067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const VarRegion* getVarRegion(const VarDecl *D, const MemRegion *superR); 84167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 842f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek /// getElementRegion - Retrieve the memory region associated with the 843f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek /// associated element type, index, and super region. 844b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const ElementRegion *getElementRegion(QualType elementType, SVal Idx, 845d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek const MemRegion *superRegion, 846d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek ASTContext &Ctx); 8471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 848b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const ElementRegion *getElementRegionWithSuper(const ElementRegion *ER, 849a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek const MemRegion *superRegion) { 850a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek return getElementRegion(ER->getElementType(), ER->getIndex(), 851a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek superRegion, ER->getContext()); 852a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek } 853511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 8549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getFieldRegion - Retrieve or create the memory region associated with 8559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a specified FieldDecl. 'superRegion' corresponds to the containing 8569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// memory region (which typically represents the memory representing 8579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a structure or class). 858b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const FieldRegion *getFieldRegion(const FieldDecl* fd, 859b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemRegion* superRegion); 8601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 861b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const FieldRegion *getFieldRegionWithSuper(const FieldRegion *FR, 862b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemRegion *superRegion) { 863a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek return getFieldRegion(FR->getDecl(), superRegion); 864a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek } 8651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 866a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek /// getObjCObjectRegion - Retrieve or create the memory region associated with 867a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek /// the instance of a specified Objective-C class. 868b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const ObjCObjectRegion* getObjCObjectRegion(const ObjCInterfaceDecl* ID, 869b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemRegion* superRegion); 8701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8719e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getObjCIvarRegion - Retrieve or create the memory region associated with 8729e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a specified Objective-c instance variable. 'superRegion' corresponds 8739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// to the containing region (which typically represents the Objective-C 8749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// object). 875b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const ObjCIvarRegion *getObjCIvarRegion(const ObjCIvarDecl* ivd, 876b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemRegion* superRegion); 8771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 878b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const FunctionTextRegion *getFunctionTextRegion(const FunctionDecl *FD); 879b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const BlockTextRegion *getBlockTextRegion(const BlockDecl *BD, 88067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek CanQualType locTy, 88167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek AnalysisContext *AC); 88267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 88367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// getBlockDataRegion - Get the memory region associated with an instance 88467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// of a block. Unlike many other MemRegions, the LocationContext* 88567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// argument is allowed to be NULL for cases where we have no known 88667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// context. 887b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const BlockDataRegion *getBlockDataRegion(const BlockTextRegion *bc, 88867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *lc = NULL); 8891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 890bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek bool isGlobalsRegion(const MemRegion* R) { 891bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek assert(R); 892bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek return R == globals; 893bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek } 894bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek 895bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenekprivate: 896250101353b711a409b075f1bc11070dddec7100bTed Kremenek template <typename RegionTy, typename A1> 897250101353b711a409b075f1bc11070dddec7100bTed Kremenek RegionTy* getRegion(const A1 a1); 8981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8996304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek template <typename RegionTy, typename A1> 900eeea45611d45238c34474c183cee96d47ae79e24Ted Kremenek RegionTy* getSubRegion(const A1 a1, const MemRegion* superRegion); 9011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9027ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek template <typename RegionTy, typename A1, typename A2> 9037ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek RegionTy* getRegion(const A1 a1, const A2 a2); 904dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 9050a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek template <typename RegionTy, typename A1, typename A2> 9060a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek RegionTy* getSubRegion(const A1 a1, const A2 a2, 9070a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek const MemRegion* superRegion); 9080a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 90967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek template <typename RegionTy, typename A1, typename A2, typename A3> 91067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek RegionTy* getSubRegion(const A1 a1, const A2 a2, const A3 a3, 91167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const MemRegion* superRegion); 91267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 91367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek template <typename REG> 91467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const REG* LazyAllocate(REG*& region); 91567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 91667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek template <typename REG, typename ARG> 91767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const REG* LazyAllocate(REG*& region, ARG a); 918ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek}; 9191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 920250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 921a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek// Out-of-line member definitions. 922250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 923250101353b711a409b075f1bc11070dddec7100bTed Kremenek 924a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenekinline ASTContext& MemRegion::getContext() const { 925a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek return getMemRegionManager()->getContext(); 926a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek} 927eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 928be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end clang namespace 9299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 930250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 931250101353b711a409b075f1bc11070dddec7100bTed Kremenek// Pretty-printing regions. 932250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 933250101353b711a409b075f1bc11070dddec7100bTed Kremenek 934be91224894e1501133e224934285ba6440bf5b59Ted Kremeneknamespace llvm { 9358800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenekstatic inline raw_ostream& operator<<(raw_ostream& os, 9361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const clang::MemRegion* R) { 9378800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek R->dumpToStream(os); 9388800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek return os; 939be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} 940be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end llvm namespace 9419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 9429e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#endif 943