MemRegion.h revision 43b28d07019bc78447ecbbb721526de4ffd83f20
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" 26dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu#include "llvm/ADT/ImmutableList.h" 27dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu#include "llvm/ADT/ImmutableMap.h" 289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/Support/Allocator.h" 299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include <string> 309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremeneknamespace llvm { class raw_ostream; } 329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremeneknamespace clang { 349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager; 369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemRegion - The root abstract class for all memory regions. 399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegion : public llvm::FoldingSetNode { 409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 41993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek enum Kind { MemSpaceRegionKind, SymbolicRegionKind, 4282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek AllocaRegionKind, 439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek // Typed regions. 449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek BEG_TYPED_REGIONS, 4577cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu CompoundLiteralRegionKind, 46329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek StringRegionKind, ElementRegionKind, 47dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu AnonTypedRegionKind, 48dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu AnonPointeeRegionKind, 49329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek // Decl Regions. 50329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek BEG_DECL_REGIONS, 51329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek VarRegionKind, FieldRegionKind, 52329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek ObjCIvarRegionKind, ObjCObjectRegionKind, 53329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek END_DECL_REGIONS, 549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek END_TYPED_REGIONS }; 559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate: 569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const Kind kind; 579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemRegion(Kind k) : kind(k) {} 609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek virtual ~MemRegion(); 619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek // virtual MemExtent getExtent(MemRegionManager& mrm) const = 0; 649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek virtual void Profile(llvm::FoldingSetNodeID& ID) const = 0; 659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek std::string getString() const; 67b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 689e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek virtual void print(llvm::raw_ostream& os) const; 699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 709e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek Kind getKind() const { return kind; } 71b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 729e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion*) { return true; } 739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemSpaceRegion - A memory region that represents and "memory space"; 769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// for example, the set of global variables, the stack frame, etc. 779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemSpaceRegion : public MemRegion { 789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion() : MemRegion(MemSpaceRegionKind) {} 809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek //RegionExtent getExtent() const { return UndefinedExtent(); } 839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == MemSpaceRegionKind; 889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 91993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// SubRegion - A region that subsets another larger region. Most regions 92993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// are subclasses of SubRegion. 93993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass SubRegion : public MemRegion { 949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 95993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek const MemRegion* superRegion; 96993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek SubRegion(const MemRegion* sReg, Kind k) : MemRegion(k), superRegion(sReg) {} 979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* getSuperRegion() const { 1009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return superRegion; 1019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 1029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 104993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek return R->getKind() > SymbolicRegionKind; 105993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek } 106993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek}; 107993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 10882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek/// AllocaRegion - A region that represents an untyped blob of bytes created 10982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek/// by a call to 'alloca'. 11082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekclass AllocaRegion : public SubRegion { 11182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek friend class MemRegionManager; 11282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekprotected: 11382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek unsigned Cnt; // Block counter. Used to distinguish different pieces of 11482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek // memory allocated by alloca at the same call site. 11582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek const Expr* Ex; 11682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 11782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek AllocaRegion(const Expr* ex, unsigned cnt, const MemRegion* superRegion) 11882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek : SubRegion(superRegion, AllocaRegionKind), Cnt(cnt), Ex(ex) {} 11982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 12082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekpublic: 12182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 12282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek const Expr* getExpr() const { return Ex; } 12382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 12482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 12582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 12682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Expr* Ex, 12782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek unsigned Cnt); 12882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 12982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek void print(llvm::raw_ostream& os) const; 13082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 13182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek static bool classof(const MemRegion* R) { 13282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek return R->getKind() == AllocaRegionKind; 13382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek } 13482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek}; 13582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 136993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// SymbolicRegion - A special, "non-concrete" region. Unlike other region 137993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// clases, SymbolicRegion represents a region that serves as an alias for 138993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// either a real region, a NULL pointer, etc. It essentially is used to 139993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// map the concept of symbolic values into the domain of regions. Symbolic 140993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// regions do not need to be typed. 141993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass SymbolicRegion : public MemRegion { 142993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekprotected: 1432dabd4372c50019fa00aae223ce634e0e754a3f2Ted Kremenek const SymbolRef sym; 144993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 145993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekpublic: 1462dabd4372c50019fa00aae223ce634e0e754a3f2Ted Kremenek SymbolicRegion(const SymbolRef s) : MemRegion(SymbolicRegionKind), sym(s) {} 147993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 1482dabd4372c50019fa00aae223ce634e0e754a3f2Ted Kremenek SymbolRef getSymbol() const { 149993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek return sym; 150993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek } 151993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 152993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 1532dabd4372c50019fa00aae223ce634e0e754a3f2Ted Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, SymbolRef sym); 154993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 155993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek void print(llvm::raw_ostream& os) const; 156993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 157993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek static bool classof(const MemRegion* R) { 158993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek return R->getKind() == SymbolicRegionKind; 159993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek } 160993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek}; 161993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 162993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// TypedRegion - An abstract class representing regions that are typed. 163993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass TypedRegion : public SubRegion { 164993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekprotected: 165993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek TypedRegion(const MemRegion* sReg, Kind k) : SubRegion(sReg, k) {} 166993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 167993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekpublic: 168a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek virtual QualType getType(ASTContext&) const = 0; 169993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 170993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek static bool classof(const MemRegion* R) { 1719e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek unsigned k = R->getKind(); 1729e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return k > BEG_TYPED_REGIONS && k < END_TYPED_REGIONS; 1739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 1749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 1759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 176e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu/// StringRegion - Region associated with a StringLiteral. 177e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuclass StringRegion : public TypedRegion { 178e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu friend class MemRegionManager; 179e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 180e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const StringLiteral* Str; 181e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 182e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuprotected: 183e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 184e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu StringRegion(const StringLiteral* str, MemRegion* sreg) 185e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu : TypedRegion(sreg, StringRegionKind), Str(str) {} 186e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 187e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID& ID, 188e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const StringLiteral* Str, 189e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const MemRegion* superRegion); 190e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 191e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xupublic: 1926613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu 1936613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu const StringLiteral* getStringLiteral() const { return Str; } 1946613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu 195e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu QualType getType(ASTContext& C) const { 196e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu return C.getCanonicalType(Str->getType()); 197e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 198e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 199e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const { 200e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu ProfileRegion(ID, Str, superRegion); 201e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 202e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 203cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu void print(llvm::raw_ostream& os) const; 204cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu 205e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static bool classof(const MemRegion* R) { 206e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu return R->getKind() == StringRegionKind; 207e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 208e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu}; 209e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 210dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xuclass AnonTypedRegion : public TypedRegion { 211dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu friend class MemRegionManager; 212dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 213dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu QualType T; 214dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 215dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu AnonTypedRegion(QualType t, const MemRegion* sreg) 216dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu : TypedRegion(sreg, AnonTypedRegionKind), T(t) {} 217dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 218dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID& ID, QualType T, 219dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu const MemRegion* superRegion); 220dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 221dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xupublic: 222dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 223dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu QualType getType(ASTContext& C) const { 224dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu return T; 225dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu } 226dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 227dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const { 228dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu ProfileRegion(ID, T, superRegion); 229dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu } 230dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 231dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu static bool classof(const MemRegion* R) { 232dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu return R->getKind() == AnonTypedRegionKind; 233dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu } 234dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu}; 235dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 236817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu/// AnonPointeeRegion - anonymous regions pointed-to by pointer function 237817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu/// parameters or pointer globals. In RegionStoreManager, we assume pointer 238817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu/// parameters or globals point at some anonymous region. Such regions are not 239817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu/// the regions associated with the pointer variables themselves. They are 240c5458622a30ede903e8d1e800cbf9382bd45b69fZhongxing Xu/// identified by the symbols that are concretized. We create them lazily. 2419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 242817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xuclass AnonPointeeRegion : public TypedRegion { 2439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 2449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 245c5458622a30ede903e8d1e800cbf9382bd45b69fZhongxing Xu // Sym - the symbol that is concretized. 246c5458622a30ede903e8d1e800cbf9382bd45b69fZhongxing Xu SymbolRef Sym; 247c5458622a30ede903e8d1e800cbf9382bd45b69fZhongxing Xu 248c5458622a30ede903e8d1e800cbf9382bd45b69fZhongxing Xu // Ty - the type of the region. 249c5458622a30ede903e8d1e800cbf9382bd45b69fZhongxing Xu QualType T; 250c5458622a30ede903e8d1e800cbf9382bd45b69fZhongxing Xu 251c5458622a30ede903e8d1e800cbf9382bd45b69fZhongxing Xu AnonPointeeRegion(SymbolRef sym, QualType t, MemRegion* sreg) 252c5458622a30ede903e8d1e800cbf9382bd45b69fZhongxing Xu : TypedRegion(sreg, AnonPointeeRegionKind), Sym(sym), T(t) {} 253178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 2549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 255817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu QualType getType(ASTContext& C) const; 2569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 257c5458622a30ede903e8d1e800cbf9382bd45b69fZhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID& ID, SymbolRef Sym, 258817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu const MemRegion* superRegion); 259178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 260817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const { 261c5458622a30ede903e8d1e800cbf9382bd45b69fZhongxing Xu ProfileRegion(ID, Sym, superRegion); 262817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu } 263178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 264817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu static bool classof(const MemRegion* R) { 265817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu return R->getKind() == AnonPointeeRegionKind; 266817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu } 267178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu}; 268178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 269329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// CompoundLiteralRegion - A memory region representing a compound literal. 270329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// Compound literals are essentially temporaries that are stack allocated 271329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// or in the global constant pool. 27277cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xuclass CompoundLiteralRegion : public TypedRegion { 273329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekprivate: 274329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek friend class MemRegionManager; 275329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek const CompoundLiteralExpr* CL; 276329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 277329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek CompoundLiteralRegion(const CompoundLiteralExpr* cl, const MemRegion* sReg) 27877cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu : TypedRegion(sReg, CompoundLiteralRegionKind), CL(cl) {} 279329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 280329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, 281329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek const CompoundLiteralExpr* CL, 282329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek const MemRegion* superRegion); 283329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekpublic: 28477cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu QualType getType(ASTContext& C) const { 28577cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu return C.getCanonicalType(CL->getType()); 28677cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu } 28777cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu 288329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 289329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 290329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek void print(llvm::raw_ostream& os) const; 291329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 29211a83dc7a9a5738cc0bc76180b508eae896eefa9Ted Kremenek const CompoundLiteralExpr* getLiteralExpr() const { return CL; } 29311a83dc7a9a5738cc0bc76180b508eae896eefa9Ted Kremenek 294329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek static bool classof(const MemRegion* R) { 295329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek return R->getKind() == CompoundLiteralRegionKind; 296329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek } 297329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek}; 298178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 2999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass DeclRegion : public TypedRegion { 3009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 3019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const Decl* D; 3029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 303993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek DeclRegion(const Decl* d, const MemRegion* sReg, Kind k) 3049e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : TypedRegion(sReg, k), D(d) {} 3059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl* D, 3079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion, Kind k); 3089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 309bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xupublic: 310bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xu const Decl* getDecl() const { return D; } 3119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 312e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 313e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static bool classof(const MemRegion* R) { 314e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu unsigned k = R->getKind(); 315e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu return k > BEG_DECL_REGIONS && k < END_DECL_REGIONS; 316e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 3179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 3189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass VarRegion : public DeclRegion { 3209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 3219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 322993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek VarRegion(const VarDecl* vd, const MemRegion* sReg) 3239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(vd, sReg, VarRegionKind) {} 3249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, VarDecl* VD, 3269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion) { 3279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, VD, superRegion, VarRegionKind); 3289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 3319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const VarDecl* getDecl() const { return cast<VarDecl>(D); } 332e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu QualType getType(ASTContext& C) const { 333e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu return C.getCanonicalType(getDecl()->getType()); 334e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu } 3359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek void print(llvm::raw_ostream& os) const; 3379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 3399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == VarRegionKind; 3409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 3429e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass FieldRegion : public DeclRegion { 3449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 3459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 346993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek FieldRegion(const FieldDecl* fd, const MemRegion* sReg) 3479e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(fd, sReg, FieldRegionKind) {} 3489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3494bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenekpublic: 3504bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek 3514bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek void print(llvm::raw_ostream& os) const; 3524bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek 3534bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek const FieldDecl* getDecl() const { return cast<FieldDecl>(D); } 354e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu QualType getType(ASTContext& C) const { 355e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu return C.getCanonicalType(getDecl()->getType()); 356e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu } 3574bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek 3589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, FieldDecl* FD, 3599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion) { 3609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, FD, superRegion, FieldRegionKind); 3619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 3649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == FieldRegionKind; 3659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 3679e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 368a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenekclass ObjCObjectRegion : public DeclRegion { 369a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 370a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek friend class MemRegionManager; 371a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 372a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek ObjCObjectRegion(const ObjCInterfaceDecl* ivd, const MemRegion* sReg) 373a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek : DeclRegion(ivd, sReg, ObjCObjectRegionKind) {} 374a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 375a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, ObjCInterfaceDecl* ivd, 376a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek const MemRegion* superRegion) { 377a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCObjectRegionKind); 378a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek } 379a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 380a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenekpublic: 381a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek const ObjCInterfaceDecl* getInterface() const { 382a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek return cast<ObjCInterfaceDecl>(D); 383a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek } 384a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 385a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek QualType getType(ASTContext& C) const { 386a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek ObjCInterfaceDecl* ID = const_cast<ObjCInterfaceDecl*>(getInterface()); 387a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek return C.getObjCInterfaceType(ID); 388a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek } 389a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 390a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek static bool classof(const MemRegion* R) { 391a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek return R->getKind() == ObjCObjectRegionKind; 392a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek } 393a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek}; 394a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 3959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass ObjCIvarRegion : public DeclRegion { 3969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 3989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 399993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek ObjCIvarRegion(const ObjCIvarDecl* ivd, const MemRegion* sReg) 4009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(ivd, sReg, ObjCIvarRegionKind) {} 4019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, ObjCIvarDecl* ivd, 4039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion) { 4049e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCIvarRegionKind); 4059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 4069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 4089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const ObjCIvarDecl* getDecl() const { return cast<ObjCIvarDecl>(D); } 409a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek QualType getType(ASTContext&) const { return getDecl()->getType(); } 4109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 4129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == ObjCIvarRegionKind; 4139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 4149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 415511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 41627b57063d83b00474d7563fb5d608544e2364862Zhongxing Xuclass ElementRegion : public TypedRegion { 417511191ce8920160525611be2be754c32a0724c3eZhongxing Xu friend class MemRegionManager; 418511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 419511191ce8920160525611be2be754c32a0724c3eZhongxing Xu SVal Index; 420511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 421511191ce8920160525611be2be754c32a0724c3eZhongxing Xu ElementRegion(SVal Idx, const MemRegion* sReg) 4220395b5d4987fe5baa818015e9d294c128619e4ecZhongxing Xu : TypedRegion(sReg, ElementRegionKind), Index(Idx) { 42343b28d07019bc78447ecbbb721526de4ffd83f20Chris Lattner assert(isa<nonloc::ConcreteInt>(&Idx) && 42443b28d07019bc78447ecbbb721526de4ffd83f20Chris Lattner cast<nonloc::ConcreteInt>(&Idx)->getValue().isSigned() && 42543b28d07019bc78447ecbbb721526de4ffd83f20Chris Lattner "The index must be signed"); 4260395b5d4987fe5baa818015e9d294c128619e4ecZhongxing Xu } 427511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 428511191ce8920160525611be2be754c32a0724c3eZhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID& ID, SVal Idx, 429511191ce8920160525611be2be754c32a0724c3eZhongxing Xu const MemRegion* superRegion); 430511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 431511191ce8920160525611be2be754c32a0724c3eZhongxing Xupublic: 432511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 4336e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu SVal getIndex() const { return Index; } 4346e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu 43527b57063d83b00474d7563fb5d608544e2364862Zhongxing Xu QualType getType(ASTContext&) const; 43627b57063d83b00474d7563fb5d608544e2364862Zhongxing Xu 437b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu void print(llvm::raw_ostream& os) const; 438b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 439511191ce8920160525611be2be754c32a0724c3eZhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const; 440511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 441511191ce8920160525611be2be754c32a0724c3eZhongxing Xu static bool classof(const MemRegion* R) { 442511191ce8920160525611be2be754c32a0724c3eZhongxing Xu return R->getKind() == ElementRegionKind; 443511191ce8920160525611be2be754c32a0724c3eZhongxing Xu } 444511191ce8920160525611be2be754c32a0724c3eZhongxing Xu}; 445511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 4469e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 4479e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager - Factory object for creating regions. 4489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 4499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager { 4519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek llvm::BumpPtrAllocator& A; 4529e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek llvm::FoldingSet<MemRegion> Regions; 4539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* globals; 4559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* stack; 4569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* heap; 457178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu MemSpaceRegion* unknown; 458dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 4599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 4609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemRegionManager(llvm::BumpPtrAllocator& a) 4610bc27eab2079c01771cf025a77fd2205378182d8Zhongxing Xu : A(a), globals(0), stack(0), heap(0), unknown(0) {} 4629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek ~MemRegionManager() {} 4649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getStackRegion - Retrieve the memory region associated with the 4669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// current stack frame. 4679e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* getStackRegion(); 4689e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getGlobalsRegion - Retrieve the memory region associated with 4709e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// all global variables. 4719e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* getGlobalsRegion(); 4729e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getHeapRegion - Retrieve the memory region associated with the 4749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// generic "heap". 4759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* getHeapRegion(); 476178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 477178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu /// getUnknownRegion - Retrieve the memory region associated with unknown 478178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu /// memory space. 479178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu MemSpaceRegion* getUnknownRegion(); 480c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu 481c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu bool isGlobalsRegion(const MemRegion* R) { 482ce63911d6bdd795f63365723d4cdaa6998529e1eZhongxing Xu assert(R); 483c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu return R == globals; 484c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu } 4859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4867090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek /// getAllocaRegion - Retrieve a region associated with a call to alloca(). 4877090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek AllocaRegion* getAllocaRegion(const Expr* Ex, unsigned Cnt); 4887090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek 489329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek /// getCompoundLiteralRegion - Retrieve the region associated with a 490329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek /// given CompoundLiteral. 491329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek CompoundLiteralRegion* 492329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek getCompoundLiteralRegion(const CompoundLiteralExpr* CL); 493329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 494993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek /// getSymbolicRegion - Retrieve or create a "symbolic" memory region. 4952dabd4372c50019fa00aae223ce634e0e754a3f2Ted Kremenek SymbolicRegion* getSymbolicRegion(const SymbolRef sym); 496e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 497e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu StringRegion* getStringRegion(const StringLiteral* Str); 498e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 4999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getVarRegion - Retrieve or create the memory region associated with 5009a1f03afc569abbdcc182379c99d1fe1ece67c9dTed Kremenek /// a specified VarDecl. 5019a1f03afc569abbdcc182379c99d1fe1ece67c9dTed Kremenek VarRegion* getVarRegion(const VarDecl* vd); 502329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 503511191ce8920160525611be2be754c32a0724c3eZhongxing Xu ElementRegion* getElementRegion(SVal Idx, const MemRegion* superRegion); 504511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 5059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getFieldRegion - Retrieve or create the memory region associated with 5069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a specified FieldDecl. 'superRegion' corresponds to the containing 5079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// memory region (which typically represents the memory representing 5089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a structure or class). 509993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek FieldRegion* getFieldRegion(const FieldDecl* fd, const MemRegion* superRegion); 5109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 511a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek /// getObjCObjectRegion - Retrieve or create the memory region associated with 512a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek /// the instance of a specified Objective-C class. 513a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek ObjCObjectRegion* getObjCObjectRegion(const ObjCInterfaceDecl* ID, 514a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek const MemRegion* superRegion); 515a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 5169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getObjCIvarRegion - Retrieve or create the memory region associated with 5179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a specified Objective-c instance variable. 'superRegion' corresponds 5189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// to the containing region (which typically represents the Objective-C 5199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// object). 5209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek ObjCIvarRegion* getObjCIvarRegion(const ObjCIvarDecl* ivd, 521993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek const MemRegion* superRegion); 522178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 523dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu AnonTypedRegion* getAnonTypedRegion(QualType t, const MemRegion* superRegion); 524dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 525c5458622a30ede903e8d1e800cbf9382bd45b69fZhongxing Xu AnonPointeeRegion* getAnonPointeeRegion(SymbolRef Sym, QualType T); 526178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 5279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek bool hasStackStorage(const MemRegion* R); 528dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 5299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate: 5309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* LazyAllocate(MemSpaceRegion*& region); 5319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 5329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 5339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 5349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 5359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} // end clang namespace 5369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#endif 537