MemRegion.h revision 4bd1eefd48c70ebef185e524d0484c00f16000cf
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" 229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/Support/Casting.h" 239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/ADT/FoldingSet.h" 249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/Support/Allocator.h" 259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include <string> 269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremeneknamespace llvm { class raw_ostream; } 289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremeneknamespace clang { 309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager; 329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemRegion - The root abstract class for all memory regions. 359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegion : public llvm::FoldingSetNode { 369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 37993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek enum Kind { MemSpaceRegionKind, SymbolicRegionKind, 389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek // Typed regions. 399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek BEG_TYPED_REGIONS, 409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek VarRegionKind, FieldRegionKind, ObjCIvarRegionKind, 41178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu AnonTypedRegionKind, AnonPointeeRegionKind, 429e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek END_TYPED_REGIONS }; 439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate: 449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const Kind kind; 459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 469e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 479e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemRegion(Kind k) : kind(k) {} 489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek virtual ~MemRegion(); 499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek // virtual MemExtent getExtent(MemRegionManager& mrm) const = 0; 529e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek virtual void Profile(llvm::FoldingSetNodeID& ID) const = 0; 539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek std::string getString() const; 559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek virtual void print(llvm::raw_ostream& os) const; 569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek Kind getKind() const { return kind; } 589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion*) { return true; } 599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemSpaceRegion - A memory region that represents and "memory space"; 629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// for example, the set of global variables, the stack frame, etc. 639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemSpaceRegion : public MemRegion { 649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion() : MemRegion(MemSpaceRegionKind) {} 669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 679e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 689e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek //RegionExtent getExtent() const { return UndefinedExtent(); } 699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 709e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 719e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 729e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == MemSpaceRegionKind; 749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 77993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// SubRegion - A region that subsets another larger region. Most regions 78993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// are subclasses of SubRegion. 79993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass SubRegion : public MemRegion { 809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 81993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek const MemRegion* superRegion; 82993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek SubRegion(const MemRegion* sReg, Kind k) : MemRegion(k), superRegion(sReg) {} 839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* getSuperRegion() const { 869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return superRegion; 879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 90993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek return R->getKind() > SymbolicRegionKind; 91993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek } 92993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek}; 93993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 94993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// SymbolicRegion - A special, "non-concrete" region. Unlike other region 95993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// clases, SymbolicRegion represents a region that serves as an alias for 96993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// either a real region, a NULL pointer, etc. It essentially is used to 97993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// map the concept of symbolic values into the domain of regions. Symbolic 98993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// regions do not need to be typed. 99993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass SymbolicRegion : public MemRegion { 100993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekprotected: 101993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek const SymbolID sym; 102993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 103993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekpublic: 104993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek SymbolicRegion(const SymbolID s) : MemRegion(SymbolicRegionKind), sym(s) {} 105993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 106993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek SymbolID getSymbol() const { 107993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek return sym; 108993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek } 109993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 110993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 111993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, SymbolID sym); 112993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 113993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek void print(llvm::raw_ostream& os) const; 114993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 115993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek static bool classof(const MemRegion* R) { 116993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek return R->getKind() == SymbolicRegionKind; 117993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek } 118993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek}; 119993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 120993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// TypedRegion - An abstract class representing regions that are typed. 121993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass TypedRegion : public SubRegion { 122993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekprotected: 123993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek TypedRegion(const MemRegion* sReg, Kind k) : SubRegion(sReg, k) {} 124993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 125993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekpublic: 126993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek virtual QualType getType() const = 0; 127993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 128993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek static bool classof(const MemRegion* R) { 1299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek unsigned k = R->getKind(); 1309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return k > BEG_TYPED_REGIONS && k < END_TYPED_REGIONS; 1319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 1329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 1339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// AnonTypedRegion - An "anonymous" region that simply types a chunk 1359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// of memory. 1369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass AnonTypedRegion : public TypedRegion { 137178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xuprotected: 1389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek QualType T; 1399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 1419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1429e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek AnonTypedRegion(QualType t, MemRegion* sreg) 1439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : TypedRegion(sreg, AnonTypedRegionKind), T(t) {} 1449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, QualType T, 146178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu const MemRegion* superRegion); 147178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 1489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 1499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek QualType getType() const { return T; } 1509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1529e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 1539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 1559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == AnonTypedRegionKind; 1569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 1579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 1589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 159178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu/// AnonPointeeRegion - anonymous regions pointed-at by pointer function 160178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu/// parameters or pointer globals. In RegionStoreManager, we assume pointer 161178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu/// parameters or globals point at some anonymous region initially. Such 162178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu/// regions are not the regions associated with the pointers themselves, but 163178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu/// are identified with the VarDecl of the parameters or globals. 164178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xuclass AnonPointeeRegion : public AnonTypedRegion { 165178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu friend class MemRegionManager; 166178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu // VD - the pointer variable that points at this region. 167178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu const VarDecl* VD; 168178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 169178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu AnonPointeeRegion(const VarDecl* d, QualType t, MemRegion* sreg) 170178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu : AnonTypedRegion(t, sreg), VD(d) {} 171178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 172178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xupublic: 173178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID& ID, const VarDecl* PVD, 174178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu QualType T, const MemRegion* superRegion); 175178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu}; 176178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 177178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu/// AnonHeapRegion - anonymous region created by malloc(). 178178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xuclass AnonHeapRegion : public AnonTypedRegion { 179178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu}; 180178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 1819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass DeclRegion : public TypedRegion { 1829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 1839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const Decl* D; 1849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 185993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek DeclRegion(const Decl* d, const MemRegion* sReg, Kind k) 1869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : TypedRegion(sReg, k), D(d) {} 1879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl* D, 1899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion, Kind k); 1909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 1929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 1939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 1949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass VarRegion : public DeclRegion { 1969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 1979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 198993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek VarRegion(const VarDecl* vd, const MemRegion* sReg) 1999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(vd, sReg, VarRegionKind) {} 2009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, VarDecl* VD, 2029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion) { 2039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, VD, superRegion, VarRegionKind); 2049e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 2059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 2079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const VarDecl* getDecl() const { return cast<VarDecl>(D); } 2089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek QualType getType() const { return getDecl()->getType(); } 2099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek void print(llvm::raw_ostream& os) const; 2119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 2139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == VarRegionKind; 2149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 2159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 2169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass FieldRegion : public DeclRegion { 2189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 2199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 220993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek FieldRegion(const FieldDecl* fd, const MemRegion* sReg) 2219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(fd, sReg, FieldRegionKind) {} 2229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2234bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenekpublic: 2244bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek 2254bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek void print(llvm::raw_ostream& os) const; 2264bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek 2274bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek const FieldDecl* getDecl() const { return cast<FieldDecl>(D); } 2284bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek QualType getType() const { return getDecl()->getType(); } 2294bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek 2309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, FieldDecl* FD, 2319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion) { 2329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, FD, superRegion, FieldRegionKind); 2339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 2349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 2369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == FieldRegionKind; 2379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 2389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 2399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass ObjCIvarRegion : public DeclRegion { 2419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2429e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 2439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 244993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek ObjCIvarRegion(const ObjCIvarDecl* ivd, const MemRegion* sReg) 2459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(ivd, sReg, ObjCIvarRegionKind) {} 2469e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2479e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, ObjCIvarDecl* ivd, 2489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion) { 2499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCIvarRegionKind); 2509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 2519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2529e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 2539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const ObjCIvarDecl* getDecl() const { return cast<ObjCIvarDecl>(D); } 2549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek QualType getType() const { return getDecl()->getType(); } 2559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 2579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == ObjCIvarRegionKind; 2589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 2599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 2609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 2629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager - Factory object for creating regions. 2639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 2649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager { 2669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek llvm::BumpPtrAllocator& A; 2679e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek llvm::FoldingSet<MemRegion> Regions; 2689e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* globals; 2709e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* stack; 2719e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* heap; 272178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu MemSpaceRegion* unknown; 2739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 2759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemRegionManager(llvm::BumpPtrAllocator& a) 2769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : A(a), globals(0), stack(0), heap(0) {} 2779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek ~MemRegionManager() {} 2799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getStackRegion - Retrieve the memory region associated with the 2819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// current stack frame. 2829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* getStackRegion(); 2839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getGlobalsRegion - Retrieve the memory region associated with 2859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// all global variables. 2869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* getGlobalsRegion(); 2879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getHeapRegion - Retrieve the memory region associated with the 2899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// generic "heap". 2909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* getHeapRegion(); 291178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 292178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu /// getUnknownRegion - Retrieve the memory region associated with unknown 293178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu /// memory space. 294178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu MemSpaceRegion* getUnknownRegion(); 2959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 296993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek /// getSymbolicRegion - Retrieve or create a "symbolic" memory region. 297993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek SymbolicRegion* getSymbolicRegion(const SymbolID sym); 298993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 2999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getVarRegion - Retrieve or create the memory region associated with 3009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a specified VarDecl. 'superRegion' corresponds to the containing 3019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// memory region, and 'off' is the offset within the containing region. 302993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek VarRegion* getVarRegion(const VarDecl* vd, const MemRegion* superRegion); 3039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3049e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek VarRegion* getVarRegion(const VarDecl* vd) { 3059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return getVarRegion(vd, vd->hasLocalStorage() ? getStackRegion() 3069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : getGlobalsRegion()); 3079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getFieldRegion - Retrieve or create the memory region associated with 3109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a specified FieldDecl. 'superRegion' corresponds to the containing 3119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// memory region (which typically represents the memory representing 3129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a structure or class). 313993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek FieldRegion* getFieldRegion(const FieldDecl* fd, const MemRegion* superRegion); 3149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getObjCIvarRegion - Retrieve or create the memory region associated with 3169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a specified Objective-c instance variable. 'superRegion' corresponds 3179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// to the containing region (which typically represents the Objective-C 3189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// object). 3199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek ObjCIvarRegion* getObjCIvarRegion(const ObjCIvarDecl* ivd, 320993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek const MemRegion* superRegion); 321178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 322178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu AnonPointeeRegion* getAnonPointeeRegion(const VarDecl* d); 323178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 3249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek bool hasStackStorage(const MemRegion* R); 3259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate: 3279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* LazyAllocate(MemSpaceRegion*& region); 3289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 3299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} // end clang namespace 3339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#endif 334