MemRegion.h revision 67d1287035767f4f6c8ca0c2bb755990012a44ca
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, 5667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek GlobalsSpaceRegionKind, 5767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek END_MEMSPACES = GlobalsSpaceRegionKind, 5867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek // Untyped regions. 5967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek SymbolicRegionKind, 6067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek AllocaRegionKind, 6167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek // Typed regions. 6267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BEG_TYPED_REGIONS, 6367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek FunctionTextRegionKind = BEG_TYPED_REGIONS, 6467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BlockTextRegionKind, 6567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BlockDataRegionKind, 6667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek CompoundLiteralRegionKind, 6767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StringRegionKind, 6867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek ElementRegionKind, 6967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek // Decl Regions. 7067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BEG_DECL_REGIONS, 7167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek VarRegionKind = BEG_DECL_REGIONS, 7267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek FieldRegionKind, 7367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek ObjCIvarRegionKind, 7467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek ObjCObjectRegionKind, 7567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek END_DECL_REGIONS = ObjCObjectRegionKind, 7667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek END_TYPED_REGIONS = END_DECL_REGIONS 7767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek }; 7867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate: 809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const Kind kind; 811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemRegion(Kind k) : kind(k) {} 849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek virtual ~MemRegion(); 859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 87a6275a534da701f37d19a068e6361e5f10f983a1Ted Kremenek ASTContext &getContext() const; 881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek virtual void Profile(llvm::FoldingSetNodeID& ID) const = 0; 90a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 91a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek virtual MemRegionManager* getMemRegionManager() const = 0; 92a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek std::string getString() const; 941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 95bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek const MemSpaceRegion *getMemorySpace() const; 961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 97adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu const MemRegion *getBaseRegion() const; 98adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu 99479529e679957fbb92b56e116e3c86734429331eZhongxing Xu const MemRegion *StripCasts() const; 1001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 101ea20cd74793d257679267032419a9ff7fc89dc05Ted Kremenek bool hasStackStorage() const; 1021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1031508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek bool hasParametersStorage() const; 1041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1051508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek bool hasGlobalsStorage() const; 1061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1071508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek bool hasGlobalsOrParametersStorage() const; 1081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 109ea20cd74793d257679267032419a9ff7fc89dc05Ted Kremenek bool hasHeapStorage() const; 1101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 111bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek bool hasHeapOrStackStorage() const; 112b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 1138800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek virtual void dumpToStream(llvm::raw_ostream& os) const; 1147f39d29cb69e7488f994870800d548008e50e1cbTed Kremenek 1158800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek void dump() const; 1161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Kind getKind() const { return kind; } 1181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 119ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek template<typename RegionTy> const RegionTy* getAs() const; 1201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 121f0f0605c87739c906861f73d4287798a4969b1e0Zhongxing Xu virtual bool isBoundable() const { return false; } 122b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 1239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion*) { return true; } 1249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 1251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemSpaceRegion - A memory region that represents and "memory space"; 1279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// for example, the set of global variables, the stack frame, etc. 1289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemSpaceRegion : public MemRegion { 129a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenekprotected: 13067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 13167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 132a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek MemRegionManager *Mgr; 133a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 13467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek MemSpaceRegion(MemRegionManager *mgr, Kind k = GenericMemSpaceRegionKind) 13567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : MemRegion(k), Mgr(mgr) { 13667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek assert(classof(this)); 13767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 13867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 13967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek MemRegionManager* getMemRegionManager() const { return Mgr; } 1401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 14167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 14267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek bool isBoundable() const { return false; } 14367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 14467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek void Profile(llvm::FoldingSetNodeID &ID) const; 14567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 14667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 14767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek Kind k = R->getKind(); 14867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return k >= BEG_MEMSPACES && k <= END_MEMSPACES; 149a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek } 15067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 15167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 15267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass GlobalsSpaceRegion : public MemSpaceRegion { 15367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 154a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 15567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek GlobalsSpaceRegion(MemRegionManager *mgr) 15667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : MemSpaceRegion(mgr, GlobalsSpaceRegionKind) {} 1579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 15867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 15967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return R->getKind() == GlobalsSpaceRegionKind; 16067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 16167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 16267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 16367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass HeapSpaceRegion : public MemSpaceRegion { 16467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 16567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 16667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek HeapSpaceRegion(MemRegionManager *mgr) 16767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : MemSpaceRegion(mgr, HeapSpaceRegionKind) {} 16867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 16967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 17067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return R->getKind() == HeapSpaceRegionKind; 17167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 17267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 17367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 17467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackSpaceRegion : public MemSpaceRegion { 17567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate: 17667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackFrameContext *SFC; 1779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 17867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprotected: 17967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StackSpaceRegion(MemRegionManager *mgr, Kind k, const StackFrameContext *sfc) 18067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : MemSpaceRegion(mgr, k), SFC(sfc) { 18167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek assert(classof(this)); 18267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 18341168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek 18467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 18567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackFrameContext *getStackFrame() const { return SFC; } 18667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 18767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek void Profile(llvm::FoldingSetNodeID &ID) const; 18867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 18967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 19067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek Kind k = R->getKind(); 19167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return k >= StackLocalsSpaceRegionKind && 19267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek k <= StackArgumentsSpaceRegionKind; 19367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 19467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 19567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 19667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackLocalsSpaceRegion : public StackSpaceRegion { 19767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate: 19867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 19967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StackLocalsSpaceRegion(MemRegionManager *mgr, const StackFrameContext *sfc) 20067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : StackSpaceRegion(mgr, StackLocalsSpaceRegionKind, sfc) {} 20167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 20267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 20367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return R->getKind() == StackLocalsSpaceRegionKind; 20467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 20567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 20667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 20767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackArgumentsSpaceRegion : public StackSpaceRegion { 20867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate: 20967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 21067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StackArgumentsSpaceRegion(MemRegionManager *mgr, const StackFrameContext *sfc) 21167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : StackSpaceRegion(mgr, StackArgumentsSpaceRegionKind, sfc) {} 21267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 21367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 21467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return R->getKind() == StackArgumentsSpaceRegionKind; 2159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 2169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 2179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 218993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// SubRegion - A region that subsets another larger region. Most regions 219993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// are subclasses of SubRegion. 220993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass SubRegion : public MemRegion { 2219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 2221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const MemRegion* superRegion; 223993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek SubRegion(const MemRegion* sReg, Kind k) : MemRegion(k), superRegion(sReg) {} 2249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 2259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* getSuperRegion() const { 2269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return superRegion; 2279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 2281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 229a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek MemRegionManager* getMemRegionManager() const; 2301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2317e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu bool isSubRegionOf(const MemRegion* R) const; 2321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 23467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return R->getKind() > END_MEMSPACES; 235993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek } 236993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek}; 2371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 23819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===// 23919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// Auxillary data classes for use with MemRegions. 24019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===// 24119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 24219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenekclass ElementRegion; 2431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 24419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenekclass RegionRawOffset : public std::pair<const MemRegion*, int64_t> { 24519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenekprivate: 24619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek friend class ElementRegion; 24719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 24819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek RegionRawOffset(const MemRegion* reg, int64_t offset = 0) 24919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek : std::pair<const MemRegion*, int64_t>(reg, offset) {} 25019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 2511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic: 25219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek // FIXME: Eventually support symbolic offsets. 25319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek int64_t getByteOffset() const { return second; } 25419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek const MemRegion *getRegion() const { return first; } 25519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 25619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek void dumpToStream(llvm::raw_ostream& os) const; 25719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek void dump() const; 25819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek}; 25919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 26019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===// 26119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// MemRegion subclasses. 2621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump//===----------------------------------------------------------------------===// 263ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 26482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek/// AllocaRegion - A region that represents an untyped blob of bytes created 26582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek/// by a call to 'alloca'. 26682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekclass AllocaRegion : public SubRegion { 26782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek friend class MemRegionManager; 26882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekprotected: 26982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek unsigned Cnt; // Block counter. Used to distinguish different pieces of 27082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek // memory allocated by alloca at the same call site. 27182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek const Expr* Ex; 27282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 2737ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek AllocaRegion(const Expr* ex, unsigned cnt, const MemRegion *superRegion) 27482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek : SubRegion(superRegion, AllocaRegionKind), Cnt(cnt), Ex(ex) {} 2751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 27682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekpublic: 2771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 27882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek const Expr* getExpr() const { return Ex; } 2799852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu 2809852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu bool isBoundable() const { return true; } 2819852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu 28282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 28382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 28482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Expr* Ex, 2857ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek unsigned Cnt, const MemRegion *superRegion); 2861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2878800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek void dumpToStream(llvm::raw_ostream& os) const; 2881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 28982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek static bool classof(const MemRegion* R) { 29082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek return R->getKind() == AllocaRegionKind; 29182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek } 2921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}; 2931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 294993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// TypedRegion - An abstract class representing regions that are typed. 295993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass TypedRegion : public SubRegion { 296993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekprotected: 297993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek TypedRegion(const MemRegion* sReg, Kind k) : SubRegion(sReg, k) {} 2981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 299993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekpublic: 300a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu virtual QualType getValueType(ASTContext &C) const = 0; 3011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 302ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu virtual QualType getLocationType(ASTContext& C) const { 3036eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek // FIXME: We can possibly optimize this later to cache this value. 304a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu return C.getPointerType(getValueType(C)); 3056eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek } 3061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 307a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu QualType getDesugaredValueType(ASTContext& C) const { 308a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu QualType T = getValueType(C); 309bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall return T.getTypePtr() ? T.getDesugaredType() : T; 31014553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek } 3111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 312ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu QualType getDesugaredLocationType(ASTContext& C) const { 313bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall return getLocationType(C).getDesugaredType(); 31414553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek } 3151b9b883a95215e38e153d253a46a2a2fcac25896Ted Kremenek 316a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek bool isBoundable() const { 317a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek return !getValueType(getContext()).isNull(); 31841168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek } 3196eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek 320993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek static bool classof(const MemRegion* R) { 3219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek unsigned k = R->getKind(); 32267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return k >= BEG_TYPED_REGIONS && k <= END_TYPED_REGIONS; 3239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 3259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 326ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 327eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass CodeTextRegion : public TypedRegion { 328eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekprotected: 329eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek CodeTextRegion(const MemRegion *sreg, Kind k) : TypedRegion(sreg, k) {} 330ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xupublic: 331a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu QualType getValueType(ASTContext &C) const { 332ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu // Do not get the object type of a CodeTextRegion. 333ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu assert(0); 334ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu return QualType(); 335ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu } 336eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 337eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek bool isBoundable() const { return false; } 338eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 339eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek static bool classof(const MemRegion* R) { 340eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek Kind k = R->getKind(); 341eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return k >= FunctionTextRegionKind && k <= BlockTextRegionKind; 342eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek } 343eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek}; 344ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 345eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek/// FunctionTextRegion - A region that represents code texts of function. 346eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass FunctionTextRegion : public CodeTextRegion { 347eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek const FunctionDecl *FD; 348eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekpublic: 349eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek FunctionTextRegion(const FunctionDecl* fd, const MemRegion* sreg) 350eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek : CodeTextRegion(sreg, FunctionTextRegionKind), FD(fd) {} 351eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 352ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu QualType getLocationType(ASTContext &C) const { 353abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek return C.getPointerType(FD->getType()); 354ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu } 355eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 356abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek const FunctionDecl *getDecl() const { 357abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek return FD; 35872e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek } 359eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 3608800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek virtual void dumpToStream(llvm::raw_ostream& os) const; 361eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 362ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const; 363eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 364abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const FunctionDecl *FD, 365abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek const MemRegion*); 366eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 367ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu static bool classof(const MemRegion* R) { 368eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return R->getKind() == FunctionTextRegionKind; 369eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek } 370eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek}; 371eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 372eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 373eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek/// BlockTextRegion - A region that represents code texts of blocks (closures). 3740a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// Blocks are represented with two kinds of regions. BlockTextRegions 3750a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// represent the "code", while BlockDataRegions represent instances of blocks, 3760a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// which correspond to "code+data". The distinction is important, because 3770a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// like a closure a block captures the values of externally referenced 3780a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// variables. 379eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass BlockTextRegion : public CodeTextRegion { 38067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 38167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 382eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek const BlockDecl *BD; 38367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek AnalysisContext *AC; 384eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek CanQualType locTy; 38567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 38667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BlockTextRegion(const BlockDecl *bd, CanQualType lTy, 38767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek AnalysisContext *ac, const MemRegion* sreg) 38867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : CodeTextRegion(sreg, BlockTextRegionKind), BD(bd), AC(ac), locTy(lTy) {} 38967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 39067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 391eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek QualType getLocationType(ASTContext &C) const { 392eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return locTy; 393eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek } 394eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 395eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek const BlockDecl *getDecl() const { 396eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return BD; 397eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek } 39867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 39967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek AnalysisContext *getAnalysisContext() const { return AC; } 400eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 401eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek virtual void dumpToStream(llvm::raw_ostream& os) const; 402eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 403eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 404eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 405eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const BlockDecl *BD, 40667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek CanQualType, const AnalysisContext*, 40767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const MemRegion*); 408eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 409eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek static bool classof(const MemRegion* R) { 410eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return R->getKind() == BlockTextRegionKind; 411ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu } 412ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu}; 4130a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 4140a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// BlockDataRegion - A region that represents a block instance. 4150a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// Blocks are represented with two kinds of regions. BlockTextRegions 4160a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// represent the "code", while BlockDataRegions represent instances of blocks, 4170a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// which correspond to "code+data". The distinction is important, because 4180a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// like a closure a block captures the values of externally referenced 4190a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// variables. 4200a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// BlockDataRegion - A region that represents code texts of blocks (closures). 4210a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenekclass BlockDataRegion : public SubRegion { 42267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 4230a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek const BlockTextRegion *BC; 42467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *LC; // Can be null */ 4254240096011a187807058f887eb81df750ffa17feTed Kremenek void *ReferencedVars; 42667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 42767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BlockDataRegion(const BlockTextRegion *bc, const LocationContext *lc, 4280a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek const MemRegion *sreg) 4294240096011a187807058f887eb81df750ffa17feTed Kremenek : SubRegion(sreg, BlockDataRegionKind), BC(bc), LC(lc), ReferencedVars(0) {} 4300a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 43167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 4320a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek const BlockTextRegion *getCodeRegion() const { return BC; } 4334240096011a187807058f887eb81df750ffa17feTed Kremenek 434d02e83a548359df978f40cc1a52ffd78b7ef371bTed Kremenek const BlockDecl *getDecl() const { return BC->getDecl(); } 435d02e83a548359df978f40cc1a52ffd78b7ef371bTed Kremenek 43681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek class referenced_vars_iterator { 43781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek const MemRegion * const *R; 43881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek public: 43981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek explicit referenced_vars_iterator(const MemRegion * const *r) : R(r) {} 44081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek 44181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek operator const MemRegion * const *() const { 44281cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return R; 44381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 44481cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek 44581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek const VarRegion* operator*() const { 44681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return cast<VarRegion>(*R); 44781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 44881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek 44981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek bool operator==(const referenced_vars_iterator &I) const { 45081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return I.R == R; 45181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 45281cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek bool operator!=(const referenced_vars_iterator &I) const { 45381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return I.R != R; 45481cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 45581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek referenced_vars_iterator& operator++() { 45681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek ++R; 45781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return *this; 45881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 45981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek }; 46081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek 4614240096011a187807058f887eb81df750ffa17feTed Kremenek referenced_vars_iterator referenced_vars_begin() const; 4624240096011a187807058f887eb81df750ffa17feTed Kremenek referenced_vars_iterator referenced_vars_end() const; 4630a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 4640a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek virtual void dumpToStream(llvm::raw_ostream& os) const; 4650a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 4660a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 4670a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 46867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID&, const BlockTextRegion *, 46967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *, const MemRegion *); 4700a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 4710a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek static bool classof(const MemRegion* R) { 4720a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek return R->getKind() == BlockDataRegionKind; 4730a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek } 4744240096011a187807058f887eb81df750ffa17feTed Kremenekprivate: 4754240096011a187807058f887eb81df750ffa17feTed Kremenek void LazyInitializeReferencedVars(); 4760a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek}; 477ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 478026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// SymbolicRegion - A special, "non-concrete" region. Unlike other region 479026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// clases, SymbolicRegion represents a region that serves as an alias for 480026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// either a real region, a NULL pointer, etc. It essentially is used to 481026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// map the concept of symbolic values into the domain of regions. Symbolic 482026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// regions do not need to be typed. 483e8e86482da4c1872673bbb9c237649229d19793bTed Kremenekclass SymbolicRegion : public SubRegion { 484026c66395b88a09437319139a43b090093f7e1ddZhongxing Xuprotected: 485026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu const SymbolRef sym; 486026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 487026c66395b88a09437319139a43b090093f7e1ddZhongxing Xupublic: 4881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SymbolicRegion(const SymbolRef s, const MemRegion* sreg) 489e8e86482da4c1872673bbb9c237649229d19793bTed Kremenek : SubRegion(sreg, SymbolicRegionKind), sym(s) {} 4901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 491026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu SymbolRef getSymbol() const { 492026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu return sym; 493026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu } 494026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 4959852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu bool isBoundable() const { return true; } 4969852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu 497026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const; 498026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 499250101353b711a409b075f1bc11070dddec7100bTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, 500250101353b711a409b075f1bc11070dddec7100bTed Kremenek SymbolRef sym, 501250101353b711a409b075f1bc11070dddec7100bTed Kremenek const MemRegion* superRegion); 5021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5038800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek void dumpToStream(llvm::raw_ostream& os) const; 5041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 505026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu static bool classof(const MemRegion* R) { 506026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu return R->getKind() == SymbolicRegionKind; 507026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu } 5081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}; 509026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 510e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu/// StringRegion - Region associated with a StringLiteral. 511e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuclass StringRegion : public TypedRegion { 512e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu friend class MemRegionManager; 513e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const StringLiteral* Str; 514e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuprotected: 515e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 516250101353b711a409b075f1bc11070dddec7100bTed Kremenek StringRegion(const StringLiteral* str, const MemRegion* sreg) 517e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu : TypedRegion(sreg, StringRegionKind), Str(str) {} 518e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 519e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID& ID, 520e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const StringLiteral* Str, 521e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const MemRegion* superRegion); 522e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 523e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xupublic: 5246613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu 5256613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu const StringLiteral* getStringLiteral() const { return Str; } 5261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 527a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu QualType getValueType(ASTContext& C) const { 528ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu return Str->getType(); 529ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu } 530e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 5310a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu bool isBoundable() const { return false; } 5320a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu 533e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const { 534e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu ProfileRegion(ID, Str, superRegion); 535e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 536e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 5378800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek void dumpToStream(llvm::raw_ostream& os) const; 538cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu 539e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static bool classof(const MemRegion* R) { 540e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu return R->getKind() == StringRegionKind; 541e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 542e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu}; 543e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 544329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// CompoundLiteralRegion - A memory region representing a compound literal. 545329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// Compound literals are essentially temporaries that are stack allocated 546329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// or in the global constant pool. 54777cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xuclass CompoundLiteralRegion : public TypedRegion { 548329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekprivate: 549329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek friend class MemRegionManager; 550329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek const CompoundLiteralExpr* CL; 551329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 552329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek CompoundLiteralRegion(const CompoundLiteralExpr* cl, const MemRegion* sReg) 55377cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu : TypedRegion(sReg, CompoundLiteralRegionKind), CL(cl) {} 5541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 555329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, 556329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek const CompoundLiteralExpr* CL, 557329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek const MemRegion* superRegion); 558329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekpublic: 559a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu QualType getValueType(ASTContext& C) const { 56077cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu return C.getCanonicalType(CL->getType()); 56177cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu } 5620a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu 5639a08fee80a34938b8c11c7166e009a89ced4c2b4Zhongxing Xu bool isBoundable() const { return !CL->isFileScope(); } 5649a08fee80a34938b8c11c7166e009a89ced4c2b4Zhongxing Xu 565329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 5661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5678800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek void dumpToStream(llvm::raw_ostream& os) const; 568329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 56911a83dc7a9a5738cc0bc76180b508eae896eefa9Ted Kremenek const CompoundLiteralExpr* getLiteralExpr() const { return CL; } 5701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 571329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek static bool classof(const MemRegion* R) { 572329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek return R->getKind() == CompoundLiteralRegionKind; 573329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek } 574329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek}; 575178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 5769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass DeclRegion : public TypedRegion { 5779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 5789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const Decl* D; 5799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 580993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek DeclRegion(const Decl* d, const MemRegion* sReg, Kind k) 5819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : TypedRegion(sReg, k), D(d) {} 5829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 5839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl* D, 5849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion, Kind k); 5851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 586bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xupublic: 587bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xu const Decl* getDecl() const { return D; } 5889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 5891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 590e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static bool classof(const MemRegion* R) { 591e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu unsigned k = R->getKind(); 59267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return k >= BEG_DECL_REGIONS && k <= END_DECL_REGIONS; 593e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 5949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 5951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass VarRegion : public DeclRegion { 5979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 598d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek 599d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek // Constructors and private methods. 60067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek VarRegion(const VarDecl* vd, const MemRegion* sReg) 60167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : DeclRegion(vd, sReg, VarRegionKind) {} 6029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 603250101353b711a409b075f1bc11070dddec7100bTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const VarDecl* VD, 604d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek const MemRegion *superRegion) { 6059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, VD, superRegion, VarRegionKind); 6069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 6071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 608d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 6091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic: 611d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek const VarDecl *getDecl() const { return cast<VarDecl>(D); } 6121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType getValueType(ASTContext& C) const { 6146eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek // FIXME: We can cache this if needed. 6156eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek return C.getCanonicalType(getDecl()->getType()); 6161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 6171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6188800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek void dumpToStream(llvm::raw_ostream& os) const; 6191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 6219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == VarRegionKind; 6221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 6239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 6249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 6259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass FieldRegion : public DeclRegion { 6269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 6279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 628993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek FieldRegion(const FieldDecl* fd, const MemRegion* sReg) 6299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(fd, sReg, FieldRegionKind) {} 6309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 6314bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenekpublic: 6321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6338800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek void dumpToStream(llvm::raw_ostream& os) const; 6341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6354bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek const FieldDecl* getDecl() const { return cast<FieldDecl>(D); } 6361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType getValueType(ASTContext& C) const { 6386eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek // FIXME: We can cache this if needed. 639e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu return C.getCanonicalType(getDecl()->getType()); 6401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 6414bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek 6426304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const FieldDecl* FD, 6436304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek const MemRegion* superRegion) { 6449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, FD, superRegion, FieldRegionKind); 6459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 6461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6479e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 6489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == FieldRegionKind; 6499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 6509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 6511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 652a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenekclass ObjCObjectRegion : public DeclRegion { 6531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 654a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek friend class MemRegionManager; 6551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 656a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek ObjCObjectRegion(const ObjCInterfaceDecl* ivd, const MemRegion* sReg) 657a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek : DeclRegion(ivd, sReg, ObjCObjectRegionKind) {} 6581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6596304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, 6606304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek const ObjCInterfaceDecl* ivd, 661a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek const MemRegion* superRegion) { 662a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCObjectRegionKind); 663a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek } 6641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 665a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenekpublic: 666a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek const ObjCInterfaceDecl* getInterface() const { 667a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek return cast<ObjCInterfaceDecl>(D); 668a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek } 6691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 670a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu QualType getValueType(ASTContext& C) const { 6713b3a45858c6b2a45114e91902c3bf3c4b7f5f302Daniel Dunbar return C.getObjCInterfaceType(getInterface()); 672a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek } 6731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 674a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek static bool classof(const MemRegion* R) { 675a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek return R->getKind() == ObjCObjectRegionKind; 676a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek } 6771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}; 6781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass ObjCIvarRegion : public DeclRegion { 6801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 6821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 683993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek ObjCIvarRegion(const ObjCIvarDecl* ivd, const MemRegion* sReg) 6849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(ivd, sReg, ObjCIvarRegionKind) {} 6859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 6866304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const ObjCIvarDecl* ivd, 6876304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek const MemRegion* superRegion) { 6889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCIvarRegionKind); 6899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 6901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 6929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const ObjCIvarDecl* getDecl() const { return cast<ObjCIvarDecl>(D); } 693a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu QualType getValueType(ASTContext&) const { return getDecl()->getType(); } 6941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 695bcfe03a0beb61082fa2f40887216d8dbca19a024Ted Kremenek void dumpToStream(llvm::raw_ostream& os) const; 6961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 6989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == ObjCIvarRegionKind; 6999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 7009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 701511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 70227b57063d83b00474d7563fb5d608544e2364862Zhongxing Xuclass ElementRegion : public TypedRegion { 703511191ce8920160525611be2be754c32a0724c3eZhongxing Xu friend class MemRegionManager; 704511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 705f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek QualType ElementType; 706511191ce8920160525611be2be754c32a0724c3eZhongxing Xu SVal Index; 707511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 708f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek ElementRegion(QualType elementType, SVal Idx, const MemRegion* sReg) 709f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek : TypedRegion(sReg, ElementRegionKind), 710f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek ElementType(elementType), Index(Idx) { 7113d8173c1c68f451c7492f92023d829c626845925Chris Lattner assert((!isa<nonloc::ConcreteInt>(&Idx) || 7123d8173c1c68f451c7492f92023d829c626845925Chris Lattner cast<nonloc::ConcreteInt>(&Idx)->getValue().isSigned()) && 71343b28d07019bc78447ecbbb721526de4ffd83f20Chris Lattner "The index must be signed"); 7140395b5d4987fe5baa818015e9d294c128619e4ecZhongxing Xu } 7151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 716f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, QualType elementType, 717f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek SVal Idx, const MemRegion* superRegion); 718511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 719511191ce8920160525611be2be754c32a0724c3eZhongxing Xupublic: 720511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 7216e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu SVal getIndex() const { return Index; } 7226e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu 723a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu QualType getValueType(ASTContext&) const { 724f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek return ElementType; 725f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek } 7261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 727f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek QualType getElementType() const { 728f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek return ElementType; 729abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek } 7301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 73119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek RegionRawOffset getAsRawOffset() const; 7321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7338800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek void dumpToStream(llvm::raw_ostream& os) const; 734b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 735511191ce8920160525611be2be754c32a0724c3eZhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const; 736511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 737511191ce8920160525611be2be754c32a0724c3eZhongxing Xu static bool classof(const MemRegion* R) { 738511191ce8920160525611be2be754c32a0724c3eZhongxing Xu return R->getKind() == ElementRegionKind; 739511191ce8920160525611be2be754c32a0724c3eZhongxing Xu } 740511191ce8920160525611be2be754c32a0724c3eZhongxing Xu}; 74119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 742ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenektemplate<typename RegionTy> 743ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenekconst RegionTy* MemRegion::getAs() const { 744f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek if (const RegionTy* RT = dyn_cast<RegionTy>(this)) 745f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek return RT; 7461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 747f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek return NULL; 748ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek} 749511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 7509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 7519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager - Factory object for creating regions. 7529e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 7539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 7549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager { 755a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek ASTContext &C; 7569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek llvm::BumpPtrAllocator& A; 7579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek llvm::FoldingSet<MemRegion> Regions; 7581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 75967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek GlobalsSpaceRegion *globals; 76067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StackLocalsSpaceRegion *stackLocals; 76167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StackArgumentsSpaceRegion *stackArguments; 76267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek HeapSpaceRegion *heap; 763d05552a21377f493c882298c59e8829040b01d34Ted Kremenek MemSpaceRegion *unknown; 764d05552a21377f493c882298c59e8829040b01d34Ted Kremenek MemSpaceRegion *code; 765dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 7669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 767a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek MemRegionManager(ASTContext &c, llvm::BumpPtrAllocator& a) 76867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : C(c), A(a), globals(0), stackLocals(0), stackArguments(0), heap(0), 769d05552a21377f493c882298c59e8829040b01d34Ted Kremenek unknown(0), code(0) {} 7701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7714240096011a187807058f887eb81df750ffa17feTed Kremenek ~MemRegionManager(); 7721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 773a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek ASTContext &getContext() { return C; } 7744240096011a187807058f887eb81df750ffa17feTed Kremenek 7754240096011a187807058f887eb81df750ffa17feTed Kremenek llvm::BumpPtrAllocator &getAllocator() { return A; } 7761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 77767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// getStackLocalsRegion - Retrieve the memory region associated with the 77867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// specified stack frame. 77967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackLocalsSpaceRegion * 78067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek getStackLocalsRegion(const StackFrameContext *STC); 781d05552a21377f493c882298c59e8829040b01d34Ted Kremenek 782d05552a21377f493c882298c59e8829040b01d34Ted Kremenek /// getStackArgumentsRegion - Retrieve the memory region associated with 78367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// function/method arguments of the specified stack frame. 78467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackArgumentsSpaceRegion * 78567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek getStackArgumentsRegion(const StackFrameContext *STC); 7861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getGlobalsRegion - Retrieve the memory region associated with 7889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// all global variables. 78967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const GlobalsSpaceRegion *getGlobalsRegion(); 7901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getHeapRegion - Retrieve the memory region associated with the 7929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// generic "heap". 79367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const HeapSpaceRegion *getHeapRegion(); 794178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 795178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu /// getUnknownRegion - Retrieve the memory region associated with unknown 796178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu /// memory space. 797b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemSpaceRegion *getUnknownRegion(); 798c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu 799b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemSpaceRegion *getCodeRegion(); 800ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 8017090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek /// getAllocaRegion - Retrieve a region associated with a call to alloca(). 80267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const AllocaRegion *getAllocaRegion(const Expr* Ex, unsigned Cnt, 80367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *LC); 8041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 805329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek /// getCompoundLiteralRegion - Retrieve the region associated with a 806329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek /// given CompoundLiteral. 807b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const CompoundLiteralRegion* 80867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek getCompoundLiteralRegion(const CompoundLiteralExpr* CL, 80967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *LC); 8101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 811993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek /// getSymbolicRegion - Retrieve or create a "symbolic" memory region. 812b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const SymbolicRegion* getSymbolicRegion(SymbolRef sym); 813e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 814b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const StringRegion* getStringRegion(const StringLiteral* Str); 815e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 8169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getVarRegion - Retrieve or create the memory region associated with 817d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek /// a specified VarDecl and LocationContext. 818b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const VarRegion* getVarRegion(const VarDecl *D, const LocationContext *LC); 8191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 82067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// getVarRegion - Retrieve or create the memory region associated with 82167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// a specified VarDecl and super region. 82267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const VarRegion* getVarRegion(const VarDecl *D, const MemRegion *superR); 82367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 824f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek /// getElementRegion - Retrieve the memory region associated with the 825f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek /// associated element type, index, and super region. 826b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const ElementRegion *getElementRegion(QualType elementType, SVal Idx, 827d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek const MemRegion *superRegion, 828d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek ASTContext &Ctx); 8291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 830b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const ElementRegion *getElementRegionWithSuper(const ElementRegion *ER, 831a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek const MemRegion *superRegion) { 832a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek return getElementRegion(ER->getElementType(), ER->getIndex(), 833a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek superRegion, ER->getContext()); 834a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek } 835511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 8369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getFieldRegion - Retrieve or create the memory region associated with 8379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a specified FieldDecl. 'superRegion' corresponds to the containing 8389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// memory region (which typically represents the memory representing 8399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a structure or class). 840b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const FieldRegion *getFieldRegion(const FieldDecl* fd, 841b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemRegion* superRegion); 8421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 843b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const FieldRegion *getFieldRegionWithSuper(const FieldRegion *FR, 844b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemRegion *superRegion) { 845a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek return getFieldRegion(FR->getDecl(), superRegion); 846a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek } 8471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 848a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek /// getObjCObjectRegion - Retrieve or create the memory region associated with 849a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek /// the instance of a specified Objective-C class. 850b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const ObjCObjectRegion* getObjCObjectRegion(const ObjCInterfaceDecl* ID, 851b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemRegion* superRegion); 8521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getObjCIvarRegion - Retrieve or create the memory region associated with 8549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a specified Objective-c instance variable. 'superRegion' corresponds 8559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// to the containing region (which typically represents the Objective-C 8569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// object). 857b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const ObjCIvarRegion *getObjCIvarRegion(const ObjCIvarDecl* ivd, 858b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemRegion* superRegion); 8591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 860b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const FunctionTextRegion *getFunctionTextRegion(const FunctionDecl *FD); 861b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const BlockTextRegion *getBlockTextRegion(const BlockDecl *BD, 86267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek CanQualType locTy, 86367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek AnalysisContext *AC); 86467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 86567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// getBlockDataRegion - Get the memory region associated with an instance 86667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// of a block. Unlike many other MemRegions, the LocationContext* 86767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// argument is allowed to be NULL for cases where we have no known 86867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// context. 869b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const BlockDataRegion *getBlockDataRegion(const BlockTextRegion *bc, 87067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *lc = NULL); 8711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 872bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek bool isGlobalsRegion(const MemRegion* R) { 873bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek assert(R); 874bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek return R == globals; 875bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek } 876bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek 877bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenekprivate: 878250101353b711a409b075f1bc11070dddec7100bTed Kremenek template <typename RegionTy, typename A1> 879250101353b711a409b075f1bc11070dddec7100bTed Kremenek RegionTy* getRegion(const A1 a1); 8801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8816304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek template <typename RegionTy, typename A1> 882eeea45611d45238c34474c183cee96d47ae79e24Ted Kremenek RegionTy* getSubRegion(const A1 a1, const MemRegion* superRegion); 8831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8847ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek template <typename RegionTy, typename A1, typename A2> 8857ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek RegionTy* getRegion(const A1 a1, const A2 a2); 886dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 8870a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek template <typename RegionTy, typename A1, typename A2> 8880a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek RegionTy* getSubRegion(const A1 a1, const A2 a2, 8890a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek const MemRegion* superRegion); 8900a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 89167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek template <typename RegionTy, typename A1, typename A2, typename A3> 89267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek RegionTy* getSubRegion(const A1 a1, const A2 a2, const A3 a3, 89367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const MemRegion* superRegion); 89467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 89567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek template <typename REG> 89667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const REG* LazyAllocate(REG*& region); 89767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 89867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek template <typename REG, typename ARG> 89967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const REG* LazyAllocate(REG*& region, ARG a); 900ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek}; 9011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 902250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 903a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek// Out-of-line member definitions. 904250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 905250101353b711a409b075f1bc11070dddec7100bTed Kremenek 906a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenekinline ASTContext& MemRegion::getContext() const { 907a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek return getMemRegionManager()->getContext(); 908a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek} 909eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 910be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end clang namespace 9119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 912250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 913250101353b711a409b075f1bc11070dddec7100bTed Kremenek// Pretty-printing regions. 914250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 915250101353b711a409b075f1bc11070dddec7100bTed Kremenek 916be91224894e1501133e224934285ba6440bf5b59Ted Kremeneknamespace llvm { 9178800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenekstatic inline raw_ostream& operator<<(raw_ostream& os, 9181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const clang::MemRegion* R) { 9198800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek R->dumpToStream(os); 9208800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek return os; 921be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} 922be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end llvm namespace 9239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 9249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#endif 925