MemRegion.h revision 14553abd17d303b0b310b3ab1523eb0d30d8121c
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 } 17614553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek 17714553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek QualType getDesugaredRValueType(ASTContext& C) const { 17814553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek return getRValueType(C)->getDesugaredType(); 17914553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek } 18014553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek 18114553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek QualType getDesugaredLValueType(ASTContext& C) const { 18214553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek return getLValueType(C)->getDesugaredType(); 18314553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek } 1846eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek 185993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek static bool classof(const MemRegion* R) { 1869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek unsigned k = R->getKind(); 1879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return k > BEG_TYPED_REGIONS && k < END_TYPED_REGIONS; 1889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 1899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 1909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 191e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu/// StringRegion - Region associated with a StringLiteral. 192e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuclass StringRegion : public TypedRegion { 193e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu friend class MemRegionManager; 194e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const StringLiteral* Str; 195e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuprotected: 196e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 197e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu StringRegion(const StringLiteral* str, MemRegion* sreg) 198e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu : TypedRegion(sreg, StringRegionKind), Str(str) {} 199e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 200e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID& ID, 201e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const StringLiteral* Str, 202e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const MemRegion* superRegion); 203e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 204e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xupublic: 2056613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu 2066613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu const StringLiteral* getStringLiteral() const { return Str; } 2076eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek 2086eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek QualType getRValueType(ASTContext& C) const; 209e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 210e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const { 211e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu ProfileRegion(ID, Str, superRegion); 212e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 213e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 214cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu void print(llvm::raw_ostream& os) const; 215cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu 216e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static bool classof(const MemRegion* R) { 217e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu return R->getKind() == StringRegionKind; 218e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 219e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu}; 220e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 221dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xuclass AnonTypedRegion : public TypedRegion { 222dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu friend class MemRegionManager; 223dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 224dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu QualType T; 225dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 226dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu AnonTypedRegion(QualType t, const MemRegion* sreg) 227dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu : TypedRegion(sreg, AnonTypedRegionKind), T(t) {} 228dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 229dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID& ID, QualType T, 230dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu const MemRegion* superRegion); 231dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 232dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xupublic: 233dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 234500d2ee83d407106d80920fb4325fa2e06fa61a5Ted Kremenek void print(llvm::raw_ostream& os) const; 235500d2ee83d407106d80920fb4325fa2e06fa61a5Ted Kremenek 2366eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek QualType getRValueType(ASTContext&) const { 237dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu return T; 238dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu } 239dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 240dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const { 241dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu ProfileRegion(ID, T, superRegion); 242dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu } 243dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 244dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu static bool classof(const MemRegion* R) { 245dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu return R->getKind() == AnonTypedRegionKind; 246dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu } 247dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu}; 2486eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek 249178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 250329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// CompoundLiteralRegion - A memory region representing a compound literal. 251329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// Compound literals are essentially temporaries that are stack allocated 252329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// or in the global constant pool. 25377cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xuclass CompoundLiteralRegion : public TypedRegion { 254329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekprivate: 255329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek friend class MemRegionManager; 256329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek const CompoundLiteralExpr* CL; 257329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 258329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek CompoundLiteralRegion(const CompoundLiteralExpr* cl, const MemRegion* sReg) 25977cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu : TypedRegion(sReg, CompoundLiteralRegionKind), CL(cl) {} 260329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 261329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, 262329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek const CompoundLiteralExpr* CL, 263329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek const MemRegion* superRegion); 264329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekpublic: 2656eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek QualType getRValueType(ASTContext& C) const { 26677cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu return C.getCanonicalType(CL->getType()); 26777cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu } 2686eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek 269329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 270329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 271329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek void print(llvm::raw_ostream& os) const; 272329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 27311a83dc7a9a5738cc0bc76180b508eae896eefa9Ted Kremenek const CompoundLiteralExpr* getLiteralExpr() const { return CL; } 27411a83dc7a9a5738cc0bc76180b508eae896eefa9Ted Kremenek 275329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek static bool classof(const MemRegion* R) { 276329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek return R->getKind() == CompoundLiteralRegionKind; 277329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek } 278329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek}; 279178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 2809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass DeclRegion : public TypedRegion { 2819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 2829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const Decl* D; 2839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 284993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek DeclRegion(const Decl* d, const MemRegion* sReg, Kind k) 2859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : TypedRegion(sReg, k), D(d) {} 2869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl* D, 2889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion, Kind k); 2899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 290bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xupublic: 291bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xu const Decl* getDecl() const { return D; } 2929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 2936eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek 2946eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek QualType getRValueType(ASTContext& C) const = 0; 2956eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek 296e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static bool classof(const MemRegion* R) { 297e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu unsigned k = R->getKind(); 298e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu return k > BEG_DECL_REGIONS && k < END_DECL_REGIONS; 299e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 3009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 3019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass VarRegion : public DeclRegion { 3039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 3049e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 305993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek VarRegion(const VarDecl* vd, const MemRegion* sReg) 3069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(vd, sReg, VarRegionKind) {} 3079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, VarDecl* VD, 3099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion) { 3109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, VD, superRegion, VarRegionKind); 3119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 3146eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek const VarDecl* getDecl() const { return cast<VarDecl>(D); } 3159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3166eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek QualType getRValueType(ASTContext& C) const { 3176eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek // FIXME: We can cache this if needed. 3186eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek return C.getCanonicalType(getDecl()->getType()); 3196eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek } 3206eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek 3219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek void print(llvm::raw_ostream& os) const; 3229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 3249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == VarRegionKind; 3259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 3279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass FieldRegion : public DeclRegion { 3299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 3309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 331993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek FieldRegion(const FieldDecl* fd, const MemRegion* sReg) 3329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(fd, sReg, FieldRegionKind) {} 3339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3344bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenekpublic: 3354bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek 3364bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek void print(llvm::raw_ostream& os) const; 3374bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek 3384bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek const FieldDecl* getDecl() const { return cast<FieldDecl>(D); } 3396eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek 3406eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek QualType getRValueType(ASTContext& C) const { 3416eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek // FIXME: We can cache this if needed. 342e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu return C.getCanonicalType(getDecl()->getType()); 3436eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek } 3444bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek 3459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, FieldDecl* FD, 3469e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion) { 3479e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, FD, superRegion, FieldRegionKind); 3489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 3519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == FieldRegionKind; 3529e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 3549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 355a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenekclass ObjCObjectRegion : public DeclRegion { 356a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 357a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek friend class MemRegionManager; 358a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 359a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek ObjCObjectRegion(const ObjCInterfaceDecl* ivd, const MemRegion* sReg) 360a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek : DeclRegion(ivd, sReg, ObjCObjectRegionKind) {} 361a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 362a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, ObjCInterfaceDecl* ivd, 363a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek const MemRegion* superRegion) { 364a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCObjectRegionKind); 365a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek } 366a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 367a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenekpublic: 368a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek const ObjCInterfaceDecl* getInterface() const { 369a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek return cast<ObjCInterfaceDecl>(D); 370a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek } 371a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 3726eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek QualType getRValueType(ASTContext& C) const { 373a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek ObjCInterfaceDecl* ID = const_cast<ObjCInterfaceDecl*>(getInterface()); 374a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek return C.getObjCInterfaceType(ID); 375a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek } 376a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 377a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek static bool classof(const MemRegion* R) { 378a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek return R->getKind() == ObjCObjectRegionKind; 379a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek } 380a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek}; 381a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 3829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass ObjCIvarRegion : public DeclRegion { 3839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 3859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 386993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek ObjCIvarRegion(const ObjCIvarDecl* ivd, const MemRegion* sReg) 3879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(ivd, sReg, ObjCIvarRegionKind) {} 3889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, ObjCIvarDecl* ivd, 3909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion) { 3919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCIvarRegionKind); 3929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 3959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const ObjCIvarDecl* getDecl() const { return cast<ObjCIvarDecl>(D); } 3966eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek QualType getRValueType(ASTContext&) const { return getDecl()->getType(); } 3979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 3999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == ObjCIvarRegionKind; 4009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 4019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 402511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 40327b57063d83b00474d7563fb5d608544e2364862Zhongxing Xuclass ElementRegion : public TypedRegion { 404511191ce8920160525611be2be754c32a0724c3eZhongxing Xu friend class MemRegionManager; 405511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 406511191ce8920160525611be2be754c32a0724c3eZhongxing Xu SVal Index; 407511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 408511191ce8920160525611be2be754c32a0724c3eZhongxing Xu ElementRegion(SVal Idx, const MemRegion* sReg) 4090395b5d4987fe5baa818015e9d294c128619e4ecZhongxing Xu : TypedRegion(sReg, ElementRegionKind), Index(Idx) { 4103d8173c1c68f451c7492f92023d829c626845925Chris Lattner assert((!isa<nonloc::ConcreteInt>(&Idx) || 4113d8173c1c68f451c7492f92023d829c626845925Chris Lattner cast<nonloc::ConcreteInt>(&Idx)->getValue().isSigned()) && 41243b28d07019bc78447ecbbb721526de4ffd83f20Chris Lattner "The index must be signed"); 4130395b5d4987fe5baa818015e9d294c128619e4ecZhongxing Xu } 414abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek 415511191ce8920160525611be2be754c32a0724c3eZhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID& ID, SVal Idx, 416511191ce8920160525611be2be754c32a0724c3eZhongxing Xu const MemRegion* superRegion); 417511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 418511191ce8920160525611be2be754c32a0724c3eZhongxing Xupublic: 419511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 4206e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu SVal getIndex() const { return Index; } 4216e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu 4226eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek QualType getRValueType(ASTContext&) const; 42327b57063d83b00474d7563fb5d608544e2364862Zhongxing Xu 424abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek /// getArrayRegion - Return the region of the enclosing array. This is 425abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek /// the same as getSuperRegion() except that this returns a TypedRegion* 426abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek /// instead of a MemRegion*. 427abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek const TypedRegion* getArrayRegion() const { 428abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek return cast<TypedRegion>(getSuperRegion()); 429abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek } 430abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek 431b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu void print(llvm::raw_ostream& os) const; 432b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 433511191ce8920160525611be2be754c32a0724c3eZhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const; 434511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 435511191ce8920160525611be2be754c32a0724c3eZhongxing Xu static bool classof(const MemRegion* R) { 436511191ce8920160525611be2be754c32a0724c3eZhongxing Xu return R->getKind() == ElementRegionKind; 437511191ce8920160525611be2be754c32a0724c3eZhongxing Xu } 438511191ce8920160525611be2be754c32a0724c3eZhongxing Xu}; 439511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 4409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 4419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager - Factory object for creating regions. 4429e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 4439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager { 4459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek llvm::BumpPtrAllocator& A; 4469e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek llvm::FoldingSet<MemRegion> Regions; 4479e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* globals; 4499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* stack; 4509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* heap; 451178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu MemSpaceRegion* unknown; 452dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 4539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 4549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemRegionManager(llvm::BumpPtrAllocator& a) 4550bc27eab2079c01771cf025a77fd2205378182d8Zhongxing Xu : A(a), globals(0), stack(0), heap(0), unknown(0) {} 4569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek ~MemRegionManager() {} 4589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getStackRegion - Retrieve the memory region associated with the 4609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// current stack frame. 4619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* getStackRegion(); 4629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getGlobalsRegion - Retrieve the memory region associated with 4649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// all global variables. 4659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* getGlobalsRegion(); 4669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4679e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getHeapRegion - Retrieve the memory region associated with the 4689e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// generic "heap". 4699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* getHeapRegion(); 470178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 471178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu /// getUnknownRegion - Retrieve the memory region associated with unknown 472178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu /// memory space. 473178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu MemSpaceRegion* getUnknownRegion(); 474c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu 475c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu bool isGlobalsRegion(const MemRegion* R) { 476ce63911d6bdd795f63365723d4cdaa6998529e1eZhongxing Xu assert(R); 477c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu return R == globals; 478c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu } 4794193eca10ce0cc8b2dae887e935a43b26f492b5bZhongxing Xu 4804193eca10ce0cc8b2dae887e935a43b26f492b5bZhongxing Xu /// onStack - check if the region is allocated on the stack. 4814193eca10ce0cc8b2dae887e935a43b26f492b5bZhongxing Xu bool onStack(const MemRegion* R); 4824193eca10ce0cc8b2dae887e935a43b26f492b5bZhongxing Xu 4834193eca10ce0cc8b2dae887e935a43b26f492b5bZhongxing Xu /// onHeap - check if the region is allocated on the heap, usually by malloc. 4844193eca10ce0cc8b2dae887e935a43b26f492b5bZhongxing Xu bool onHeap(const MemRegion* R); 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 503abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek ElementRegion* getElementRegion(SVal Idx, const TypedRegion* 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). 509abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek FieldRegion* getFieldRegion(const FieldDecl* fd, 510abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek const MemRegion* superRegion); 5119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 512a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek /// getObjCObjectRegion - Retrieve or create the memory region associated with 513a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek /// the instance of a specified Objective-C class. 514a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek ObjCObjectRegion* getObjCObjectRegion(const ObjCInterfaceDecl* ID, 515a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek const MemRegion* superRegion); 516a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 5179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getObjCIvarRegion - Retrieve or create the memory region associated with 5189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a specified Objective-c instance variable. 'superRegion' corresponds 5199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// to the containing region (which typically represents the Objective-C 5209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// object). 5219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek ObjCIvarRegion* getObjCIvarRegion(const ObjCIvarDecl* ivd, 522993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek const MemRegion* superRegion); 523178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 524dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu AnonTypedRegion* getAnonTypedRegion(QualType t, const MemRegion* superRegion); 525dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 5269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek bool hasStackStorage(const MemRegion* R); 527dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 5289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate: 5299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* LazyAllocate(MemSpaceRegion*& region); 5309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 5319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 5329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 5339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 5349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} // end clang namespace 5359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#endif 536