MemRegion.h revision cc128b32429494fe04ed36d7ba30c011cb4e173a
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, 50817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu 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 197cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu void print(llvm::raw_ostream& os) const; 198cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu 199e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static bool classof(const MemRegion* R) { 200e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu return R->getKind() == StringRegionKind; 201e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 202e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu}; 203e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 204817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu/// AnonPointeeRegion - anonymous regions pointed-to by pointer function 205817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu/// parameters or pointer globals. In RegionStoreManager, we assume pointer 206817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu/// parameters or globals point at some anonymous region. Such regions are not 207817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu/// the regions associated with the pointer variables themselves. They are 208817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu/// identified with the VarDecl of the pointer variable. We create them lazily. 2099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 210817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xuclass AnonPointeeRegion : public TypedRegion { 2119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 212817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu // VD - the pointer variable that points at this region. 213817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu const VarDecl* Pointer; 2149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 215817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu AnonPointeeRegion(const VarDecl* d, MemRegion* sreg) 216817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu : TypedRegion(sreg, AnonPointeeRegionKind), Pointer(d) {} 217178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 2189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 219817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu QualType getType(ASTContext& C) const; 2209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 221817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID& ID, const VarDecl* PVD, 222817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu const MemRegion* superRegion); 223178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 224817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const { 225817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu ProfileRegion(ID, Pointer, superRegion); 226817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu } 227178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 228817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu static bool classof(const MemRegion* R) { 229817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu return R->getKind() == AnonPointeeRegionKind; 230817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu } 231178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu}; 232178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 233329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// CompoundLiteralRegion - A memory region representing a compound literal. 234329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// Compound literals are essentially temporaries that are stack allocated 235329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// or in the global constant pool. 23677cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xuclass CompoundLiteralRegion : public TypedRegion { 237329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekprivate: 238329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek friend class MemRegionManager; 239329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek const CompoundLiteralExpr* CL; 240329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 241329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek CompoundLiteralRegion(const CompoundLiteralExpr* cl, const MemRegion* sReg) 24277cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu : TypedRegion(sReg, CompoundLiteralRegionKind), CL(cl) {} 243329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 244329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, 245329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek const CompoundLiteralExpr* CL, 246329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek const MemRegion* superRegion); 247329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekpublic: 24877cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu QualType getType(ASTContext& C) const { 24977cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu return C.getCanonicalType(CL->getType()); 25077cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu } 25177cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu 252329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 253329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 254329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek void print(llvm::raw_ostream& os) const; 255329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 25611a83dc7a9a5738cc0bc76180b508eae896eefa9Ted Kremenek const CompoundLiteralExpr* getLiteralExpr() const { return CL; } 25711a83dc7a9a5738cc0bc76180b508eae896eefa9Ted Kremenek 258329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek static bool classof(const MemRegion* R) { 259329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek return R->getKind() == CompoundLiteralRegionKind; 260329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek } 261329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek}; 262178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 2639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass DeclRegion : public TypedRegion { 2649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 2659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const Decl* D; 2669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 267993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek DeclRegion(const Decl* d, const MemRegion* sReg, Kind k) 2689e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : TypedRegion(sReg, k), D(d) {} 2699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2709e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl* D, 2719e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion, Kind k); 2729e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 273bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xupublic: 274bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xu const Decl* getDecl() const { return D; } 2759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 276e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 277e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static bool classof(const MemRegion* R) { 278e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu unsigned k = R->getKind(); 279e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu return k > BEG_DECL_REGIONS && k < END_DECL_REGIONS; 280e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 2819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 2829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass VarRegion : public DeclRegion { 2849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 2859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 286993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek VarRegion(const VarDecl* vd, const MemRegion* sReg) 2879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(vd, sReg, VarRegionKind) {} 2889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, VarDecl* VD, 2909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion) { 2919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, VD, superRegion, VarRegionKind); 2929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 2939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 2959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const VarDecl* getDecl() const { return cast<VarDecl>(D); } 296e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu QualType getType(ASTContext& C) const { 297e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu return C.getCanonicalType(getDecl()->getType()); 298e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu } 2999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek void print(llvm::raw_ostream& os) const; 3019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 3039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == VarRegionKind; 3049e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 3069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass FieldRegion : public DeclRegion { 3089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 3099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 310993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek FieldRegion(const FieldDecl* fd, const MemRegion* sReg) 3119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(fd, sReg, FieldRegionKind) {} 3129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3134bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenekpublic: 3144bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek 3154bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek void print(llvm::raw_ostream& os) const; 3164bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek 3174bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek const FieldDecl* getDecl() const { return cast<FieldDecl>(D); } 318e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu QualType getType(ASTContext& C) const { 319e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu return C.getCanonicalType(getDecl()->getType()); 320e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu } 3214bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek 3229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, FieldDecl* FD, 3239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion) { 3249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, FD, superRegion, FieldRegionKind); 3259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 3289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == FieldRegionKind; 3299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 3319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 332a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenekclass ObjCObjectRegion : public DeclRegion { 333a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 334a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek friend class MemRegionManager; 335a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 336a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek ObjCObjectRegion(const ObjCInterfaceDecl* ivd, const MemRegion* sReg) 337a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek : DeclRegion(ivd, sReg, ObjCObjectRegionKind) {} 338a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 339a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, ObjCInterfaceDecl* ivd, 340a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek const MemRegion* superRegion) { 341a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCObjectRegionKind); 342a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek } 343a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 344a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenekpublic: 345a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek const ObjCInterfaceDecl* getInterface() const { 346a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek return cast<ObjCInterfaceDecl>(D); 347a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek } 348a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 349a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek QualType getType(ASTContext& C) const { 350a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek ObjCInterfaceDecl* ID = const_cast<ObjCInterfaceDecl*>(getInterface()); 351a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek return C.getObjCInterfaceType(ID); 352a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek } 353a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 354a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek static bool classof(const MemRegion* R) { 355a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek return R->getKind() == ObjCObjectRegionKind; 356a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek } 357a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek}; 358a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 3599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass ObjCIvarRegion : public DeclRegion { 3609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 3629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 363993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek ObjCIvarRegion(const ObjCIvarDecl* ivd, const MemRegion* sReg) 3649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(ivd, sReg, ObjCIvarRegionKind) {} 3659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, ObjCIvarDecl* ivd, 3679e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion) { 3689e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCIvarRegionKind); 3699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3709e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3719e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 3729e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const ObjCIvarDecl* getDecl() const { return cast<ObjCIvarDecl>(D); } 373a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek QualType getType(ASTContext&) const { return getDecl()->getType(); } 3749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 3769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == ObjCIvarRegionKind; 3779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 379511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 38027b57063d83b00474d7563fb5d608544e2364862Zhongxing Xuclass ElementRegion : public TypedRegion { 381511191ce8920160525611be2be754c32a0724c3eZhongxing Xu friend class MemRegionManager; 382511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 383511191ce8920160525611be2be754c32a0724c3eZhongxing Xu SVal Index; 384511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 385511191ce8920160525611be2be754c32a0724c3eZhongxing Xu ElementRegion(SVal Idx, const MemRegion* sReg) 38627b57063d83b00474d7563fb5d608544e2364862Zhongxing Xu : TypedRegion(sReg, ElementRegionKind), Index(Idx) {} 387511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 388511191ce8920160525611be2be754c32a0724c3eZhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID& ID, SVal Idx, 389511191ce8920160525611be2be754c32a0724c3eZhongxing Xu const MemRegion* superRegion); 390511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 391511191ce8920160525611be2be754c32a0724c3eZhongxing Xupublic: 392511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 3936e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu SVal getIndex() const { return Index; } 3946e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu 39527b57063d83b00474d7563fb5d608544e2364862Zhongxing Xu QualType getType(ASTContext&) const; 39627b57063d83b00474d7563fb5d608544e2364862Zhongxing Xu 397b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu void print(llvm::raw_ostream& os) const; 398b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 399511191ce8920160525611be2be754c32a0724c3eZhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const; 400511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 401511191ce8920160525611be2be754c32a0724c3eZhongxing Xu static bool classof(const MemRegion* R) { 402511191ce8920160525611be2be754c32a0724c3eZhongxing Xu return R->getKind() == ElementRegionKind; 403511191ce8920160525611be2be754c32a0724c3eZhongxing Xu } 404511191ce8920160525611be2be754c32a0724c3eZhongxing Xu}; 405511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 406a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu/// RegionExtent - Represents the size, or extent, of an abstract memory chunk 407a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu/// (a region). Sizes are in bits. RegionExtent is essentially a variant with 408a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu/// three subclasses: UnknownExtent, FixedExtent, and SymbolicExtent. 409a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu 410a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xuclass RegionExtent { 411a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xupublic: 412a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu enum Kind { Unknown = 0, Fixed = 0, Sym = 1 }; 413a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu 414a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xuprotected: 415a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu const uintptr_t Raw; 416a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu RegionExtent(uintptr_t raw, Kind k) : Raw(raw | k) {} 417a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu uintptr_t getData() const { return Raw & ~0x1; } 418a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu 419a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xupublic: 420a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu // Folding-set profiling. 421a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const { 422a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu ID.AddPointer((void*) Raw); 423a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu } 424a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu // Comparing extents. 425a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu bool operator==(const RegionExtent& R) const { 426a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu return Raw == R.Raw; 427a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu } 428a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu bool operator!=(const RegionExtent& R) const { 429a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu return Raw != R.Raw; 430a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu } 431a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu // Implement isa<T> support. 432a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu Kind getKind() const { return Kind(Raw & 0x1); } 433a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu uintptr_t getRaw() const { return Raw; } 434a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu 435a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu static inline bool classof(const RegionExtent*) { 436a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu return true; 437a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu } 438a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu}; 439a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu 440a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu/// UnknownExtent - Represents a region extent with no available information 441a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu/// about the size of the region. 442a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xuclass UnknownExtent : public RegionExtent { 443a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xupublic: 444a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu UnknownExtent() : RegionExtent(0,Unknown) {} 445a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu 446a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu // Implement isa<T> support. 447a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu static inline bool classof(const RegionExtent* E) { 448a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu return E->getRaw() == 0; 449a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu } 450a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu}; 451a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu 452a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu/// FixedExtent - Represents a region extent with a known fixed size. 453a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu/// Typically FixedExtents are used to represent the size of variables, but 454a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu/// they can also be used to represent the size of a constant-sized array. 455a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xuclass FixedExtent : public RegionExtent { 456a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xupublic: 457a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu FixedExtent(const llvm::APSInt& X) : RegionExtent((uintptr_t) &X, Fixed) {} 458a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu 459a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu const llvm::APSInt& getInt() const { 460a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu return *((llvm::APSInt*) getData()); 461a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu } 462a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu 463a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu // Implement isa<T> support. 464a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu static inline bool classof(const RegionExtent* E) { 465a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu return E->getKind() == Fixed && E->getRaw() != 0; 466a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu } 467a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu}; 468a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu 469a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu/// SymbolicExtent - Represents the extent of a region where the extent 470a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu/// itself is a symbolic value. These extents can be used to represent 471a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu/// the sizes of dynamically allocated chunks of memory with variable size. 472a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xuclass SymbolicExtent : public RegionExtent { 473a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xupublic: 474a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu SymbolicExtent(SymbolID S) : RegionExtent(S.getNumber() << 1, Sym) {} 475a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu 476a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu SymbolID getSymbol() const { return SymbolID(getData() >> 1); } 477a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu 478a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu // Implement isa<T> support. 479a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu static inline bool classof(const RegionExtent* E) { 480a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu return E->getKind() == Sym; 481a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu } 482a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu}; 483a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu 484a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu 4859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 4869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager - Factory object for creating regions. 4879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 4889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager { 4909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek llvm::BumpPtrAllocator& A; 4919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek llvm::FoldingSet<MemRegion> Regions; 4929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* globals; 4949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* stack; 4959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* heap; 496178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu MemSpaceRegion* unknown; 4979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 4999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemRegionManager(llvm::BumpPtrAllocator& a) 5009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : A(a), globals(0), stack(0), heap(0) {} 5019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 5029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek ~MemRegionManager() {} 5039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 5049e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getStackRegion - Retrieve the memory region associated with the 5059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// current stack frame. 5069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* getStackRegion(); 5079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 5089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getGlobalsRegion - Retrieve the memory region associated with 5099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// all global variables. 5109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* getGlobalsRegion(); 5119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 5129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getHeapRegion - Retrieve the memory region associated with the 5139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// generic "heap". 5149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* getHeapRegion(); 515178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 516178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu /// getUnknownRegion - Retrieve the memory region associated with unknown 517178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu /// memory space. 518178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu MemSpaceRegion* getUnknownRegion(); 519c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu 520c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu bool isGlobalsRegion(const MemRegion* R) { 521ce63911d6bdd795f63365723d4cdaa6998529e1eZhongxing Xu assert(R); 522c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu return R == globals; 523c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu } 5249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 5257090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek /// getAllocaRegion - Retrieve a region associated with a call to alloca(). 5267090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek AllocaRegion* getAllocaRegion(const Expr* Ex, unsigned Cnt); 5277090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek 528329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek /// getCompoundLiteralRegion - Retrieve the region associated with a 529329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek /// given CompoundLiteral. 530329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek CompoundLiteralRegion* 531329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek getCompoundLiteralRegion(const CompoundLiteralExpr* CL); 532329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 533993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek /// getSymbolicRegion - Retrieve or create a "symbolic" memory region. 534993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek SymbolicRegion* getSymbolicRegion(const SymbolID sym); 535e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 536e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu StringRegion* getStringRegion(const StringLiteral* Str); 537e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 5389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getVarRegion - Retrieve or create the memory region associated with 5399a1f03afc569abbdcc182379c99d1fe1ece67c9dTed Kremenek /// a specified VarDecl. 5409a1f03afc569abbdcc182379c99d1fe1ece67c9dTed Kremenek VarRegion* getVarRegion(const VarDecl* vd); 541329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 542511191ce8920160525611be2be754c32a0724c3eZhongxing Xu ElementRegion* getElementRegion(SVal Idx, const MemRegion* superRegion); 543511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 5449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getFieldRegion - Retrieve or create the memory region associated with 5459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a specified FieldDecl. 'superRegion' corresponds to the containing 5469e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// memory region (which typically represents the memory representing 5479e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a structure or class). 548993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek FieldRegion* getFieldRegion(const FieldDecl* fd, const MemRegion* superRegion); 5499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 550a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek /// getObjCObjectRegion - Retrieve or create the memory region associated with 551a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek /// the instance of a specified Objective-C class. 552a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek ObjCObjectRegion* getObjCObjectRegion(const ObjCInterfaceDecl* ID, 553a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek const MemRegion* superRegion); 554a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 5559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getObjCIvarRegion - Retrieve or create the memory region associated with 5569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a specified Objective-c instance variable. 'superRegion' corresponds 5579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// to the containing region (which typically represents the Objective-C 5589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// object). 5599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek ObjCIvarRegion* getObjCIvarRegion(const ObjCIvarDecl* ivd, 560993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek const MemRegion* superRegion); 561178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 562178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu AnonPointeeRegion* getAnonPointeeRegion(const VarDecl* d); 563178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 5649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek bool hasStackStorage(const MemRegion* R); 5659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 5669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate: 5679e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* LazyAllocate(MemSpaceRegion*& region); 5689e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 5699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 5709e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 5719e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 5729e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} // end clang namespace 5739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#endif 574