MemRegion.h revision 6eddeb153415049c7b62de4b45385a759a6906c6
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: 1686eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek virtual QualType getRValueType(ASTContext &C) const = 0; 1696eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek 1706eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek virtual QualType getLValueType(ASTContext& C) const { 1716eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek // FIXME: We can possibly optimize this later to cache this value. 1726eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek return C.getPointerType(getRValueType(C)); 1736eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek } 1746eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek 175993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek static bool classof(const MemRegion* R) { 1769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek unsigned k = R->getKind(); 1779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return k > BEG_TYPED_REGIONS && k < END_TYPED_REGIONS; 1789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 1799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 1809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 181e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu/// StringRegion - Region associated with a StringLiteral. 182e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuclass StringRegion : public TypedRegion { 183e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu friend class MemRegionManager; 184e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const StringLiteral* Str; 185e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuprotected: 186e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 187e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu StringRegion(const StringLiteral* str, MemRegion* sreg) 188e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu : TypedRegion(sreg, StringRegionKind), Str(str) {} 189e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 190e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID& ID, 191e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const StringLiteral* Str, 192e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const MemRegion* superRegion); 193e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 194e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xupublic: 1956613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu 1966613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu const StringLiteral* getStringLiteral() const { return Str; } 1976eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek 1986eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek QualType getRValueType(ASTContext& C) const; 199e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 200e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const { 201e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu ProfileRegion(ID, Str, superRegion); 202e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 203e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 204cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu void print(llvm::raw_ostream& os) const; 205cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu 206e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static bool classof(const MemRegion* R) { 207e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu return R->getKind() == StringRegionKind; 208e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 209e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu}; 210e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 211dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xuclass AnonTypedRegion : public TypedRegion { 212dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu friend class MemRegionManager; 213dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 214dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu QualType T; 215dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 216dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu AnonTypedRegion(QualType t, const MemRegion* sreg) 217dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu : TypedRegion(sreg, AnonTypedRegionKind), T(t) {} 218dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 219dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID& ID, QualType T, 220dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu const MemRegion* superRegion); 221dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 222dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xupublic: 223dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 2246eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek QualType getRValueType(ASTContext&) const { 225dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu return T; 226dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu } 227dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 228dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const { 229dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu ProfileRegion(ID, T, superRegion); 230dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu } 231dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 232dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu static bool classof(const MemRegion* R) { 233dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu return R->getKind() == AnonTypedRegionKind; 234dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu } 235dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu}; 2366eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek 237178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 238329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// CompoundLiteralRegion - A memory region representing a compound literal. 239329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// Compound literals are essentially temporaries that are stack allocated 240329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// or in the global constant pool. 24177cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xuclass CompoundLiteralRegion : public TypedRegion { 242329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekprivate: 243329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek friend class MemRegionManager; 244329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek const CompoundLiteralExpr* CL; 245329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 246329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek CompoundLiteralRegion(const CompoundLiteralExpr* cl, const MemRegion* sReg) 24777cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu : TypedRegion(sReg, CompoundLiteralRegionKind), CL(cl) {} 248329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 249329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, 250329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek const CompoundLiteralExpr* CL, 251329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek const MemRegion* superRegion); 252329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekpublic: 2536eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek QualType getRValueType(ASTContext& C) const { 25477cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu return C.getCanonicalType(CL->getType()); 25577cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu } 2566eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek 257329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 258329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 259329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek void print(llvm::raw_ostream& os) const; 260329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 26111a83dc7a9a5738cc0bc76180b508eae896eefa9Ted Kremenek const CompoundLiteralExpr* getLiteralExpr() const { return CL; } 26211a83dc7a9a5738cc0bc76180b508eae896eefa9Ted Kremenek 263329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek static bool classof(const MemRegion* R) { 264329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek return R->getKind() == CompoundLiteralRegionKind; 265329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek } 266329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek}; 267178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 2689e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass DeclRegion : public TypedRegion { 2699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 2709e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const Decl* D; 2719e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 272993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek DeclRegion(const Decl* d, const MemRegion* sReg, Kind k) 2739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : TypedRegion(sReg, k), D(d) {} 2749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl* D, 2769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion, Kind k); 2779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 278bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xupublic: 279bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xu const Decl* getDecl() const { return D; } 2809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 2816eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek 2826eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek QualType getRValueType(ASTContext& C) const = 0; 2836eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek 284e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static bool classof(const MemRegion* R) { 285e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu unsigned k = R->getKind(); 286e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu return k > BEG_DECL_REGIONS && k < END_DECL_REGIONS; 287e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 2889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 2899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass VarRegion : public DeclRegion { 2919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 2929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 293993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek VarRegion(const VarDecl* vd, const MemRegion* sReg) 2949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(vd, sReg, VarRegionKind) {} 2959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, VarDecl* VD, 2979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion) { 2989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, VD, superRegion, VarRegionKind); 2999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 3026eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek const VarDecl* getDecl() const { return cast<VarDecl>(D); } 3039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3046eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek QualType getRValueType(ASTContext& C) const { 3056eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek // FIXME: We can cache this if needed. 3066eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek return C.getCanonicalType(getDecl()->getType()); 3076eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek } 3086eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek 3099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek void print(llvm::raw_ostream& os) const; 3109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 3129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == VarRegionKind; 3139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 3159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass FieldRegion : public DeclRegion { 3179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 3189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 319993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek FieldRegion(const FieldDecl* fd, const MemRegion* sReg) 3209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(fd, sReg, FieldRegionKind) {} 3219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3224bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenekpublic: 3234bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek 3244bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek void print(llvm::raw_ostream& os) const; 3254bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek 3264bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek const FieldDecl* getDecl() const { return cast<FieldDecl>(D); } 3276eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek 3286eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek QualType getRValueType(ASTContext& C) const { 3296eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek // FIXME: We can cache this if needed. 330e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu return C.getCanonicalType(getDecl()->getType()); 3316eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek } 3324bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek 3339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, FieldDecl* FD, 3349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion) { 3359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, FD, superRegion, FieldRegionKind); 3369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 3399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == FieldRegionKind; 3409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 3429e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 343a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenekclass ObjCObjectRegion : public DeclRegion { 344a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 345a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek friend class MemRegionManager; 346a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 347a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek ObjCObjectRegion(const ObjCInterfaceDecl* ivd, const MemRegion* sReg) 348a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek : DeclRegion(ivd, sReg, ObjCObjectRegionKind) {} 349a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 350a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, ObjCInterfaceDecl* ivd, 351a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek const MemRegion* superRegion) { 352a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCObjectRegionKind); 353a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek } 354a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 355a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenekpublic: 356a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek const ObjCInterfaceDecl* getInterface() const { 357a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek return cast<ObjCInterfaceDecl>(D); 358a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek } 359a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 3606eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek QualType getRValueType(ASTContext& C) const { 361a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek ObjCInterfaceDecl* ID = const_cast<ObjCInterfaceDecl*>(getInterface()); 362a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek return C.getObjCInterfaceType(ID); 363a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek } 364a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 365a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek static bool classof(const MemRegion* R) { 366a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek return R->getKind() == ObjCObjectRegionKind; 367a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek } 368a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek}; 369a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 3709e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass ObjCIvarRegion : public DeclRegion { 3719e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3729e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 3739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 374993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek ObjCIvarRegion(const ObjCIvarDecl* ivd, const MemRegion* sReg) 3759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(ivd, sReg, ObjCIvarRegionKind) {} 3769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, ObjCIvarDecl* ivd, 3789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion) { 3799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCIvarRegionKind); 3809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 3839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const ObjCIvarDecl* getDecl() const { return cast<ObjCIvarDecl>(D); } 3846eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek QualType getRValueType(ASTContext&) const { return getDecl()->getType(); } 3859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 3879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == ObjCIvarRegionKind; 3889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 390511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 39127b57063d83b00474d7563fb5d608544e2364862Zhongxing Xuclass ElementRegion : public TypedRegion { 392511191ce8920160525611be2be754c32a0724c3eZhongxing Xu friend class MemRegionManager; 393511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 394511191ce8920160525611be2be754c32a0724c3eZhongxing Xu SVal Index; 395511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 396511191ce8920160525611be2be754c32a0724c3eZhongxing Xu ElementRegion(SVal Idx, const MemRegion* sReg) 3970395b5d4987fe5baa818015e9d294c128619e4ecZhongxing Xu : TypedRegion(sReg, ElementRegionKind), Index(Idx) { 3983d8173c1c68f451c7492f92023d829c626845925Chris Lattner assert((!isa<nonloc::ConcreteInt>(&Idx) || 3993d8173c1c68f451c7492f92023d829c626845925Chris Lattner cast<nonloc::ConcreteInt>(&Idx)->getValue().isSigned()) && 40043b28d07019bc78447ecbbb721526de4ffd83f20Chris Lattner "The index must be signed"); 4010395b5d4987fe5baa818015e9d294c128619e4ecZhongxing Xu } 402abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek 403511191ce8920160525611be2be754c32a0724c3eZhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID& ID, SVal Idx, 404511191ce8920160525611be2be754c32a0724c3eZhongxing Xu const MemRegion* superRegion); 405511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 406511191ce8920160525611be2be754c32a0724c3eZhongxing Xupublic: 407511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 4086e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu SVal getIndex() const { return Index; } 4096e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu 4106eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek QualType getRValueType(ASTContext&) const; 41127b57063d83b00474d7563fb5d608544e2364862Zhongxing Xu 412abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek /// getArrayRegion - Return the region of the enclosing array. This is 413abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek /// the same as getSuperRegion() except that this returns a TypedRegion* 414abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek /// instead of a MemRegion*. 415abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek const TypedRegion* getArrayRegion() const { 416abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek return cast<TypedRegion>(getSuperRegion()); 417abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek } 418abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek 419b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu void print(llvm::raw_ostream& os) const; 420b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 421511191ce8920160525611be2be754c32a0724c3eZhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const; 422511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 423511191ce8920160525611be2be754c32a0724c3eZhongxing Xu static bool classof(const MemRegion* R) { 424511191ce8920160525611be2be754c32a0724c3eZhongxing Xu return R->getKind() == ElementRegionKind; 425511191ce8920160525611be2be754c32a0724c3eZhongxing Xu } 426511191ce8920160525611be2be754c32a0724c3eZhongxing Xu}; 427511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 4289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 4299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager - Factory object for creating regions. 4309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 4319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager { 4339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek llvm::BumpPtrAllocator& A; 4349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek llvm::FoldingSet<MemRegion> Regions; 4359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* globals; 4379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* stack; 4389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* heap; 439178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu MemSpaceRegion* unknown; 440dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 4419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 4429e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemRegionManager(llvm::BumpPtrAllocator& a) 4430bc27eab2079c01771cf025a77fd2205378182d8Zhongxing Xu : A(a), globals(0), stack(0), heap(0), unknown(0) {} 4449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek ~MemRegionManager() {} 4469e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4479e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getStackRegion - Retrieve the memory region associated with the 4489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// current stack frame. 4499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* getStackRegion(); 4509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getGlobalsRegion - Retrieve the memory region associated with 4529e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// all global variables. 4539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* getGlobalsRegion(); 4549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getHeapRegion - Retrieve the memory region associated with the 4569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// generic "heap". 4579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* getHeapRegion(); 458178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 459178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu /// getUnknownRegion - Retrieve the memory region associated with unknown 460178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu /// memory space. 461178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu MemSpaceRegion* getUnknownRegion(); 462c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu 463c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu bool isGlobalsRegion(const MemRegion* R) { 464ce63911d6bdd795f63365723d4cdaa6998529e1eZhongxing Xu assert(R); 465c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu return R == globals; 466c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu } 4679e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4687090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek /// getAllocaRegion - Retrieve a region associated with a call to alloca(). 4697090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek AllocaRegion* getAllocaRegion(const Expr* Ex, unsigned Cnt); 4707090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek 471329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek /// getCompoundLiteralRegion - Retrieve the region associated with a 472329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek /// given CompoundLiteral. 473329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek CompoundLiteralRegion* 474329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek getCompoundLiteralRegion(const CompoundLiteralExpr* CL); 475329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 476993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek /// getSymbolicRegion - Retrieve or create a "symbolic" memory region. 4772dabd4372c50019fa00aae223ce634e0e754a3f2Ted Kremenek SymbolicRegion* getSymbolicRegion(const SymbolRef sym); 478e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 479e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu StringRegion* getStringRegion(const StringLiteral* Str); 480e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 4819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getVarRegion - Retrieve or create the memory region associated with 4829a1f03afc569abbdcc182379c99d1fe1ece67c9dTed Kremenek /// a specified VarDecl. 4839a1f03afc569abbdcc182379c99d1fe1ece67c9dTed Kremenek VarRegion* getVarRegion(const VarDecl* vd); 484329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 485abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek ElementRegion* getElementRegion(SVal Idx, const TypedRegion* superRegion); 486511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 4879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getFieldRegion - Retrieve or create the memory region associated with 4889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a specified FieldDecl. 'superRegion' corresponds to the containing 4899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// memory region (which typically represents the memory representing 4909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a structure or class). 491abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek FieldRegion* getFieldRegion(const FieldDecl* fd, 492abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek const MemRegion* superRegion); 4939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 494a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek /// getObjCObjectRegion - Retrieve or create the memory region associated with 495a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek /// the instance of a specified Objective-C class. 496a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek ObjCObjectRegion* getObjCObjectRegion(const ObjCInterfaceDecl* ID, 497a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek const MemRegion* superRegion); 498a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 4999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getObjCIvarRegion - Retrieve or create the memory region associated with 5009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a specified Objective-c instance variable. 'superRegion' corresponds 5019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// to the containing region (which typically represents the Objective-C 5029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// object). 5039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek ObjCIvarRegion* getObjCIvarRegion(const ObjCIvarDecl* ivd, 504993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek const MemRegion* superRegion); 505178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 506dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu AnonTypedRegion* getAnonTypedRegion(QualType t, const MemRegion* superRegion); 507dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 5089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek bool hasStackStorage(const MemRegion* R); 509dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 5109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate: 5119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* LazyAllocate(MemSpaceRegion*& region); 5129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 5139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 5149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 5159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 5169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} // end clang namespace 5179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#endif 518