MemRegion.h revision 7e5d6ed47dcedce35043de59ee00464b681bc786
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 } 1024193eca10ce0cc8b2dae887e935a43b26f492b5bZhongxing Xu 1037e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu bool isSubRegionOf(const MemRegion* R) const; 1047e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu 1059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 106993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek return R->getKind() > SymbolicRegionKind; 107993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek } 108993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek}; 109993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 11082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek/// AllocaRegion - A region that represents an untyped blob of bytes created 11182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek/// by a call to 'alloca'. 11282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekclass AllocaRegion : public SubRegion { 11382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek friend class MemRegionManager; 11482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekprotected: 11582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek unsigned Cnt; // Block counter. Used to distinguish different pieces of 11682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek // memory allocated by alloca at the same call site. 11782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek const Expr* Ex; 11882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 11982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek AllocaRegion(const Expr* ex, unsigned cnt, const MemRegion* superRegion) 12082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek : SubRegion(superRegion, AllocaRegionKind), Cnt(cnt), Ex(ex) {} 12182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 12282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekpublic: 12382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 12482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek const Expr* getExpr() const { return Ex; } 12582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 12682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 12782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 12882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Expr* Ex, 12982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek unsigned Cnt); 13082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 13182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek void print(llvm::raw_ostream& os) const; 13282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 13382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek static bool classof(const MemRegion* R) { 13482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek return R->getKind() == AllocaRegionKind; 13582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek } 13682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek}; 13782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 138993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// SymbolicRegion - A special, "non-concrete" region. Unlike other region 139993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// clases, SymbolicRegion represents a region that serves as an alias for 140993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// either a real region, a NULL pointer, etc. It essentially is used to 141993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// map the concept of symbolic values into the domain of regions. Symbolic 142993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// regions do not need to be typed. 143993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass SymbolicRegion : public MemRegion { 144993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekprotected: 1452dabd4372c50019fa00aae223ce634e0e754a3f2Ted Kremenek const SymbolRef sym; 146993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 147993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekpublic: 1482dabd4372c50019fa00aae223ce634e0e754a3f2Ted Kremenek SymbolicRegion(const SymbolRef s) : MemRegion(SymbolicRegionKind), sym(s) {} 149993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 1502dabd4372c50019fa00aae223ce634e0e754a3f2Ted Kremenek SymbolRef getSymbol() const { 151993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek return sym; 152993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek } 153993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 154993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 1552dabd4372c50019fa00aae223ce634e0e754a3f2Ted Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, SymbolRef sym); 156993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 157993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek void print(llvm::raw_ostream& os) const; 158993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 159993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek static bool classof(const MemRegion* R) { 160993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek return R->getKind() == SymbolicRegionKind; 161993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek } 162993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek}; 163993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 164993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// TypedRegion - An abstract class representing regions that are typed. 165993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass TypedRegion : public SubRegion { 166993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekprotected: 167993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek TypedRegion(const MemRegion* sReg, Kind k) : SubRegion(sReg, k) {} 168993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 169993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekpublic: 1706eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek virtual QualType getRValueType(ASTContext &C) const = 0; 1716eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek 1726eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek virtual QualType getLValueType(ASTContext& C) const { 1736eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek // FIXME: We can possibly optimize this later to cache this value. 1746eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek return C.getPointerType(getRValueType(C)); 1756eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek } 1766eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek 177993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek static bool classof(const MemRegion* R) { 1789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek unsigned k = R->getKind(); 1799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return k > BEG_TYPED_REGIONS && k < END_TYPED_REGIONS; 1809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 1819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 1829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 183e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu/// StringRegion - Region associated with a StringLiteral. 184e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuclass StringRegion : public TypedRegion { 185e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu friend class MemRegionManager; 186e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const StringLiteral* Str; 187e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuprotected: 188e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 189e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu StringRegion(const StringLiteral* str, MemRegion* sreg) 190e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu : TypedRegion(sreg, StringRegionKind), Str(str) {} 191e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 192e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID& ID, 193e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const StringLiteral* Str, 194e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const MemRegion* superRegion); 195e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 196e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xupublic: 1976613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu 1986613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu const StringLiteral* getStringLiteral() const { return Str; } 1996eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek 2006eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek QualType getRValueType(ASTContext& C) const; 201e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 202e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const { 203e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu ProfileRegion(ID, Str, superRegion); 204e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 205e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 206cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu void print(llvm::raw_ostream& os) const; 207cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu 208e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static bool classof(const MemRegion* R) { 209e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu return R->getKind() == StringRegionKind; 210e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 211e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu}; 212e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 213dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xuclass AnonTypedRegion : public TypedRegion { 214dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu friend class MemRegionManager; 215dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 216dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu QualType T; 217dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 218dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu AnonTypedRegion(QualType t, const MemRegion* sreg) 219dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu : TypedRegion(sreg, AnonTypedRegionKind), T(t) {} 220dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 221dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID& ID, QualType T, 222dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu const MemRegion* superRegion); 223dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 224dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xupublic: 225dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 226500d2ee83d407106d80920fb4325fa2e06fa61a5Ted Kremenek void print(llvm::raw_ostream& os) const; 227500d2ee83d407106d80920fb4325fa2e06fa61a5Ted Kremenek 2286eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek QualType getRValueType(ASTContext&) const { 229dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu return T; 230dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu } 231dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 232dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const { 233dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu ProfileRegion(ID, T, superRegion); 234dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu } 235dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 236dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu static bool classof(const MemRegion* R) { 237dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu return R->getKind() == AnonTypedRegionKind; 238dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu } 239dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu}; 2406eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek 241178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 242329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// CompoundLiteralRegion - A memory region representing a compound literal. 243329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// Compound literals are essentially temporaries that are stack allocated 244329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// or in the global constant pool. 24577cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xuclass CompoundLiteralRegion : public TypedRegion { 246329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekprivate: 247329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek friend class MemRegionManager; 248329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek const CompoundLiteralExpr* CL; 249329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 250329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek CompoundLiteralRegion(const CompoundLiteralExpr* cl, const MemRegion* sReg) 25177cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu : TypedRegion(sReg, CompoundLiteralRegionKind), CL(cl) {} 252329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 253329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, 254329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek const CompoundLiteralExpr* CL, 255329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek const MemRegion* superRegion); 256329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekpublic: 2576eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek QualType getRValueType(ASTContext& C) const { 25877cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu return C.getCanonicalType(CL->getType()); 25977cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu } 2606eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek 261329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 262329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 263329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek void print(llvm::raw_ostream& os) const; 264329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 26511a83dc7a9a5738cc0bc76180b508eae896eefa9Ted Kremenek const CompoundLiteralExpr* getLiteralExpr() const { return CL; } 26611a83dc7a9a5738cc0bc76180b508eae896eefa9Ted Kremenek 267329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek static bool classof(const MemRegion* R) { 268329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek return R->getKind() == CompoundLiteralRegionKind; 269329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek } 270329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek}; 271178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 2729e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass DeclRegion : public TypedRegion { 2739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 2749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const Decl* D; 2759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 276993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek DeclRegion(const Decl* d, const MemRegion* sReg, Kind k) 2779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : TypedRegion(sReg, k), D(d) {} 2789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl* D, 2809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion, Kind k); 2819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 282bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xupublic: 283bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xu const Decl* getDecl() const { return D; } 2849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 2856eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek 2866eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek QualType getRValueType(ASTContext& C) const = 0; 2876eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek 288e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static bool classof(const MemRegion* R) { 289e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu unsigned k = R->getKind(); 290e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu return k > BEG_DECL_REGIONS && k < END_DECL_REGIONS; 291e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 2929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 2939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass VarRegion : public DeclRegion { 2959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 2969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 297993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek VarRegion(const VarDecl* vd, const MemRegion* sReg) 2989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(vd, sReg, VarRegionKind) {} 2999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, VarDecl* VD, 3019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion) { 3029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, VD, superRegion, VarRegionKind); 3039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3049e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 3066eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek const VarDecl* getDecl() const { return cast<VarDecl>(D); } 3079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3086eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek QualType getRValueType(ASTContext& C) const { 3096eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek // FIXME: We can cache this if needed. 3106eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek return C.getCanonicalType(getDecl()->getType()); 3116eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek } 3126eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek 3139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek void print(llvm::raw_ostream& os) const; 3149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 3169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == VarRegionKind; 3179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 3199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass FieldRegion : public DeclRegion { 3219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 3229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 323993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek FieldRegion(const FieldDecl* fd, const MemRegion* sReg) 3249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(fd, sReg, FieldRegionKind) {} 3259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3264bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenekpublic: 3274bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek 3284bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek void print(llvm::raw_ostream& os) const; 3294bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek 3304bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek const FieldDecl* getDecl() const { return cast<FieldDecl>(D); } 3316eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek 3326eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek QualType getRValueType(ASTContext& C) const { 3336eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek // FIXME: We can cache this if needed. 334e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu return C.getCanonicalType(getDecl()->getType()); 3356eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek } 3364bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek 3379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, FieldDecl* FD, 3389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion) { 3399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, FD, superRegion, FieldRegionKind); 3409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3429e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 3439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == FieldRegionKind; 3449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 3469e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 347a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenekclass ObjCObjectRegion : public DeclRegion { 348a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 349a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek friend class MemRegionManager; 350a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 351a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek ObjCObjectRegion(const ObjCInterfaceDecl* ivd, const MemRegion* sReg) 352a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek : DeclRegion(ivd, sReg, ObjCObjectRegionKind) {} 353a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 354a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, ObjCInterfaceDecl* ivd, 355a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek const MemRegion* superRegion) { 356a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCObjectRegionKind); 357a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek } 358a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 359a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenekpublic: 360a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek const ObjCInterfaceDecl* getInterface() const { 361a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek return cast<ObjCInterfaceDecl>(D); 362a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek } 363a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 3646eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek QualType getRValueType(ASTContext& C) const { 365a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek ObjCInterfaceDecl* ID = const_cast<ObjCInterfaceDecl*>(getInterface()); 366a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek return C.getObjCInterfaceType(ID); 367a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek } 368a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 369a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek static bool classof(const MemRegion* R) { 370a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek return R->getKind() == ObjCObjectRegionKind; 371a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek } 372a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek}; 373a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 3749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass ObjCIvarRegion : public DeclRegion { 3759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 3779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 378993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek ObjCIvarRegion(const ObjCIvarDecl* ivd, const MemRegion* sReg) 3799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(ivd, sReg, ObjCIvarRegionKind) {} 3809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, ObjCIvarDecl* ivd, 3829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion) { 3839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCIvarRegionKind); 3849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 3879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const ObjCIvarDecl* getDecl() const { return cast<ObjCIvarDecl>(D); } 3886eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek QualType getRValueType(ASTContext&) const { return getDecl()->getType(); } 3899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 3919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == ObjCIvarRegionKind; 3929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 394511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 39527b57063d83b00474d7563fb5d608544e2364862Zhongxing Xuclass ElementRegion : public TypedRegion { 396511191ce8920160525611be2be754c32a0724c3eZhongxing Xu friend class MemRegionManager; 397511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 398511191ce8920160525611be2be754c32a0724c3eZhongxing Xu SVal Index; 399511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 400511191ce8920160525611be2be754c32a0724c3eZhongxing Xu ElementRegion(SVal Idx, const MemRegion* sReg) 4010395b5d4987fe5baa818015e9d294c128619e4ecZhongxing Xu : TypedRegion(sReg, ElementRegionKind), Index(Idx) { 4023d8173c1c68f451c7492f92023d829c626845925Chris Lattner assert((!isa<nonloc::ConcreteInt>(&Idx) || 4033d8173c1c68f451c7492f92023d829c626845925Chris Lattner cast<nonloc::ConcreteInt>(&Idx)->getValue().isSigned()) && 40443b28d07019bc78447ecbbb721526de4ffd83f20Chris Lattner "The index must be signed"); 4050395b5d4987fe5baa818015e9d294c128619e4ecZhongxing Xu } 406abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek 407511191ce8920160525611be2be754c32a0724c3eZhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID& ID, SVal Idx, 408511191ce8920160525611be2be754c32a0724c3eZhongxing Xu const MemRegion* superRegion); 409511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 410511191ce8920160525611be2be754c32a0724c3eZhongxing Xupublic: 411511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 4126e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu SVal getIndex() const { return Index; } 4136e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu 4146eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek QualType getRValueType(ASTContext&) const; 41527b57063d83b00474d7563fb5d608544e2364862Zhongxing Xu 416abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek /// getArrayRegion - Return the region of the enclosing array. This is 417abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek /// the same as getSuperRegion() except that this returns a TypedRegion* 418abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek /// instead of a MemRegion*. 419abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek const TypedRegion* getArrayRegion() const { 420abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek return cast<TypedRegion>(getSuperRegion()); 421abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek } 422abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek 423b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu void print(llvm::raw_ostream& os) const; 424b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 425511191ce8920160525611be2be754c32a0724c3eZhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const; 426511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 427511191ce8920160525611be2be754c32a0724c3eZhongxing Xu static bool classof(const MemRegion* R) { 428511191ce8920160525611be2be754c32a0724c3eZhongxing Xu return R->getKind() == ElementRegionKind; 429511191ce8920160525611be2be754c32a0724c3eZhongxing Xu } 430511191ce8920160525611be2be754c32a0724c3eZhongxing Xu}; 431511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 4329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 4339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager - Factory object for creating regions. 4349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 4359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager { 4379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek llvm::BumpPtrAllocator& A; 4389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek llvm::FoldingSet<MemRegion> Regions; 4399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* globals; 4419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* stack; 4429e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* heap; 443178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu MemSpaceRegion* unknown; 444dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 4459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 4469e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemRegionManager(llvm::BumpPtrAllocator& a) 4470bc27eab2079c01771cf025a77fd2205378182d8Zhongxing Xu : A(a), globals(0), stack(0), heap(0), unknown(0) {} 4489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek ~MemRegionManager() {} 4509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getStackRegion - Retrieve the memory region associated with the 4529e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// current stack frame. 4539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* getStackRegion(); 4549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getGlobalsRegion - Retrieve the memory region associated with 4569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// all global variables. 4579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* getGlobalsRegion(); 4589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getHeapRegion - Retrieve the memory region associated with the 4609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// generic "heap". 4619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* getHeapRegion(); 462178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 463178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu /// getUnknownRegion - Retrieve the memory region associated with unknown 464178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu /// memory space. 465178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu MemSpaceRegion* getUnknownRegion(); 466c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu 467c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu bool isGlobalsRegion(const MemRegion* R) { 468ce63911d6bdd795f63365723d4cdaa6998529e1eZhongxing Xu assert(R); 469c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu return R == globals; 470c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu } 4714193eca10ce0cc8b2dae887e935a43b26f492b5bZhongxing Xu 4724193eca10ce0cc8b2dae887e935a43b26f492b5bZhongxing Xu /// onStack - check if the region is allocated on the stack. 4734193eca10ce0cc8b2dae887e935a43b26f492b5bZhongxing Xu bool onStack(const MemRegion* R); 4744193eca10ce0cc8b2dae887e935a43b26f492b5bZhongxing Xu 4754193eca10ce0cc8b2dae887e935a43b26f492b5bZhongxing Xu /// onHeap - check if the region is allocated on the heap, usually by malloc. 4764193eca10ce0cc8b2dae887e935a43b26f492b5bZhongxing Xu bool onHeap(const MemRegion* R); 4779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4787090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek /// getAllocaRegion - Retrieve a region associated with a call to alloca(). 4797090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek AllocaRegion* getAllocaRegion(const Expr* Ex, unsigned Cnt); 4807090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek 481329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek /// getCompoundLiteralRegion - Retrieve the region associated with a 482329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek /// given CompoundLiteral. 483329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek CompoundLiteralRegion* 484329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek getCompoundLiteralRegion(const CompoundLiteralExpr* CL); 485329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 486993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek /// getSymbolicRegion - Retrieve or create a "symbolic" memory region. 4872dabd4372c50019fa00aae223ce634e0e754a3f2Ted Kremenek SymbolicRegion* getSymbolicRegion(const SymbolRef sym); 488e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 489e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu StringRegion* getStringRegion(const StringLiteral* Str); 490e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 4919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getVarRegion - Retrieve or create the memory region associated with 4929a1f03afc569abbdcc182379c99d1fe1ece67c9dTed Kremenek /// a specified VarDecl. 4939a1f03afc569abbdcc182379c99d1fe1ece67c9dTed Kremenek VarRegion* getVarRegion(const VarDecl* vd); 494329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 495abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek ElementRegion* getElementRegion(SVal Idx, const TypedRegion* superRegion); 496511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 4979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getFieldRegion - Retrieve or create the memory region associated with 4989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a specified FieldDecl. 'superRegion' corresponds to the containing 4999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// memory region (which typically represents the memory representing 5009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a structure or class). 501abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek FieldRegion* getFieldRegion(const FieldDecl* fd, 502abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek const MemRegion* superRegion); 5039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 504a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek /// getObjCObjectRegion - Retrieve or create the memory region associated with 505a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek /// the instance of a specified Objective-C class. 506a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek ObjCObjectRegion* getObjCObjectRegion(const ObjCInterfaceDecl* ID, 507a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek const MemRegion* superRegion); 508a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 5099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getObjCIvarRegion - Retrieve or create the memory region associated with 5109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a specified Objective-c instance variable. 'superRegion' corresponds 5119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// to the containing region (which typically represents the Objective-C 5129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// object). 5139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek ObjCIvarRegion* getObjCIvarRegion(const ObjCIvarDecl* ivd, 514993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek const MemRegion* superRegion); 515178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 516dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu AnonTypedRegion* getAnonTypedRegion(QualType t, const MemRegion* superRegion); 517dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 5189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek bool hasStackStorage(const MemRegion* R); 519dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 5209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate: 5219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* LazyAllocate(MemSpaceRegion*& region); 5229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 5239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 5249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 5259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 5269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} // end clang namespace 5279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#endif 528