MemRegion.h revision 7090ae1a984eb446a5fb4da7b1f2573830653799
19e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//== MemRegion.h - Abstract memory regions for static analysis --*- C++ -*--==// 29e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// 39e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// The LLVM Compiler Infrastructure 49e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// 59e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// This file is distributed under the University of Illinois Open Source 69e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// License. See LICENSE.TXT for details. 79e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// 89e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 99e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// 109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// This file defines MemRegion and its subclasses. MemRegion defines a 119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// partially-typed abstraction of memory useful for path-sensitive dataflow 129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// analyses. 139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// 149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#ifndef LLVM_CLANG_ANALYSIS_MEMREGION_H 179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#define LLVM_CLANG_ANALYSIS_MEMREGION_H 189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 19993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek#include "clang/AST/Decl.h" 20993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek#include "clang/AST/DeclObjC.h" 21993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek#include "clang/Analysis/PathSensitive/SymbolManager.h" 2222ab7a4d900ed53285fd0b6720e7b43af84724d8Zhongxing Xu#include "clang/Analysis/PathSensitive/SVals.h" 23a693d4fa7a6dc31b23837cf38cba7aa2af8f00f3Ted Kremenek#include "clang/AST/ASTContext.h" 249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/Support/Casting.h" 259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/ADT/FoldingSet.h" 269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/Support/Allocator.h" 279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include <string> 289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremeneknamespace llvm { class raw_ostream; } 309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremeneknamespace clang { 329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager; 349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemRegion - The root abstract class for all memory regions. 379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegion : public llvm::FoldingSetNode { 389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 39993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek enum Kind { MemSpaceRegionKind, SymbolicRegionKind, 407090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek AllocaRegionKind, 419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek // Typed regions. 429e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek BEG_TYPED_REGIONS, 4377cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu CompoundLiteralRegionKind, 44329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek StringRegionKind, ElementRegionKind, 45329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek // Decl Regions. 46329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek BEG_DECL_REGIONS, 47329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek VarRegionKind, FieldRegionKind, 48329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek ObjCIvarRegionKind, ObjCObjectRegionKind, 49329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek END_DECL_REGIONS, 50329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek AnonTypedRegionKind, AnonPointeeRegionKind, 519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek END_TYPED_REGIONS }; 529e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate: 539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const Kind kind; 549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemRegion(Kind k) : kind(k) {} 579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek virtual ~MemRegion(); 589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek // virtual MemExtent getExtent(MemRegionManager& mrm) const = 0; 619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek virtual void Profile(llvm::FoldingSetNodeID& ID) const = 0; 629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek std::string getString() const; 64b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek virtual void print(llvm::raw_ostream& os) const; 669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 679e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek Kind getKind() const { return kind; } 68b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion*) { return true; } 709e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 719e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 729e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemSpaceRegion - A memory region that represents and "memory space"; 739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// for example, the set of global variables, the stack frame, etc. 749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemSpaceRegion : public MemRegion { 759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion() : MemRegion(MemSpaceRegionKind) {} 779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek //RegionExtent getExtent() const { return UndefinedExtent(); } 809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == MemSpaceRegionKind; 859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 88993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// SubRegion - A region that subsets another larger region. Most regions 89993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// are subclasses of SubRegion. 90993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass SubRegion : public MemRegion { 919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 92993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek const MemRegion* superRegion; 93993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek SubRegion(const MemRegion* sReg, Kind k) : MemRegion(k), superRegion(sReg) {} 949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* getSuperRegion() const { 979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return superRegion; 989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 101993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek return R->getKind() > SymbolicRegionKind; 102993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek } 103993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek}; 104993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 1057090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek/// AllocaRegion - A region that represents an untyped blob of bytes created 1067090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek/// by a call to 'alloca'. 1077090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenekclass AllocaRegion : public SubRegion { 1087090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek friend class MemRegionManager; 1097090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenekprotected: 1107090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek unsigned Cnt; // Block counter. Used to distinguish different pieces of 1117090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek // memory allocated by alloca at the same call site. 1127090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek const Expr* Ex; 1137090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek 1147090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek AllocaRegion(const Expr* ex, unsigned cnt, const MemRegion* superRegion) 1157090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek : SubRegion(superRegion, AllocaRegionKind), Cnt(cnt), Ex(ex) {} 1167090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek 1177090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenekpublic: 1187090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek 1197090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek const Expr* getExpr() const { return Ex; } 1207090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek 1217090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 1227090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek 1237090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Expr* Ex, 1247090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek unsigned Cnt); 1257090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek 1267090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek void print(llvm::raw_ostream& os) const; 1277090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek 1287090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek static bool classof(const MemRegion* R) { 1297090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek return R->getKind() == AllocaRegionKind; 1307090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek } 1317090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek}; 1327090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek 133993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// SymbolicRegion - A special, "non-concrete" region. Unlike other region 134993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// clases, SymbolicRegion represents a region that serves as an alias for 135993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// either a real region, a NULL pointer, etc. It essentially is used to 136993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// map the concept of symbolic values into the domain of regions. Symbolic 137993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// regions do not need to be typed. 138993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass SymbolicRegion : public MemRegion { 139993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekprotected: 140993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek const SymbolID sym; 141993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 142993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekpublic: 143993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek SymbolicRegion(const SymbolID s) : MemRegion(SymbolicRegionKind), sym(s) {} 144993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 145993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek SymbolID getSymbol() const { 146993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek return sym; 147993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek } 148993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 149993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 150993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, SymbolID sym); 151993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 152993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek void print(llvm::raw_ostream& os) const; 153993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 154993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek static bool classof(const MemRegion* R) { 155993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek return R->getKind() == SymbolicRegionKind; 156993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek } 157993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek}; 158993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 159993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// TypedRegion - An abstract class representing regions that are typed. 160993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass TypedRegion : public SubRegion { 161993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekprotected: 162993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek TypedRegion(const MemRegion* sReg, Kind k) : SubRegion(sReg, k) {} 163993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 164993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekpublic: 165a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek virtual QualType getType(ASTContext&) const = 0; 166993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 167993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek static bool classof(const MemRegion* R) { 1689e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek unsigned k = R->getKind(); 1699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return k > BEG_TYPED_REGIONS && k < END_TYPED_REGIONS; 1709e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 1719e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 1729e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 173e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu/// StringRegion - Region associated with a StringLiteral. 174e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuclass StringRegion : public TypedRegion { 175e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu friend class MemRegionManager; 176e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 177e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const StringLiteral* Str; 178e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 179e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuprotected: 180e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 181e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu StringRegion(const StringLiteral* str, MemRegion* sreg) 182e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu : TypedRegion(sreg, StringRegionKind), Str(str) {} 183e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 184e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID& ID, 185e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const StringLiteral* Str, 186e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const MemRegion* superRegion); 187e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 188e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xupublic: 189e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu QualType getType(ASTContext& C) const { 190e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu return C.getCanonicalType(Str->getType()); 191e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 192e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 193e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const { 194e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu ProfileRegion(ID, Str, superRegion); 195e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 196e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 197e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static bool classof(const MemRegion* R) { 198e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu return R->getKind() == StringRegionKind; 199e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 200e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu}; 201e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 2029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// AnonTypedRegion - An "anonymous" region that simply types a chunk 2039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// of memory. 2049e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass AnonTypedRegion : public TypedRegion { 205178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xuprotected: 2069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek QualType T; 2079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 2099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek AnonTypedRegion(QualType t, MemRegion* sreg) 2119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : TypedRegion(sreg, AnonTypedRegionKind), T(t) {} 2129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, QualType T, 214178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu const MemRegion* superRegion); 215178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 2169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 217e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu QualType getType(ASTContext& C) const { return C.getCanonicalType(T); } 2189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 2219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 2239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == AnonTypedRegionKind; 2249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 2259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 2269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 227178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu/// AnonPointeeRegion - anonymous regions pointed-at by pointer function 228178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu/// parameters or pointer globals. In RegionStoreManager, we assume pointer 229178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu/// parameters or globals point at some anonymous region initially. Such 230178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu/// regions are not the regions associated with the pointers themselves, but 231178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu/// are identified with the VarDecl of the parameters or globals. 232178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xuclass AnonPointeeRegion : public AnonTypedRegion { 233178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu friend class MemRegionManager; 234178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu // VD - the pointer variable that points at this region. 235178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu const VarDecl* VD; 236178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 237178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu AnonPointeeRegion(const VarDecl* d, QualType t, MemRegion* sreg) 238178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu : AnonTypedRegion(t, sreg), VD(d) {} 239178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 240178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xupublic: 241178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID& ID, const VarDecl* PVD, 242178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu QualType T, const MemRegion* superRegion); 243178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu}; 244178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 245178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu/// AnonHeapRegion - anonymous region created by malloc(). 246178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xuclass AnonHeapRegion : public AnonTypedRegion { 247178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu}; 248329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 249329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// CompoundLiteralRegion - A memory region representing a compound literal. 250329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// Compound literals are essentially temporaries that are stack allocated 251329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// or in the global constant pool. 25277cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xuclass CompoundLiteralRegion : public TypedRegion { 253329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekprivate: 254329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek friend class MemRegionManager; 255329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek const CompoundLiteralExpr* CL; 256329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 257329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek CompoundLiteralRegion(const CompoundLiteralExpr* cl, const MemRegion* sReg) 25877cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu : TypedRegion(sReg, CompoundLiteralRegionKind), CL(cl) {} 259329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 260329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, 261329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek const CompoundLiteralExpr* CL, 262329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek const MemRegion* superRegion); 263329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekpublic: 26477cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu QualType getType(ASTContext& C) const { 26577cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu return C.getCanonicalType(CL->getType()); 26677cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu } 26777cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu 268329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 269329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 270329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek void print(llvm::raw_ostream& os) const; 271329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 27211a83dc7a9a5738cc0bc76180b508eae896eefa9Ted Kremenek const CompoundLiteralExpr* getLiteralExpr() const { return CL; } 27311a83dc7a9a5738cc0bc76180b508eae896eefa9Ted Kremenek 274329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek static bool classof(const MemRegion* R) { 275329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek return R->getKind() == CompoundLiteralRegionKind; 276329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek } 277329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek}; 278178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 2799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass DeclRegion : public TypedRegion { 2809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 2819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const Decl* D; 2829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 283993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek DeclRegion(const Decl* d, const MemRegion* sReg, Kind k) 2849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : TypedRegion(sReg, k), D(d) {} 2859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl* D, 2879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion, Kind k); 2889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 289bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xupublic: 290bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xu const Decl* getDecl() const { return D; } 2919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 292e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 293e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static bool classof(const MemRegion* R) { 294e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu unsigned k = R->getKind(); 295e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu return k > BEG_DECL_REGIONS && k < END_DECL_REGIONS; 296e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 2979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 2989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass VarRegion : public DeclRegion { 3009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 3019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 302993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek VarRegion(const VarDecl* vd, const MemRegion* sReg) 3039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(vd, sReg, VarRegionKind) {} 3049e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, VarDecl* VD, 3069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion) { 3079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, VD, superRegion, VarRegionKind); 3089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 3119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const VarDecl* getDecl() const { return cast<VarDecl>(D); } 312e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu QualType getType(ASTContext& C) const { 313e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu return C.getCanonicalType(getDecl()->getType()); 314e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu } 3159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek void print(llvm::raw_ostream& os) const; 3179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 3199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == VarRegionKind; 3209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 3229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass FieldRegion : public DeclRegion { 3249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 3259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 326993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek FieldRegion(const FieldDecl* fd, const MemRegion* sReg) 3279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(fd, sReg, FieldRegionKind) {} 3289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3294bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenekpublic: 3304bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek 3314bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek void print(llvm::raw_ostream& os) const; 3324bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek 3334bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek const FieldDecl* getDecl() const { return cast<FieldDecl>(D); } 334e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu QualType getType(ASTContext& C) const { 335e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu return C.getCanonicalType(getDecl()->getType()); 336e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu } 3374bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek 3389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, FieldDecl* FD, 3399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion) { 3409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, FD, superRegion, FieldRegionKind); 3419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3429e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 3449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == FieldRegionKind; 3459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3469e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 3479e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 348a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenekclass ObjCObjectRegion : public DeclRegion { 349a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 350a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek friend class MemRegionManager; 351a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 352a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek ObjCObjectRegion(const ObjCInterfaceDecl* ivd, const MemRegion* sReg) 353a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek : DeclRegion(ivd, sReg, ObjCObjectRegionKind) {} 354a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 355a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, ObjCInterfaceDecl* ivd, 356a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek const MemRegion* superRegion) { 357a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCObjectRegionKind); 358a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek } 359a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 360a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenekpublic: 361a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek const ObjCInterfaceDecl* getInterface() const { 362a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek return cast<ObjCInterfaceDecl>(D); 363a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek } 364a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 365a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek QualType getType(ASTContext& C) const { 366a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek ObjCInterfaceDecl* ID = const_cast<ObjCInterfaceDecl*>(getInterface()); 367a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek return C.getObjCInterfaceType(ID); 368a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek } 369a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 370a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek static bool classof(const MemRegion* R) { 371a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek return R->getKind() == ObjCObjectRegionKind; 372a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek } 373a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek}; 374a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 3759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass ObjCIvarRegion : public DeclRegion { 3769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 3789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 379993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek ObjCIvarRegion(const ObjCIvarDecl* ivd, const MemRegion* sReg) 3809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(ivd, sReg, ObjCIvarRegionKind) {} 3819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, ObjCIvarDecl* ivd, 3839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion) { 3849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCIvarRegionKind); 3859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 3889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const ObjCIvarDecl* getDecl() const { return cast<ObjCIvarDecl>(D); } 389a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek QualType getType(ASTContext&) const { return getDecl()->getType(); } 3909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 3929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == ObjCIvarRegionKind; 3939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 395511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 39627b57063d83b00474d7563fb5d608544e2364862Zhongxing Xuclass ElementRegion : public TypedRegion { 397511191ce8920160525611be2be754c32a0724c3eZhongxing Xu friend class MemRegionManager; 398511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 399511191ce8920160525611be2be754c32a0724c3eZhongxing Xu SVal Index; 400511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 401511191ce8920160525611be2be754c32a0724c3eZhongxing Xu ElementRegion(SVal Idx, const MemRegion* sReg) 40227b57063d83b00474d7563fb5d608544e2364862Zhongxing Xu : TypedRegion(sReg, ElementRegionKind), Index(Idx) {} 403511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 404511191ce8920160525611be2be754c32a0724c3eZhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID& ID, SVal Idx, 405511191ce8920160525611be2be754c32a0724c3eZhongxing Xu const MemRegion* superRegion); 406511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 407511191ce8920160525611be2be754c32a0724c3eZhongxing Xupublic: 408511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 4096e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu SVal getIndex() const { return Index; } 4106e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu 41127b57063d83b00474d7563fb5d608544e2364862Zhongxing Xu QualType getType(ASTContext&) const; 41227b57063d83b00474d7563fb5d608544e2364862Zhongxing Xu 413b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu void print(llvm::raw_ostream& os) const; 414b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 415511191ce8920160525611be2be754c32a0724c3eZhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const; 416511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 417511191ce8920160525611be2be754c32a0724c3eZhongxing Xu static bool classof(const MemRegion* R) { 418511191ce8920160525611be2be754c32a0724c3eZhongxing Xu return R->getKind() == ElementRegionKind; 419511191ce8920160525611be2be754c32a0724c3eZhongxing Xu } 420511191ce8920160525611be2be754c32a0724c3eZhongxing Xu}; 421511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 4229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 4239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager - Factory object for creating regions. 4249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 4259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager { 4279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek llvm::BumpPtrAllocator& A; 4289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek llvm::FoldingSet<MemRegion> Regions; 4299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* globals; 4319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* stack; 4329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* heap; 433178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu MemSpaceRegion* unknown; 4349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 4369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemRegionManager(llvm::BumpPtrAllocator& a) 4379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : A(a), globals(0), stack(0), heap(0) {} 4389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek ~MemRegionManager() {} 4409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getStackRegion - Retrieve the memory region associated with the 4429e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// current stack frame. 4439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* getStackRegion(); 4449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getGlobalsRegion - Retrieve the memory region associated with 4469e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// all global variables. 4479e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* getGlobalsRegion(); 4489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getHeapRegion - Retrieve the memory region associated with the 4509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// generic "heap". 4519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* getHeapRegion(); 452178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 453178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu /// getUnknownRegion - Retrieve the memory region associated with unknown 454178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu /// memory space. 455178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu MemSpaceRegion* getUnknownRegion(); 456c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu 457c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu bool isGlobalsRegion(const MemRegion* R) { 458ce63911d6bdd795f63365723d4cdaa6998529e1eZhongxing Xu assert(R); 459c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu return R == globals; 460c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu } 4619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4627090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek /// getAllocaRegion - Retrieve a region associated with a call to alloca(). 4637090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek AllocaRegion* getAllocaRegion(const Expr* Ex, unsigned Cnt); 4647090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek 465329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek /// getCompoundLiteralRegion - Retrieve the region associated with a 466329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek /// given CompoundLiteral. 467329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek CompoundLiteralRegion* 468329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek getCompoundLiteralRegion(const CompoundLiteralExpr* CL); 469329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 470993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek /// getSymbolicRegion - Retrieve or create a "symbolic" memory region. 471993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek SymbolicRegion* getSymbolicRegion(const SymbolID sym); 472e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 473e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu StringRegion* getStringRegion(const StringLiteral* Str); 474e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 4759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getVarRegion - Retrieve or create the memory region associated with 4769a1f03afc569abbdcc182379c99d1fe1ece67c9dTed Kremenek /// a specified VarDecl. 4779a1f03afc569abbdcc182379c99d1fe1ece67c9dTed Kremenek VarRegion* getVarRegion(const VarDecl* vd); 478329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 479511191ce8920160525611be2be754c32a0724c3eZhongxing Xu ElementRegion* getElementRegion(SVal Idx, const MemRegion* superRegion); 480511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 4819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getFieldRegion - Retrieve or create the memory region associated with 4829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a specified FieldDecl. 'superRegion' corresponds to the containing 4839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// memory region (which typically represents the memory representing 4849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a structure or class). 485993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek FieldRegion* getFieldRegion(const FieldDecl* fd, const MemRegion* superRegion); 4869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 487a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek /// getObjCObjectRegion - Retrieve or create the memory region associated with 488a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek /// the instance of a specified Objective-C class. 489a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek ObjCObjectRegion* getObjCObjectRegion(const ObjCInterfaceDecl* ID, 490a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek const MemRegion* superRegion); 491a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 4929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getObjCIvarRegion - Retrieve or create the memory region associated with 4939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a specified Objective-c instance variable. 'superRegion' corresponds 4949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// to the containing region (which typically represents the Objective-C 4959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// object). 4969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek ObjCIvarRegion* getObjCIvarRegion(const ObjCIvarDecl* ivd, 497993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek const MemRegion* superRegion); 498178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 499178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu AnonPointeeRegion* getAnonPointeeRegion(const VarDecl* d); 500178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 5019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek bool hasStackStorage(const MemRegion* R); 5029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 5039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate: 5049e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* LazyAllocate(MemSpaceRegion*& region); 5059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 5069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 5079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 5089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 5099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} // end clang namespace 5109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#endif 511