MemRegion.h revision 511191ce8920160525611be2be754c32a0724c3e
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" 22511191ce8920160525611be2be754c32a0724c3eZhongxing Xu#include "clang/Analysis/PathSensitive/RValues.h" 239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/Support/Casting.h" 249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/ADT/FoldingSet.h" 259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/Support/Allocator.h" 269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include <string> 279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremeneknamespace llvm { class raw_ostream; } 299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremeneknamespace clang { 319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager; 339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemRegion - The root abstract class for all memory regions. 369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegion : public llvm::FoldingSetNode { 379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 38993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek enum Kind { MemSpaceRegionKind, SymbolicRegionKind, 399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek // Typed regions. 409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek BEG_TYPED_REGIONS, 41511191ce8920160525611be2be754c32a0724c3eZhongxing Xu VarRegionKind, FieldRegionKind, ElementRegionKind, 42511191ce8920160525611be2be754c32a0724c3eZhongxing Xu ObjCIvarRegionKind, 43178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu AnonTypedRegionKind, AnonPointeeRegionKind, 449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek END_TYPED_REGIONS }; 459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate: 469e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const Kind kind; 479e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemRegion(Kind k) : kind(k) {} 509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek virtual ~MemRegion(); 519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 529e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek // virtual MemExtent getExtent(MemRegionManager& mrm) const = 0; 549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek virtual void Profile(llvm::FoldingSetNodeID& ID) const = 0; 559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek std::string getString() const; 579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek virtual void print(llvm::raw_ostream& os) const; 589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek Kind getKind() const { return kind; } 609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion*) { return true; } 619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemSpaceRegion - A memory region that represents and "memory space"; 649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// for example, the set of global variables, the stack frame, etc. 659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemSpaceRegion : public MemRegion { 669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 679e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion() : MemRegion(MemSpaceRegionKind) {} 689e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 709e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek //RegionExtent getExtent() const { return UndefinedExtent(); } 719e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 729e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == MemSpaceRegionKind; 769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 79993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// SubRegion - A region that subsets another larger region. Most regions 80993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// are subclasses of SubRegion. 81993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass SubRegion : public MemRegion { 829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 83993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek const MemRegion* superRegion; 84993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek SubRegion(const MemRegion* sReg, Kind k) : MemRegion(k), superRegion(sReg) {} 859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* getSuperRegion() const { 889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return superRegion; 899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 92993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek return R->getKind() > SymbolicRegionKind; 93993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek } 94993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek}; 95993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 96993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// SymbolicRegion - A special, "non-concrete" region. Unlike other region 97993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// clases, SymbolicRegion represents a region that serves as an alias for 98993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// either a real region, a NULL pointer, etc. It essentially is used to 99993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// map the concept of symbolic values into the domain of regions. Symbolic 100993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// regions do not need to be typed. 101993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass SymbolicRegion : public MemRegion { 102993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekprotected: 103993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek const SymbolID sym; 104993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 105993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekpublic: 106993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek SymbolicRegion(const SymbolID s) : MemRegion(SymbolicRegionKind), sym(s) {} 107993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 108993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek SymbolID getSymbol() const { 109993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek return sym; 110993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek } 111993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 112993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 113993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, SymbolID sym); 114993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 115993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek void print(llvm::raw_ostream& os) const; 116993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 117993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek static bool classof(const MemRegion* R) { 118993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek return R->getKind() == SymbolicRegionKind; 119993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek } 120993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek}; 121993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 122993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// TypedRegion - An abstract class representing regions that are typed. 123993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass TypedRegion : public SubRegion { 124993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekprotected: 125993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek TypedRegion(const MemRegion* sReg, Kind k) : SubRegion(sReg, k) {} 126993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 127993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekpublic: 128993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek virtual QualType getType() const = 0; 129993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 130993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek static bool classof(const MemRegion* R) { 1319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek unsigned k = R->getKind(); 1329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return k > BEG_TYPED_REGIONS && k < END_TYPED_REGIONS; 1339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 1349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 1359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// AnonTypedRegion - An "anonymous" region that simply types a chunk 1379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// of memory. 1389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass AnonTypedRegion : public TypedRegion { 139178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xuprotected: 1409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek QualType T; 1419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1429e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 1439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek AnonTypedRegion(QualType t, MemRegion* sreg) 1459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : TypedRegion(sreg, AnonTypedRegionKind), T(t) {} 1469e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1479e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, QualType T, 148178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu const MemRegion* superRegion); 149178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 1509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 1519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek QualType getType() const { return T; } 1529e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 1559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 1579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == AnonTypedRegionKind; 1589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 1599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 1609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 161178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu/// AnonPointeeRegion - anonymous regions pointed-at by pointer function 162178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu/// parameters or pointer globals. In RegionStoreManager, we assume pointer 163178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu/// parameters or globals point at some anonymous region initially. Such 164178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu/// regions are not the regions associated with the pointers themselves, but 165178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu/// are identified with the VarDecl of the parameters or globals. 166178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xuclass AnonPointeeRegion : public AnonTypedRegion { 167178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu friend class MemRegionManager; 168178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu // VD - the pointer variable that points at this region. 169178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu const VarDecl* VD; 170178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 171178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu AnonPointeeRegion(const VarDecl* d, QualType t, MemRegion* sreg) 172178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu : AnonTypedRegion(t, sreg), VD(d) {} 173178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 174178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xupublic: 175178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID& ID, const VarDecl* PVD, 176178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu QualType T, const MemRegion* superRegion); 177178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu}; 178178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 179178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu/// AnonHeapRegion - anonymous region created by malloc(). 180178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xuclass AnonHeapRegion : public AnonTypedRegion { 181178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu}; 182178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 1839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass DeclRegion : public TypedRegion { 1849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 1859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const Decl* D; 1869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 187993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek DeclRegion(const Decl* d, const MemRegion* sReg, Kind k) 1889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : TypedRegion(sReg, k), D(d) {} 1899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl* D, 1919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion, Kind k); 1929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 1949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 1959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 1969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass VarRegion : public DeclRegion { 1989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 1999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 200993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek VarRegion(const VarDecl* vd, const MemRegion* sReg) 2019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(vd, sReg, VarRegionKind) {} 2029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, VarDecl* VD, 2049e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion) { 2059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, VD, superRegion, VarRegionKind); 2069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 2079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 2099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const VarDecl* getDecl() const { return cast<VarDecl>(D); } 2109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek QualType getType() const { return getDecl()->getType(); } 2119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek void print(llvm::raw_ostream& os) const; 2139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 2159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == VarRegionKind; 2169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 2179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 2189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass FieldRegion : public DeclRegion { 2209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 2219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 222993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek FieldRegion(const FieldDecl* fd, const MemRegion* sReg) 2239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(fd, sReg, FieldRegionKind) {} 2249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2254bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenekpublic: 2264bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek 2274bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek void print(llvm::raw_ostream& os) const; 2284bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek 2294bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek const FieldDecl* getDecl() const { return cast<FieldDecl>(D); } 2304bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek QualType getType() const { return getDecl()->getType(); } 2314bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek 2329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, FieldDecl* FD, 2339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion) { 2349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, FD, superRegion, FieldRegionKind); 2359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 2369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 2389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == FieldRegionKind; 2399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 2409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 2419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2429e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass ObjCIvarRegion : public DeclRegion { 2439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 2459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 246993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek ObjCIvarRegion(const ObjCIvarDecl* ivd, const MemRegion* sReg) 2479e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(ivd, sReg, ObjCIvarRegionKind) {} 2489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, ObjCIvarDecl* ivd, 2509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion) { 2519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCIvarRegionKind); 2529e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 2539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 2559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const ObjCIvarDecl* getDecl() const { return cast<ObjCIvarDecl>(D); } 2569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek QualType getType() const { return getDecl()->getType(); } 2579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 2599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == ObjCIvarRegionKind; 2609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 2619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 262511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 263511191ce8920160525611be2be754c32a0724c3eZhongxing Xuclass ElementRegion : public SubRegion { 264511191ce8920160525611be2be754c32a0724c3eZhongxing Xu friend class MemRegionManager; 265511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 266511191ce8920160525611be2be754c32a0724c3eZhongxing Xu SVal Index; 267511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 268511191ce8920160525611be2be754c32a0724c3eZhongxing Xu ElementRegion(SVal Idx, const MemRegion* sReg) 269511191ce8920160525611be2be754c32a0724c3eZhongxing Xu : SubRegion(sReg, ElementRegionKind), Index(Idx) {} 270511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 271511191ce8920160525611be2be754c32a0724c3eZhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID& ID, SVal Idx, 272511191ce8920160525611be2be754c32a0724c3eZhongxing Xu const MemRegion* superRegion); 273511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 274511191ce8920160525611be2be754c32a0724c3eZhongxing Xupublic: 275511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 276511191ce8920160525611be2be754c32a0724c3eZhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const; 277511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 278511191ce8920160525611be2be754c32a0724c3eZhongxing Xu static bool classof(const MemRegion* R) { 279511191ce8920160525611be2be754c32a0724c3eZhongxing Xu return R->getKind() == ElementRegionKind; 280511191ce8920160525611be2be754c32a0724c3eZhongxing Xu } 281511191ce8920160525611be2be754c32a0724c3eZhongxing Xu}; 282511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 2839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 2849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager - Factory object for creating regions. 2859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 2869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager { 2889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek llvm::BumpPtrAllocator& A; 2899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek llvm::FoldingSet<MemRegion> Regions; 2909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* globals; 2929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* stack; 2939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* heap; 294178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu MemSpaceRegion* unknown; 2959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 2979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemRegionManager(llvm::BumpPtrAllocator& a) 2989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : A(a), globals(0), stack(0), heap(0) {} 2999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek ~MemRegionManager() {} 3019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getStackRegion - Retrieve the memory region associated with the 3039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// current stack frame. 3049e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* getStackRegion(); 3059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getGlobalsRegion - Retrieve the memory region associated with 3079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// all global variables. 3089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* getGlobalsRegion(); 3099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getHeapRegion - Retrieve the memory region associated with the 3119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// generic "heap". 3129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* getHeapRegion(); 313178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 314178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu /// getUnknownRegion - Retrieve the memory region associated with unknown 315178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu /// memory space. 316178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu MemSpaceRegion* getUnknownRegion(); 3179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 318993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek /// getSymbolicRegion - Retrieve or create a "symbolic" memory region. 319993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek SymbolicRegion* getSymbolicRegion(const SymbolID sym); 320993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 3219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getVarRegion - Retrieve or create the memory region associated with 3229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a specified VarDecl. 'superRegion' corresponds to the containing 3239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// memory region, and 'off' is the offset within the containing region. 324993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek VarRegion* getVarRegion(const VarDecl* vd, const MemRegion* superRegion); 3259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek VarRegion* getVarRegion(const VarDecl* vd) { 3279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return getVarRegion(vd, vd->hasLocalStorage() ? getStackRegion() 3289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : getGlobalsRegion()); 3299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 330511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 331511191ce8920160525611be2be754c32a0724c3eZhongxing Xu ElementRegion* getElementRegion(SVal Idx, const MemRegion* superRegion); 332511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 3339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getFieldRegion - Retrieve or create the memory region associated with 3349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a specified FieldDecl. 'superRegion' corresponds to the containing 3359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// memory region (which typically represents the memory representing 3369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a structure or class). 337993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek FieldRegion* getFieldRegion(const FieldDecl* fd, const MemRegion* superRegion); 3389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getObjCIvarRegion - Retrieve or create the memory region associated with 3409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a specified Objective-c instance variable. 'superRegion' corresponds 3419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// to the containing region (which typically represents the Objective-C 3429e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// object). 3439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek ObjCIvarRegion* getObjCIvarRegion(const ObjCIvarDecl* ivd, 344993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek const MemRegion* superRegion); 345178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 346178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu AnonPointeeRegion* getAnonPointeeRegion(const VarDecl* d); 347178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 3489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek bool hasStackStorage(const MemRegion* R); 3499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate: 3519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* LazyAllocate(MemSpaceRegion*& region); 3529e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 3539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} // end clang namespace 3579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#endif 358