MemRegion.h revision e1aeb13251a4858724d2b7ad1925d25076f23d08
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" 211309f9a3b225ea846e5822691c39a77423125505Ted Kremenek#include "clang/Checker/PathSensitive/SVals.h" 229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/Support/Casting.h" 239c1845dbed9817520f5a7db8bd80a560c6c6ae6bArgyrios Kyrtzidis#include "llvm/Support/ErrorHandling.h" 249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/ADT/FoldingSet.h" 259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include <string> 269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 275e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramernamespace llvm { 285e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramerclass BumpPtrAllocator; 295e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramerclass raw_ostream; 305e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramer} 319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremeneknamespace clang { 331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager; 35d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenekclass MemSpaceRegion; 36d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenekclass LocationContext; 3767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackFrameContext; 3832f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Roseclass ValueManager; 394240096011a187807058f887eb81df750ffa17feTed Kremenekclass VarRegion; 40dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekclass CodeTextRegion; 411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 42e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu/// Represent a region's offset within the top level base region. 43e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xuclass RegionOffset { 44e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu /// The base region. 45e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu const MemRegion *R; 46e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu 47e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu /// The bit offset within the base region. It shouldn't be negative. 48e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu int64_t Offset; 49e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu 50e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xupublic: 51e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu RegionOffset(const MemRegion *r) : R(r), Offset(0) {} 52e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu RegionOffset(const MemRegion *r, int64_t off) : R(r), Offset(off) {} 53e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu 54e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu const MemRegion *getRegion() const { return R; } 55e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu int64_t getOffset() const { return Offset; } 56e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu}; 57e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu 5819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===// 5919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// Base region classes. 6019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===// 611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemRegion - The root abstract class for all memory regions. 639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegion : public llvm::FoldingSetNode { 644240096011a187807058f887eb81df750ffa17feTed Kremenek friend class MemRegionManager; 659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 6667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek enum Kind { 6767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek // Memory spaces. 68dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek GenericMemSpaceRegionKind, 6967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StackLocalsSpaceRegionKind, 7067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StackArgumentsSpaceRegionKind, 7167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek HeapSpaceRegionKind, 722b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek UnknownSpaceRegionKind, 73dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek NonStaticGlobalSpaceRegionKind, 74dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek StaticGlobalSpaceRegionKind, 75dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek BEG_GLOBAL_MEMSPACES = NonStaticGlobalSpaceRegionKind, 76dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek END_GLOBAL_MEMSPACES = StaticGlobalSpaceRegionKind, 77dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek BEG_MEMSPACES = GenericMemSpaceRegionKind, 78dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek END_MEMSPACES = StaticGlobalSpaceRegionKind, 7967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek // Untyped regions. 8067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek SymbolicRegionKind, 8167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek AllocaRegionKind, 8267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek // Typed regions. 8367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BEG_TYPED_REGIONS, 8467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek FunctionTextRegionKind = BEG_TYPED_REGIONS, 8567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BlockTextRegionKind, 8667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BlockDataRegionKind, 8767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek CompoundLiteralRegionKind, 88de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek CXXThisRegionKind, 8967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StringRegionKind, 9067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek ElementRegionKind, 9167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek // Decl Regions. 9267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BEG_DECL_REGIONS, 9367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek VarRegionKind = BEG_DECL_REGIONS, 9467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek FieldRegionKind, 9567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek ObjCIvarRegionKind, 96bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu CXXObjectRegionKind, 97bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu END_DECL_REGIONS = CXXObjectRegionKind, 9867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek END_TYPED_REGIONS = END_DECL_REGIONS 9967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek }; 10067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 1019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate: 1029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const Kind kind; 1031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1049e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 1059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemRegion(Kind k) : kind(k) {} 1069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek virtual ~MemRegion(); 1079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 109a6275a534da701f37d19a068e6361e5f10f983a1Ted Kremenek ASTContext &getContext() const; 1101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek virtual void Profile(llvm::FoldingSetNodeID& ID) const = 0; 112a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 113a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek virtual MemRegionManager* getMemRegionManager() const = 0; 114a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 1159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek std::string getString() const; 1161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 117bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek const MemSpaceRegion *getMemorySpace() const; 1181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 119adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu const MemRegion *getBaseRegion() const; 120adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu 121479529e679957fbb92b56e116e3c86734429331eZhongxing Xu const MemRegion *StripCasts() const; 1221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1231508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek bool hasGlobalsOrParametersStorage() const; 1241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 125de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek bool hasStackStorage() const; 126de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 127de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek bool hasStackNonParametersStorage() const; 128de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 129de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek bool hasStackParametersStorage() const; 130b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 131e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu /// Compute the offset within the top level memory object. 132e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu RegionOffset getAsOffset() const; 133e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu 1348800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek virtual void dumpToStream(llvm::raw_ostream& os) const; 1357f39d29cb69e7488f994870800d548008e50e1cbTed Kremenek 1368800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek void dump() const; 1371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Kind getKind() const { return kind; } 1391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 140ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek template<typename RegionTy> const RegionTy* getAs() const; 1411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 142f0f0605c87739c906861f73d4287798a4969b1e0Zhongxing Xu virtual bool isBoundable() const { return false; } 143b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 1449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion*) { return true; } 1459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 1461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1479e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemSpaceRegion - A memory region that represents and "memory space"; 1489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// for example, the set of global variables, the stack frame, etc. 1499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemSpaceRegion : public MemRegion { 150a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenekprotected: 15167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 15267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 153a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek MemRegionManager *Mgr; 154a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 15567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek MemSpaceRegion(MemRegionManager *mgr, Kind k = GenericMemSpaceRegionKind) 15667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : MemRegion(k), Mgr(mgr) { 15767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek assert(classof(this)); 15867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 15967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 16067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek MemRegionManager* getMemRegionManager() const { return Mgr; } 1611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 16367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek bool isBoundable() const { return false; } 16467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 16567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek void Profile(llvm::FoldingSetNodeID &ID) const; 16667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 16767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 16867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek Kind k = R->getKind(); 16967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return k >= BEG_MEMSPACES && k <= END_MEMSPACES; 170a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek } 17167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 17267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 17367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass GlobalsSpaceRegion : public MemSpaceRegion { 174dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekprotected: 175dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek GlobalsSpaceRegion(MemRegionManager *mgr, Kind k) 176dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek : MemSpaceRegion(mgr, k) {} 177dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekpublic: 178dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek static bool classof(const MemRegion *R) { 179dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek Kind k = R->getKind(); 180dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek return k >= BEG_GLOBAL_MEMSPACES && k <= END_GLOBAL_MEMSPACES; 181dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek } 182dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek}; 183dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 184dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekclass StaticGlobalSpaceRegion : public GlobalsSpaceRegion { 18567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 186a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 187dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek const CodeTextRegion *CR; 188dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 189dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek StaticGlobalSpaceRegion(MemRegionManager *mgr, const CodeTextRegion *cr) 190dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek : GlobalsSpaceRegion(mgr, StaticGlobalSpaceRegionKind), CR(cr) {} 191dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 192dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekpublic: 193dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek void Profile(llvm::FoldingSetNodeID &ID) const; 194dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 195fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek void dumpToStream(llvm::raw_ostream& os) const; 196fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek 197dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek const CodeTextRegion *getCodeRegion() const { return CR; } 198dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 199dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek static bool classof(const MemRegion *R) { 200dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek return R->getKind() == StaticGlobalSpaceRegionKind; 201dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek } 202dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek}; 203dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 204dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekclass NonStaticGlobalSpaceRegion : public GlobalsSpaceRegion { 205dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek friend class MemRegionManager; 206dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 207dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek NonStaticGlobalSpaceRegion(MemRegionManager *mgr) 208dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek : GlobalsSpaceRegion(mgr, NonStaticGlobalSpaceRegionKind) {} 209dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 2109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 211fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek 212fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek void dumpToStream(llvm::raw_ostream& os) const; 213fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek 21467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 215dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek return R->getKind() == NonStaticGlobalSpaceRegionKind; 21667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 21767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 21867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 21967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass HeapSpaceRegion : public MemSpaceRegion { 22067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 22167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 22267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek HeapSpaceRegion(MemRegionManager *mgr) 22367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : MemSpaceRegion(mgr, HeapSpaceRegionKind) {} 22467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 22567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 22667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return R->getKind() == HeapSpaceRegionKind; 22767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 22867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 22967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 2302b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenekclass UnknownSpaceRegion : public MemSpaceRegion { 2312b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek friend class MemRegionManager; 2322b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek UnknownSpaceRegion(MemRegionManager *mgr) 2332b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek : MemSpaceRegion(mgr, UnknownSpaceRegionKind) {} 2342b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenekpublic: 2352b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek static bool classof(const MemRegion *R) { 2362b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek return R->getKind() == UnknownSpaceRegionKind; 2372b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek } 2382b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek}; 2392b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek 24067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackSpaceRegion : public MemSpaceRegion { 24167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate: 24267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackFrameContext *SFC; 2439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 24467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprotected: 24567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StackSpaceRegion(MemRegionManager *mgr, Kind k, const StackFrameContext *sfc) 24667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : MemSpaceRegion(mgr, k), SFC(sfc) { 24767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek assert(classof(this)); 24867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 24941168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek 25067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 25167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackFrameContext *getStackFrame() const { return SFC; } 25267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 25367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek void Profile(llvm::FoldingSetNodeID &ID) const; 25467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 25567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 25667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek Kind k = R->getKind(); 25767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return k >= StackLocalsSpaceRegionKind && 25867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek k <= StackArgumentsSpaceRegionKind; 25967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 26067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 26167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 26267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackLocalsSpaceRegion : public StackSpaceRegion { 26367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate: 26467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 26567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StackLocalsSpaceRegion(MemRegionManager *mgr, const StackFrameContext *sfc) 26667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : StackSpaceRegion(mgr, StackLocalsSpaceRegionKind, sfc) {} 26767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 26867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 26967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return R->getKind() == StackLocalsSpaceRegionKind; 27067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 27167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 27267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 27367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackArgumentsSpaceRegion : public StackSpaceRegion { 27467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate: 27567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 27667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StackArgumentsSpaceRegion(MemRegionManager *mgr, const StackFrameContext *sfc) 27767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : StackSpaceRegion(mgr, StackArgumentsSpaceRegionKind, sfc) {} 27867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 27967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 28067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return R->getKind() == StackArgumentsSpaceRegionKind; 2819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 2829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 2839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2847caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 285993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// SubRegion - A region that subsets another larger region. Most regions 286993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// are subclasses of SubRegion. 287993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass SubRegion : public MemRegion { 2889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 2891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const MemRegion* superRegion; 290993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek SubRegion(const MemRegion* sReg, Kind k) : MemRegion(k), superRegion(sReg) {} 2919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 2929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* getSuperRegion() const { 2939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return superRegion; 2949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 2951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 29632f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose /// getExtent - Returns the size of the region in bytes. 29732f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose virtual DefinedOrUnknownSVal getExtent(ValueManager& ValMgr) const { 29832f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose return UnknownVal(); 29932f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose } 30032f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 301a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek MemRegionManager* getMemRegionManager() const; 3021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3037e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu bool isSubRegionOf(const MemRegion* R) const; 3041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 30667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return R->getKind() > END_MEMSPACES; 307993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek } 308993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek}; 3091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 31019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===// 31119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// MemRegion subclasses. 3121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump//===----------------------------------------------------------------------===// 313ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 31482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek/// AllocaRegion - A region that represents an untyped blob of bytes created 31582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek/// by a call to 'alloca'. 31682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekclass AllocaRegion : public SubRegion { 31782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek friend class MemRegionManager; 31882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekprotected: 31982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek unsigned Cnt; // Block counter. Used to distinguish different pieces of 32082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek // memory allocated by alloca at the same call site. 32182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek const Expr* Ex; 32282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 3237ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek AllocaRegion(const Expr* ex, unsigned cnt, const MemRegion *superRegion) 32482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek : SubRegion(superRegion, AllocaRegionKind), Cnt(cnt), Ex(ex) {} 3251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 32682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekpublic: 3271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 32882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek const Expr* getExpr() const { return Ex; } 3299852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu 3309852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu bool isBoundable() const { return true; } 3319852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu 33232f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose DefinedOrUnknownSVal getExtent(ValueManager& ValMgr) const; 33332f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 33482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 33582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 33682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Expr* Ex, 3377ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek unsigned Cnt, const MemRegion *superRegion); 3381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3398800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek void dumpToStream(llvm::raw_ostream& os) const; 3401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek static bool classof(const MemRegion* R) { 34282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek return R->getKind() == AllocaRegionKind; 34382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek } 3441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}; 3451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 346993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// TypedRegion - An abstract class representing regions that are typed. 347993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass TypedRegion : public SubRegion { 348993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekprotected: 349993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek TypedRegion(const MemRegion* sReg, Kind k) : SubRegion(sReg, k) {} 3501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 351993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekpublic: 352018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu virtual QualType getValueType() const = 0; 3531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 354018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu virtual QualType getLocationType() const { 3556eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek // FIXME: We can possibly optimize this later to cache this value. 356018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu return getContext().getPointerType(getValueType()); 3576eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek } 3581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 359018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getDesugaredValueType() const { 360018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType T = getValueType(); 361bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall return T.getTypePtr() ? T.getDesugaredType() : T; 36214553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek } 3631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 364018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getDesugaredLocationType() const { 365018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu return getLocationType().getDesugaredType(); 36614553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek } 3671b9b883a95215e38e153d253a46a2a2fcac25896Ted Kremenek 368cced08e13c9fba9381e39a27c70abe6978adee37Ted Kremenek bool isBoundable() const { return true; } 3696eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek 370993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek static bool classof(const MemRegion* R) { 3719e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek unsigned k = R->getKind(); 37267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return k >= BEG_TYPED_REGIONS && k <= END_TYPED_REGIONS; 3739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 3759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 376ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 377eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass CodeTextRegion : public TypedRegion { 378eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekprotected: 379eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek CodeTextRegion(const MemRegion *sreg, Kind k) : TypedRegion(sreg, k) {} 380ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xupublic: 381018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 382018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu assert(0 && "Do not get the object type of a CodeTextRegion."); 383ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu return QualType(); 384ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu } 385eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 386eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek bool isBoundable() const { return false; } 387eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 388eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek static bool classof(const MemRegion* R) { 389eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek Kind k = R->getKind(); 390eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return k >= FunctionTextRegionKind && k <= BlockTextRegionKind; 391eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek } 392eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek}; 393ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 394eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek/// FunctionTextRegion - A region that represents code texts of function. 395eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass FunctionTextRegion : public CodeTextRegion { 396eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek const FunctionDecl *FD; 397eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekpublic: 398eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek FunctionTextRegion(const FunctionDecl* fd, const MemRegion* sreg) 399eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek : CodeTextRegion(sreg, FunctionTextRegionKind), FD(fd) {} 400eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 401018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getLocationType() const { 402018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu return getContext().getPointerType(FD->getType()); 403ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu } 404eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 405abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek const FunctionDecl *getDecl() const { 406abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek return FD; 40772e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek } 408eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 4098800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek virtual void dumpToStream(llvm::raw_ostream& os) const; 410eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 411ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const; 412eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 413abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const FunctionDecl *FD, 414abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek const MemRegion*); 415eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 416ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu static bool classof(const MemRegion* R) { 417eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return R->getKind() == FunctionTextRegionKind; 418eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek } 419eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek}; 420eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 421eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 422eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek/// BlockTextRegion - A region that represents code texts of blocks (closures). 4230a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// Blocks are represented with two kinds of regions. BlockTextRegions 4240a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// represent the "code", while BlockDataRegions represent instances of blocks, 4250a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// which correspond to "code+data". The distinction is important, because 4260a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// like a closure a block captures the values of externally referenced 4270a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// variables. 428eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass BlockTextRegion : public CodeTextRegion { 42967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 43067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 431eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek const BlockDecl *BD; 43267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek AnalysisContext *AC; 433eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek CanQualType locTy; 43467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 43567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BlockTextRegion(const BlockDecl *bd, CanQualType lTy, 43667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek AnalysisContext *ac, const MemRegion* sreg) 43767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : CodeTextRegion(sreg, BlockTextRegionKind), BD(bd), AC(ac), locTy(lTy) {} 43867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 43967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 440018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getLocationType() const { 441eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return locTy; 442eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek } 443eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 444eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek const BlockDecl *getDecl() const { 445eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return BD; 446eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek } 44767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 44867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek AnalysisContext *getAnalysisContext() const { return AC; } 449eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 450eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek virtual void dumpToStream(llvm::raw_ostream& os) const; 451eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 452eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 453eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 454eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const BlockDecl *BD, 45567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek CanQualType, const AnalysisContext*, 45667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const MemRegion*); 457eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 458eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek static bool classof(const MemRegion* R) { 459eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return R->getKind() == BlockTextRegionKind; 460ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu } 461ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu}; 4620a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 4630a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// BlockDataRegion - A region that represents a block instance. 4640a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// Blocks are represented with two kinds of regions. BlockTextRegions 4650a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// represent the "code", while BlockDataRegions represent instances of blocks, 4660a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// which correspond to "code+data". The distinction is important, because 4670a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// like a closure a block captures the values of externally referenced 4680a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// variables. 4690a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenekclass BlockDataRegion : public SubRegion { 47067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 4710a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek const BlockTextRegion *BC; 47267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *LC; // Can be null */ 4734240096011a187807058f887eb81df750ffa17feTed Kremenek void *ReferencedVars; 47467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 47567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BlockDataRegion(const BlockTextRegion *bc, const LocationContext *lc, 4760a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek const MemRegion *sreg) 4774240096011a187807058f887eb81df750ffa17feTed Kremenek : SubRegion(sreg, BlockDataRegionKind), BC(bc), LC(lc), ReferencedVars(0) {} 4780a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 47967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 4800a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek const BlockTextRegion *getCodeRegion() const { return BC; } 4814240096011a187807058f887eb81df750ffa17feTed Kremenek 482d02e83a548359df978f40cc1a52ffd78b7ef371bTed Kremenek const BlockDecl *getDecl() const { return BC->getDecl(); } 483d02e83a548359df978f40cc1a52ffd78b7ef371bTed Kremenek 48481cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek class referenced_vars_iterator { 48581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek const MemRegion * const *R; 48681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek public: 48781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek explicit referenced_vars_iterator(const MemRegion * const *r) : R(r) {} 48881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek 48981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek operator const MemRegion * const *() const { 49081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return R; 49181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 49281cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek 49381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek const VarRegion* operator*() const { 49481cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return cast<VarRegion>(*R); 49581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 49681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek 49781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek bool operator==(const referenced_vars_iterator &I) const { 49881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return I.R == R; 49981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 50081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek bool operator!=(const referenced_vars_iterator &I) const { 50181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return I.R != R; 50281cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 50381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek referenced_vars_iterator& operator++() { 50481cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek ++R; 50581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return *this; 50681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 50781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek }; 50881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek 5094240096011a187807058f887eb81df750ffa17feTed Kremenek referenced_vars_iterator referenced_vars_begin() const; 5104240096011a187807058f887eb81df750ffa17feTed Kremenek referenced_vars_iterator referenced_vars_end() const; 5110a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 5120a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek virtual void dumpToStream(llvm::raw_ostream& os) const; 5130a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 5140a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 5150a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 51667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID&, const BlockTextRegion *, 51767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *, const MemRegion *); 5180a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 5190a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek static bool classof(const MemRegion* R) { 5200a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek return R->getKind() == BlockDataRegionKind; 5210a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek } 5224240096011a187807058f887eb81df750ffa17feTed Kremenekprivate: 5234240096011a187807058f887eb81df750ffa17feTed Kremenek void LazyInitializeReferencedVars(); 5240a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek}; 525ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 526026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// SymbolicRegion - A special, "non-concrete" region. Unlike other region 527026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// clases, SymbolicRegion represents a region that serves as an alias for 528026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// either a real region, a NULL pointer, etc. It essentially is used to 529026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// map the concept of symbolic values into the domain of regions. Symbolic 530026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// regions do not need to be typed. 531e8e86482da4c1872673bbb9c237649229d19793bTed Kremenekclass SymbolicRegion : public SubRegion { 532026c66395b88a09437319139a43b090093f7e1ddZhongxing Xuprotected: 533026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu const SymbolRef sym; 534026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 535026c66395b88a09437319139a43b090093f7e1ddZhongxing Xupublic: 5361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SymbolicRegion(const SymbolRef s, const MemRegion* sreg) 537e8e86482da4c1872673bbb9c237649229d19793bTed Kremenek : SubRegion(sreg, SymbolicRegionKind), sym(s) {} 5381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 539026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu SymbolRef getSymbol() const { 540026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu return sym; 541026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu } 542026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 5439852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu bool isBoundable() const { return true; } 5449852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu 54532f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose DefinedOrUnknownSVal getExtent(ValueManager& ValMgr) const; 54632f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 547026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const; 548026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 549250101353b711a409b075f1bc11070dddec7100bTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, 550250101353b711a409b075f1bc11070dddec7100bTed Kremenek SymbolRef sym, 551250101353b711a409b075f1bc11070dddec7100bTed Kremenek const MemRegion* superRegion); 5521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5538800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek void dumpToStream(llvm::raw_ostream& os) const; 5541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 555026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu static bool classof(const MemRegion* R) { 556026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu return R->getKind() == SymbolicRegionKind; 557026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu } 5581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}; 559026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 560e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu/// StringRegion - Region associated with a StringLiteral. 561e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuclass StringRegion : public TypedRegion { 562e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu friend class MemRegionManager; 563e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const StringLiteral* Str; 564e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuprotected: 565e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 566250101353b711a409b075f1bc11070dddec7100bTed Kremenek StringRegion(const StringLiteral* str, const MemRegion* sreg) 567e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu : TypedRegion(sreg, StringRegionKind), Str(str) {} 568e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 569e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID& ID, 570e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const StringLiteral* Str, 571e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const MemRegion* superRegion); 572e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 573e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xupublic: 5746613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu 5756613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu const StringLiteral* getStringLiteral() const { return Str; } 5761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 577018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 578ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu return Str->getType(); 579ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu } 580e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 58132f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose DefinedOrUnknownSVal getExtent(ValueManager& ValMgr) const; 58232f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 5830a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu bool isBoundable() const { return false; } 5840a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu 585e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const { 586e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu ProfileRegion(ID, Str, superRegion); 587e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 588e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 5898800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek void dumpToStream(llvm::raw_ostream& os) const; 590cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu 591e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static bool classof(const MemRegion* R) { 592e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu return R->getKind() == StringRegionKind; 593e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 594e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu}; 595e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 596329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// CompoundLiteralRegion - A memory region representing a compound literal. 597329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// Compound literals are essentially temporaries that are stack allocated 598329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// or in the global constant pool. 59977cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xuclass CompoundLiteralRegion : public TypedRegion { 600329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekprivate: 601329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek friend class MemRegionManager; 602329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek const CompoundLiteralExpr* CL; 603329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 604329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek CompoundLiteralRegion(const CompoundLiteralExpr* cl, const MemRegion* sReg) 60577cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu : TypedRegion(sReg, CompoundLiteralRegionKind), CL(cl) {} 6061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 607329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, 608329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek const CompoundLiteralExpr* CL, 609329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek const MemRegion* superRegion); 610329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekpublic: 611018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 612018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu return CL->getType(); 61377cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu } 6140a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu 6159a08fee80a34938b8c11c7166e009a89ced4c2b4Zhongxing Xu bool isBoundable() const { return !CL->isFileScope(); } 6169a08fee80a34938b8c11c7166e009a89ced4c2b4Zhongxing Xu 617329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 6181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6198800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek void dumpToStream(llvm::raw_ostream& os) const; 620329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 62111a83dc7a9a5738cc0bc76180b508eae896eefa9Ted Kremenek const CompoundLiteralExpr* getLiteralExpr() const { return CL; } 6221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 623329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek static bool classof(const MemRegion* R) { 624329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek return R->getKind() == CompoundLiteralRegionKind; 625329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek } 626329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek}; 627178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 6289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass DeclRegion : public TypedRegion { 6299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 6309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const Decl* D; 6319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 632993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek DeclRegion(const Decl* d, const MemRegion* sReg, Kind k) 6339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : TypedRegion(sReg, k), D(d) {} 6349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 6359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl* D, 6369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion, Kind k); 6371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 638bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xupublic: 639bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xu const Decl* getDecl() const { return D; } 6409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 6411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 64232f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose DefinedOrUnknownSVal getExtent(ValueManager& ValMgr) const; 64332f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 644e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static bool classof(const MemRegion* R) { 645e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu unsigned k = R->getKind(); 64667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return k >= BEG_DECL_REGIONS && k <= END_DECL_REGIONS; 647e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 6489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 6491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass VarRegion : public DeclRegion { 6519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 652d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek 653d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek // Constructors and private methods. 65467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek VarRegion(const VarDecl* vd, const MemRegion* sReg) 65567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : DeclRegion(vd, sReg, VarRegionKind) {} 6569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 657250101353b711a409b075f1bc11070dddec7100bTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const VarDecl* VD, 658d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek const MemRegion *superRegion) { 6599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, VD, superRegion, VarRegionKind); 6609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 6611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 662d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 6631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic: 665d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek const VarDecl *getDecl() const { return cast<VarDecl>(D); } 6661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6675348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek const StackFrameContext *getStackFrame() const; 6685348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek 669018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 6706eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek // FIXME: We can cache this if needed. 671018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu return getDecl()->getType(); 6721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 6731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6748800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek void dumpToStream(llvm::raw_ostream& os) const; 6751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 6779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == VarRegionKind; 6781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 6799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 680de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 681de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek/// CXXThisRegion - Represents the region for the implicit 'this' parameter 682de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek/// in a call to a C++ method. This region doesn't represent the object 683de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek/// referred to by 'this', but rather 'this' itself. 684de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekclass CXXThisRegion : public TypedRegion { 685de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek friend class MemRegionManager; 686de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek CXXThisRegion(const PointerType *thisPointerTy, 687de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const MemRegion *sReg) 688de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek : TypedRegion(sReg, CXXThisRegionKind), ThisPointerTy(thisPointerTy) {} 689de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 690de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID &ID, 691de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const PointerType *PT, 692de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const MemRegion *sReg); 693de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 694de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek void Profile(llvm::FoldingSetNodeID &ID) const; 695de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 696de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekpublic: 697018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 698de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek return QualType(ThisPointerTy, 0); 699de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek } 7007caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 701de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek void dumpToStream(llvm::raw_ostream& os) const; 702de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 703de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek static bool classof(const MemRegion* R) { 704de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek return R->getKind() == CXXThisRegionKind; 705de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek } 706de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 707de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekprivate: 708de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const PointerType *ThisPointerTy; 709de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek}; 7109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 7119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass FieldRegion : public DeclRegion { 7129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 7139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 714993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek FieldRegion(const FieldDecl* fd, const MemRegion* sReg) 7159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(fd, sReg, FieldRegionKind) {} 7169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 7174bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenekpublic: 7181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7198800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek void dumpToStream(llvm::raw_ostream& os) const; 7201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7214bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek const FieldDecl* getDecl() const { return cast<FieldDecl>(D); } 7221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 723018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 7246eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek // FIXME: We can cache this if needed. 725018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu return getDecl()->getType(); 7261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 7274bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek 72832f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose DefinedOrUnknownSVal getExtent(ValueManager& ValMgr) const; 72932f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 7306304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const FieldDecl* FD, 7316304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek const MemRegion* superRegion) { 7329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, FD, superRegion, FieldRegionKind); 7339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 7341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 7369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == FieldRegionKind; 7379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 7389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 7391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass ObjCIvarRegion : public DeclRegion { 7411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7429e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 7431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 744993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek ObjCIvarRegion(const ObjCIvarDecl* ivd, const MemRegion* sReg) 7459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(ivd, sReg, ObjCIvarRegionKind) {} 7469e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 7476304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const ObjCIvarDecl* ivd, 7486304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek const MemRegion* superRegion) { 7499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCIvarRegionKind); 7509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 7511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7529e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 7539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const ObjCIvarDecl* getDecl() const { return cast<ObjCIvarDecl>(D); } 754018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { return getDecl()->getType(); } 7551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 756bcfe03a0beb61082fa2f40887216d8dbca19a024Ted Kremenek void dumpToStream(llvm::raw_ostream& os) const; 7571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 7599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == ObjCIvarRegionKind; 7609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 7619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 7627caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu//===----------------------------------------------------------------------===// 7637caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu// Auxillary data classes for use with MemRegions. 7647caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu//===----------------------------------------------------------------------===// 7657caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 7667caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuclass ElementRegion; 7677caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 7687caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuclass RegionRawOffset { 7697caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuprivate: 7707caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu friend class ElementRegion; 7717caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 7727caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu const MemRegion *Region; 7737caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu int64_t Offset; 7747caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 7757caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu RegionRawOffset(const MemRegion* reg, int64_t offset = 0) 7767caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu : Region(reg), Offset(offset) {} 7777caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 7787caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xupublic: 7797caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu // FIXME: Eventually support symbolic offsets. 7807caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu int64_t getByteOffset() const { return Offset; } 7817caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu const MemRegion *getRegion() const { return Region; } 7827caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 7837caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu void dumpToStream(llvm::raw_ostream& os) const; 7847caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu void dump() const; 7857caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu}; 786511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 78727b57063d83b00474d7563fb5d608544e2364862Zhongxing Xuclass ElementRegion : public TypedRegion { 788511191ce8920160525611be2be754c32a0724c3eZhongxing Xu friend class MemRegionManager; 789511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 790f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek QualType ElementType; 79102282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek NonLoc Index; 792511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 79302282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek ElementRegion(QualType elementType, NonLoc Idx, const MemRegion* sReg) 794f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek : TypedRegion(sReg, ElementRegionKind), 795f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek ElementType(elementType), Index(Idx) { 7963d8173c1c68f451c7492f92023d829c626845925Chris Lattner assert((!isa<nonloc::ConcreteInt>(&Idx) || 7973d8173c1c68f451c7492f92023d829c626845925Chris Lattner cast<nonloc::ConcreteInt>(&Idx)->getValue().isSigned()) && 79843b28d07019bc78447ecbbb721526de4ffd83f20Chris Lattner "The index must be signed"); 7990395b5d4987fe5baa818015e9d294c128619e4ecZhongxing Xu } 8001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 801f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, QualType elementType, 802f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek SVal Idx, const MemRegion* superRegion); 803511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 804511191ce8920160525611be2be754c32a0724c3eZhongxing Xupublic: 805511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 80602282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek NonLoc getIndex() const { return Index; } 8076e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu 808018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 809f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek return ElementType; 810f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek } 8111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 812f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek QualType getElementType() const { 813f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek return ElementType; 814abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek } 8157caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu /// Compute the offset within the array. The array might also be a subobject. 8167caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu RegionRawOffset getAsArrayOffset() const; 8171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8188800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek void dumpToStream(llvm::raw_ostream& os) const; 819b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 820511191ce8920160525611be2be754c32a0724c3eZhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const; 821511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 822511191ce8920160525611be2be754c32a0724c3eZhongxing Xu static bool classof(const MemRegion* R) { 823511191ce8920160525611be2be754c32a0724c3eZhongxing Xu return R->getKind() == ElementRegionKind; 824511191ce8920160525611be2be754c32a0724c3eZhongxing Xu } 825511191ce8920160525611be2be754c32a0724c3eZhongxing Xu}; 82619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 827bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu// C++ temporary object associated with an expression. 828bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xuclass CXXObjectRegion : public TypedRegion { 829bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu friend class MemRegionManager; 830bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 831bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu Expr const *Ex; 832bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 833bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu CXXObjectRegion(Expr const *E, MemRegion const *sReg) 834bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu : TypedRegion(sReg, CXXObjectRegionKind), Ex(E) {} 835bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 836bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID &ID, 837bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu Expr const *E, const MemRegion *sReg); 838bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 839bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xupublic: 840018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 841bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu return Ex->getType(); 842bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu } 843bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 844e1aeb13251a4858724d2b7ad1925d25076f23d08Zhongxing Xu void dumpToStream(llvm::raw_ostream& os) const; 845e1aeb13251a4858724d2b7ad1925d25076f23d08Zhongxing Xu 846bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu void Profile(llvm::FoldingSetNodeID &ID) const; 847bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 848bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu static bool classof(const MemRegion* R) { 849bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu return R->getKind() == CXXObjectRegionKind; 850bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu } 851bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu}; 852bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 853ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenektemplate<typename RegionTy> 854ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenekconst RegionTy* MemRegion::getAs() const { 855f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek if (const RegionTy* RT = dyn_cast<RegionTy>(this)) 856f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek return RT; 8571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 858f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek return NULL; 859ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek} 860511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 8619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 8629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager - Factory object for creating regions. 8639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 8649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 8659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager { 866a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek ASTContext &C; 8679e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek llvm::BumpPtrAllocator& A; 8689e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek llvm::FoldingSet<MemRegion> Regions; 8691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 870dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek NonStaticGlobalSpaceRegion *globals; 8712b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek 872c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu llvm::DenseMap<const StackFrameContext *, StackLocalsSpaceRegion *> 873c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu StackLocalsSpaceRegions; 874c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu llvm::DenseMap<const StackFrameContext *, StackArgumentsSpaceRegion *> 875c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu StackArgumentsSpaceRegions; 876dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek llvm::DenseMap<const CodeTextRegion *, StaticGlobalSpaceRegion *> 877dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek StaticsGlobalSpaceRegions; 8782b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek 87967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek HeapSpaceRegion *heap; 8802b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek UnknownSpaceRegion *unknown; 881d05552a21377f493c882298c59e8829040b01d34Ted Kremenek MemSpaceRegion *code; 882dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 8839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 884a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek MemRegionManager(ASTContext &c, llvm::BumpPtrAllocator& a) 885c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu : C(c), A(a), globals(0), heap(0), unknown(0), code(0) {} 8861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8874240096011a187807058f887eb81df750ffa17feTed Kremenek ~MemRegionManager(); 8881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 889a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek ASTContext &getContext() { return C; } 8904240096011a187807058f887eb81df750ffa17feTed Kremenek 8914240096011a187807058f887eb81df750ffa17feTed Kremenek llvm::BumpPtrAllocator &getAllocator() { return A; } 8921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 89367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// getStackLocalsRegion - Retrieve the memory region associated with the 89467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// specified stack frame. 89567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackLocalsSpaceRegion * 89667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek getStackLocalsRegion(const StackFrameContext *STC); 897d05552a21377f493c882298c59e8829040b01d34Ted Kremenek 898d05552a21377f493c882298c59e8829040b01d34Ted Kremenek /// getStackArgumentsRegion - Retrieve the memory region associated with 89967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// function/method arguments of the specified stack frame. 90067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackArgumentsSpaceRegion * 90167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek getStackArgumentsRegion(const StackFrameContext *STC); 9021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getGlobalsRegion - Retrieve the memory region associated with 904dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek /// global variables. 905dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek const GlobalsSpaceRegion *getGlobalsRegion(const CodeTextRegion *R = 0); 9061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getHeapRegion - Retrieve the memory region associated with the 9089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// generic "heap". 90967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const HeapSpaceRegion *getHeapRegion(); 910178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 911178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu /// getUnknownRegion - Retrieve the memory region associated with unknown 912178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu /// memory space. 913b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemSpaceRegion *getUnknownRegion(); 914c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu 915b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemSpaceRegion *getCodeRegion(); 916ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 9177090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek /// getAllocaRegion - Retrieve a region associated with a call to alloca(). 91867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const AllocaRegion *getAllocaRegion(const Expr* Ex, unsigned Cnt, 91967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *LC); 9201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 921329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek /// getCompoundLiteralRegion - Retrieve the region associated with a 922329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek /// given CompoundLiteral. 923b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const CompoundLiteralRegion* 92467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek getCompoundLiteralRegion(const CompoundLiteralExpr* CL, 92567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *LC); 926de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 927de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek /// getCXXThisRegion - Retrieve the [artifical] region associated with the 928de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek /// parameter 'this'. 929de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const CXXThisRegion *getCXXThisRegion(QualType thisPointerTy, 930de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const LocationContext *LC); 9311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 932993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek /// getSymbolicRegion - Retrieve or create a "symbolic" memory region. 933b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const SymbolicRegion* getSymbolicRegion(SymbolRef sym); 934e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 935b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const StringRegion* getStringRegion(const StringLiteral* Str); 936e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 9379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getVarRegion - Retrieve or create the memory region associated with 938d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek /// a specified VarDecl and LocationContext. 939b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const VarRegion* getVarRegion(const VarDecl *D, const LocationContext *LC); 9401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 94167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// getVarRegion - Retrieve or create the memory region associated with 94267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// a specified VarDecl and super region. 94367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const VarRegion* getVarRegion(const VarDecl *D, const MemRegion *superR); 94467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 945f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek /// getElementRegion - Retrieve the memory region associated with the 946f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek /// associated element type, index, and super region. 94702282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek const ElementRegion *getElementRegion(QualType elementType, NonLoc Idx, 948856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu const MemRegion *superRegion, 949856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu ASTContext &Ctx); 9501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 951b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const ElementRegion *getElementRegionWithSuper(const ElementRegion *ER, 952856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu const MemRegion *superRegion) { 953a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek return getElementRegion(ER->getElementType(), ER->getIndex(), 954a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek superRegion, ER->getContext()); 955a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek } 956511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 9579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getFieldRegion - Retrieve or create the memory region associated with 9589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a specified FieldDecl. 'superRegion' corresponds to the containing 9599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// memory region (which typically represents the memory representing 9609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a structure or class). 961b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const FieldRegion *getFieldRegion(const FieldDecl* fd, 962b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemRegion* superRegion); 9631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 964b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const FieldRegion *getFieldRegionWithSuper(const FieldRegion *FR, 965b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemRegion *superRegion) { 966a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek return getFieldRegion(FR->getDecl(), superRegion); 967a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek } 9681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getObjCIvarRegion - Retrieve or create the memory region associated with 9709e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a specified Objective-c instance variable. 'superRegion' corresponds 9719e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// to the containing region (which typically represents the Objective-C 9729e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// object). 973b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const ObjCIvarRegion *getObjCIvarRegion(const ObjCIvarDecl* ivd, 974b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemRegion* superRegion); 9751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 976bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu const CXXObjectRegion *getCXXObjectRegion(Expr const *Ex, 977bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu LocationContext const *LC); 978bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 979b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const FunctionTextRegion *getFunctionTextRegion(const FunctionDecl *FD); 980b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const BlockTextRegion *getBlockTextRegion(const BlockDecl *BD, 98167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek CanQualType locTy, 98267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek AnalysisContext *AC); 98367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 98467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// getBlockDataRegion - Get the memory region associated with an instance 98567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// of a block. Unlike many other MemRegions, the LocationContext* 98667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// argument is allowed to be NULL for cases where we have no known 98767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// context. 988b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const BlockDataRegion *getBlockDataRegion(const BlockTextRegion *bc, 98967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *lc = NULL); 9901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 991bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek bool isGlobalsRegion(const MemRegion* R) { 992bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek assert(R); 993bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek return R == globals; 994bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek } 995bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek 996bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenekprivate: 997250101353b711a409b075f1bc11070dddec7100bTed Kremenek template <typename RegionTy, typename A1> 998250101353b711a409b075f1bc11070dddec7100bTed Kremenek RegionTy* getRegion(const A1 a1); 9991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 10006304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek template <typename RegionTy, typename A1> 1001eeea45611d45238c34474c183cee96d47ae79e24Ted Kremenek RegionTy* getSubRegion(const A1 a1, const MemRegion* superRegion); 10021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 10037ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek template <typename RegionTy, typename A1, typename A2> 10047ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek RegionTy* getRegion(const A1 a1, const A2 a2); 1005dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 10060a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek template <typename RegionTy, typename A1, typename A2> 10070a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek RegionTy* getSubRegion(const A1 a1, const A2 a2, 10080a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek const MemRegion* superRegion); 10090a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 101067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek template <typename RegionTy, typename A1, typename A2, typename A3> 101167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek RegionTy* getSubRegion(const A1 a1, const A2 a2, const A3 a3, 101267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const MemRegion* superRegion); 101367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 101467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek template <typename REG> 101567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const REG* LazyAllocate(REG*& region); 101667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 101767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek template <typename REG, typename ARG> 101867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const REG* LazyAllocate(REG*& region, ARG a); 1019ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek}; 10201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1021250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 1022a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek// Out-of-line member definitions. 1023250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 1024250101353b711a409b075f1bc11070dddec7100bTed Kremenek 1025a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenekinline ASTContext& MemRegion::getContext() const { 1026a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek return getMemRegionManager()->getContext(); 1027a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek} 1028eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 1029be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end clang namespace 10309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1031250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 1032250101353b711a409b075f1bc11070dddec7100bTed Kremenek// Pretty-printing regions. 1033250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 1034250101353b711a409b075f1bc11070dddec7100bTed Kremenek 1035be91224894e1501133e224934285ba6440bf5b59Ted Kremeneknamespace llvm { 10368800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenekstatic inline raw_ostream& operator<<(raw_ostream& os, 10371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const clang::MemRegion* R) { 10388800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek R->dumpToStream(os); 10398800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek return os; 1040be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} 1041be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end llvm namespace 10429e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 10439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#endif 1044