MemRegion.h revision 7ae7ad9951f032d0a33b64c964f7cdcb9cc6f59b
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: 41026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu enum Kind { MemSpaceRegionKind, 42e8e86482da4c1872673bbb9c237649229d19793bTed Kremenek SymbolicRegionKind, 4382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek AllocaRegionKind, 449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek // Typed regions. 459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek BEG_TYPED_REGIONS, 46369f447eded97e6048ced02c0c2be3842f61fc1cZhongxing Xu CodeTextRegionKind, 4777cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu CompoundLiteralRegionKind, 48329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek StringRegionKind, ElementRegionKind, 490312c0e09c9de480d78607972ac64a88f4e94a33Ted Kremenek TypedViewRegionKind, 50329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek // Decl Regions. 51329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek BEG_DECL_REGIONS, 52329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek VarRegionKind, FieldRegionKind, 53329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek ObjCIvarRegionKind, ObjCObjectRegionKind, 54329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek END_DECL_REGIONS, 559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek END_TYPED_REGIONS }; 569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate: 579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const Kind kind; 589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemRegion(Kind k) : kind(k) {} 619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek virtual ~MemRegion(); 629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek // virtual MemExtent getExtent(MemRegionManager& mrm) const = 0; 659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek virtual void Profile(llvm::FoldingSetNodeID& ID) const = 0; 669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 679e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek std::string getString() const; 68b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek virtual void print(llvm::raw_ostream& os) const; 709e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 719e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek Kind getKind() const { return kind; } 7241168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek 73ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek template<typename RegionTy> const RegionTy* getAs() const; 74ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek 7541168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek virtual bool isBoundable(ASTContext&) const { return true; } 76b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion*) { return true; } 789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemSpaceRegion - A memory region that represents and "memory space"; 819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// for example, the set of global variables, the stack frame, etc. 829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemSpaceRegion : public MemRegion { 839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion() : MemRegion(MemSpaceRegionKind) {} 859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek //RegionExtent getExtent() const { return UndefinedExtent(); } 889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 9141168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek bool isBoundable(ASTContext &) const { return false; } 9241168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek 939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == MemSpaceRegionKind; 959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 98993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// SubRegion - A region that subsets another larger region. Most regions 99993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// are subclasses of SubRegion. 100993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass SubRegion : public MemRegion { 1019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 102993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek const MemRegion* superRegion; 103993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek SubRegion(const MemRegion* sReg, Kind k) : MemRegion(k), superRegion(sReg) {} 1049e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 1069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* getSuperRegion() const { 1079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return superRegion; 1089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 1094193eca10ce0cc8b2dae887e935a43b26f492b5bZhongxing Xu 1107e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu bool isSubRegionOf(const MemRegion* R) const; 1117e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu 1129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 113026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu return R->getKind() > MemSpaceRegionKind; 114993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek } 115993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek}; 116ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 11782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek/// AllocaRegion - A region that represents an untyped blob of bytes created 11882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek/// by a call to 'alloca'. 11982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekclass AllocaRegion : public SubRegion { 12082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek friend class MemRegionManager; 12182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekprotected: 12282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek unsigned Cnt; // Block counter. Used to distinguish different pieces of 12382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek // memory allocated by alloca at the same call site. 12482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek const Expr* Ex; 12582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 1267ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek AllocaRegion(const Expr* ex, unsigned cnt, const MemRegion *superRegion) 12782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek : SubRegion(superRegion, AllocaRegionKind), Cnt(cnt), Ex(ex) {} 12882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 12982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekpublic: 13082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 13182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek const Expr* getExpr() const { return Ex; } 13282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 13382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 13482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 13582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Expr* Ex, 1367ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek unsigned Cnt, const MemRegion *superRegion); 13782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 13882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek void print(llvm::raw_ostream& os) const; 13982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 14082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek static bool classof(const MemRegion* R) { 14182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek return R->getKind() == AllocaRegionKind; 14282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek } 14382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek}; 14482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 145993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// TypedRegion - An abstract class representing regions that are typed. 146993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass TypedRegion : public SubRegion { 147993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekprotected: 148993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek TypedRegion(const MemRegion* sReg, Kind k) : SubRegion(sReg, k) {} 149993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 150993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekpublic: 151a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu virtual QualType getValueType(ASTContext &C) const = 0; 1526eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek 153ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu virtual QualType getLocationType(ASTContext& C) const { 1546eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek // FIXME: We can possibly optimize this later to cache this value. 155a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu return C.getPointerType(getValueType(C)); 1566eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek } 15714553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek 158a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu QualType getDesugaredValueType(ASTContext& C) const { 159a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu QualType T = getValueType(C); 1601b9b883a95215e38e153d253a46a2a2fcac25896Ted Kremenek return T.getTypePtr() ? T->getDesugaredType() : T; 16114553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek } 16214553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek 163ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu QualType getDesugaredLocationType(ASTContext& C) const { 164ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu return getLocationType(C)->getDesugaredType(); 16514553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek } 1661b9b883a95215e38e153d253a46a2a2fcac25896Ted Kremenek 16741168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek bool isBoundable(ASTContext &C) const { 168a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu return !getValueType(C).isNull(); 16941168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek } 1706eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek 171993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek static bool classof(const MemRegion* R) { 1729e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek unsigned k = R->getKind(); 1739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return k > BEG_TYPED_REGIONS && k < END_TYPED_REGIONS; 1749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 1759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 1769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 177ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu/// CodeTextRegion - A region that represents code texts of a function. It wraps 178ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu/// two kinds of code texts: real function and symbolic function. Real function 179ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu/// is a function declared in the program. Symbolic function is a function 180ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu/// pointer that we don't know which function it points to. 181ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xuclass CodeTextRegion : public TypedRegion { 182ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xupublic: 183ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu enum CodeKind { Declared, Symbolic }; 184ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 185ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xuprivate: 186ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu // The function pointer kind that this CodeTextRegion represents. 187ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu CodeKind codekind; 188ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 189ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu // Data may be a SymbolRef or FunctionDecl*. 190ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu const void* Data; 191ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 192ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu // Cached function pointer type. 193ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu QualType LocationType; 194ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 195ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xupublic: 196ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 197ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu CodeTextRegion(const FunctionDecl* fd, QualType t, const MemRegion* sreg) 198ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu : TypedRegion(sreg, CodeTextRegionKind), 199ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu codekind(Declared), 200ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu Data(fd), 201ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu LocationType(t) {} 202ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 203ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu CodeTextRegion(SymbolRef sym, QualType t, const MemRegion* sreg) 204ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu : TypedRegion(sreg, CodeTextRegionKind), 205ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu codekind(Symbolic), 206ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu Data(sym), 207ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu LocationType(t) {} 208ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 209a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu QualType getValueType(ASTContext &C) const { 210ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu // Do not get the object type of a CodeTextRegion. 211ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu assert(0); 212ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu return QualType(); 213ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu } 214ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 215ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu QualType getLocationType(ASTContext &C) const { 216ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu return LocationType; 217ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu } 218369f447eded97e6048ced02c0c2be3842f61fc1cZhongxing Xu 219369f447eded97e6048ced02c0c2be3842f61fc1cZhongxing Xu bool isDeclared() const { return codekind == Declared; } 220264e93799c891c03d60cf0b09a032b0a9935d3b5Zhongxing Xu bool isSymbolic() const { return codekind == Symbolic; } 221369f447eded97e6048ced02c0c2be3842f61fc1cZhongxing Xu 222369f447eded97e6048ced02c0c2be3842f61fc1cZhongxing Xu const FunctionDecl* getDecl() const { 223369f447eded97e6048ced02c0c2be3842f61fc1cZhongxing Xu assert(codekind == Declared); 224369f447eded97e6048ced02c0c2be3842f61fc1cZhongxing Xu return static_cast<const FunctionDecl*>(Data); 225369f447eded97e6048ced02c0c2be3842f61fc1cZhongxing Xu } 2268ec3d7dbff9d526fcdce4fbea683830192340c90Ted Kremenek 22772e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek SymbolRef getSymbol() const { 22872e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek assert(codekind == Symbolic); 22972e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek return const_cast<SymbolRef>(static_cast<const SymbolRef>(Data)); 23072e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek } 23172e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek 23272e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek bool isBoundable(ASTContext&) const { return false; } 23372e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek 23472e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek virtual void print(llvm::raw_ostream& os) const; 235ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 236ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const; 237ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 238ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID& ID, 239ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu const void* data, QualType t); 240ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 241ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu static bool classof(const MemRegion* R) { 242ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu return R->getKind() == CodeTextRegionKind; 243ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu } 244ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu}; 245ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 246026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// SymbolicRegion - A special, "non-concrete" region. Unlike other region 247026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// clases, SymbolicRegion represents a region that serves as an alias for 248026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// either a real region, a NULL pointer, etc. It essentially is used to 249026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// map the concept of symbolic values into the domain of regions. Symbolic 250026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// regions do not need to be typed. 251e8e86482da4c1872673bbb9c237649229d19793bTed Kremenekclass SymbolicRegion : public SubRegion { 252026c66395b88a09437319139a43b090093f7e1ddZhongxing Xuprotected: 253026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu const SymbolRef sym; 254026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 255026c66395b88a09437319139a43b090093f7e1ddZhongxing Xupublic: 256e0e4ebf6bfca5a71b2344d8a1b748b852509279cTed Kremenek SymbolicRegion(const SymbolRef s, const MemRegion* sreg) 257e8e86482da4c1872673bbb9c237649229d19793bTed Kremenek : SubRegion(sreg, SymbolicRegionKind), sym(s) {} 258026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 259026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu SymbolRef getSymbol() const { 260026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu return sym; 261026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu } 262026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 263026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const; 264026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 265250101353b711a409b075f1bc11070dddec7100bTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, 266250101353b711a409b075f1bc11070dddec7100bTed Kremenek SymbolRef sym, 267250101353b711a409b075f1bc11070dddec7100bTed Kremenek const MemRegion* superRegion); 268026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 269026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu void print(llvm::raw_ostream& os) const; 270026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 271026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu static bool classof(const MemRegion* R) { 272026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu return R->getKind() == SymbolicRegionKind; 273026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu } 274026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu}; 275026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 276e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu/// StringRegion - Region associated with a StringLiteral. 277e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuclass StringRegion : public TypedRegion { 278e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu friend class MemRegionManager; 279e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const StringLiteral* Str; 280e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuprotected: 281e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 282250101353b711a409b075f1bc11070dddec7100bTed Kremenek StringRegion(const StringLiteral* str, const MemRegion* sreg) 283e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu : TypedRegion(sreg, StringRegionKind), Str(str) {} 284e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 285e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID& ID, 286e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const StringLiteral* Str, 287e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const MemRegion* superRegion); 288e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 289e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xupublic: 2906613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu 2916613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu const StringLiteral* getStringLiteral() const { return Str; } 2926eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek 293a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu QualType getValueType(ASTContext& C) const { 294ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu return Str->getType(); 295ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu } 296e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 297e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const { 298e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu ProfileRegion(ID, Str, superRegion); 299e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 300e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 301cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu void print(llvm::raw_ostream& os) const; 302cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu 303e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static bool classof(const MemRegion* R) { 304e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu return R->getKind() == StringRegionKind; 305e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 306e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu}; 307e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 3080312c0e09c9de480d78607972ac64a88f4e94a33Ted Kremenekclass TypedViewRegion : public TypedRegion { 309dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu friend class MemRegionManager; 310b2dea734527ae75281642a1c6ace28f9e00cab11Ted Kremenek QualType LValueType; 311dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 312b2dea734527ae75281642a1c6ace28f9e00cab11Ted Kremenek TypedViewRegion(QualType lvalueType, const MemRegion* sreg) 313b2dea734527ae75281642a1c6ace28f9e00cab11Ted Kremenek : TypedRegion(sreg, TypedViewRegionKind), LValueType(lvalueType) {} 314dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 315dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID& ID, QualType T, 316dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu const MemRegion* superRegion); 317dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 318dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xupublic: 319dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 320500d2ee83d407106d80920fb4325fa2e06fa61a5Ted Kremenek void print(llvm::raw_ostream& os) const; 321500d2ee83d407106d80920fb4325fa2e06fa61a5Ted Kremenek 322ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu QualType getLocationType(ASTContext&) const { 323e6fbdf538bc50122876639e08a1401e2bc9555baTed Kremenek return LValueType; 324e6fbdf538bc50122876639e08a1401e2bc9555baTed Kremenek } 325e6fbdf538bc50122876639e08a1401e2bc9555baTed Kremenek 326a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu QualType getValueType(ASTContext&) const { 327b2dea734527ae75281642a1c6ace28f9e00cab11Ted Kremenek const PointerType* PTy = LValueType->getAsPointerType(); 3282e3f73b963b5831d6230f69e157b0964b11eff91Zhongxing Xu assert(PTy); 3292e3f73b963b5831d6230f69e157b0964b11eff91Zhongxing Xu return PTy->getPointeeType(); 330dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu } 331b2dea734527ae75281642a1c6ace28f9e00cab11Ted Kremenek 332b2dea734527ae75281642a1c6ace28f9e00cab11Ted Kremenek bool isBoundable(ASTContext &C) const { 333b2dea734527ae75281642a1c6ace28f9e00cab11Ted Kremenek return isa<PointerType>(LValueType); 334b2dea734527ae75281642a1c6ace28f9e00cab11Ted Kremenek } 335dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 336dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const { 337b2dea734527ae75281642a1c6ace28f9e00cab11Ted Kremenek ProfileRegion(ID, LValueType, superRegion); 338dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu } 339dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 340dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu static bool classof(const MemRegion* R) { 3410312c0e09c9de480d78607972ac64a88f4e94a33Ted Kremenek return R->getKind() == TypedViewRegionKind; 342dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu } 3431670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek 3441670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek const MemRegion *removeViews() const; 345dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu}; 3466eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek 347178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 348329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// CompoundLiteralRegion - A memory region representing a compound literal. 349329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// Compound literals are essentially temporaries that are stack allocated 350329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// or in the global constant pool. 35177cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xuclass CompoundLiteralRegion : public TypedRegion { 352329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekprivate: 353329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek friend class MemRegionManager; 354329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek const CompoundLiteralExpr* CL; 355329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 356329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek CompoundLiteralRegion(const CompoundLiteralExpr* cl, const MemRegion* sReg) 35777cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu : TypedRegion(sReg, CompoundLiteralRegionKind), CL(cl) {} 358329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 359329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, 360329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek const CompoundLiteralExpr* CL, 361329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek const MemRegion* superRegion); 362329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekpublic: 363a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu QualType getValueType(ASTContext& C) const { 36477cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu return C.getCanonicalType(CL->getType()); 36577cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu } 3666eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek 367329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 368329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 369329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek void print(llvm::raw_ostream& os) const; 370329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 37111a83dc7a9a5738cc0bc76180b508eae896eefa9Ted Kremenek const CompoundLiteralExpr* getLiteralExpr() const { return CL; } 37211a83dc7a9a5738cc0bc76180b508eae896eefa9Ted Kremenek 373329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek static bool classof(const MemRegion* R) { 374329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek return R->getKind() == CompoundLiteralRegionKind; 375329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek } 376329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek}; 377178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 3789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass DeclRegion : public TypedRegion { 3799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 3809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const Decl* D; 3819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 382993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek DeclRegion(const Decl* d, const MemRegion* sReg, Kind k) 3839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : TypedRegion(sReg, k), D(d) {} 3849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl* D, 3869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion, Kind k); 3879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 388bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xupublic: 389bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xu const Decl* getDecl() const { return D; } 3909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 3916eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek 392e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static bool classof(const MemRegion* R) { 393e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu unsigned k = R->getKind(); 394e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu return k > BEG_DECL_REGIONS && k < END_DECL_REGIONS; 395e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 3969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 3979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass VarRegion : public DeclRegion { 3999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 4009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 401993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek VarRegion(const VarDecl* vd, const MemRegion* sReg) 4029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(vd, sReg, VarRegionKind) {} 4039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 404250101353b711a409b075f1bc11070dddec7100bTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const VarDecl* VD, 4056304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek const MemRegion* superRegion) { 4069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, VD, superRegion, VarRegionKind); 4079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 4089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 4106eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek const VarDecl* getDecl() const { return cast<VarDecl>(D); } 4119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 412a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu QualType getValueType(ASTContext& C) const { 4136eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek // FIXME: We can cache this if needed. 4146eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek return C.getCanonicalType(getDecl()->getType()); 4156eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek } 4166eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek 4179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek void print(llvm::raw_ostream& os) const; 4189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 4209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == VarRegionKind; 4219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 4229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 4239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass FieldRegion : public DeclRegion { 4259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 4269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 427993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek FieldRegion(const FieldDecl* fd, const MemRegion* sReg) 4289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(fd, sReg, FieldRegionKind) {} 4299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4304bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenekpublic: 4314bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek 4324bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek void print(llvm::raw_ostream& os) const; 4334bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek 4344bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek const FieldDecl* getDecl() const { return cast<FieldDecl>(D); } 4356eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek 436a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu QualType getValueType(ASTContext& C) const { 4376eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek // FIXME: We can cache this if needed. 438e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu return C.getCanonicalType(getDecl()->getType()); 4396eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek } 4404bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek 4416304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const FieldDecl* FD, 4426304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek const MemRegion* superRegion) { 4439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, FD, superRegion, FieldRegionKind); 4449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 4459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4469e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 4479e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == FieldRegionKind; 4489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 4499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 4509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 451a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenekclass ObjCObjectRegion : public DeclRegion { 452a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 453a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek friend class MemRegionManager; 454a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 455a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek ObjCObjectRegion(const ObjCInterfaceDecl* ivd, const MemRegion* sReg) 456a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek : DeclRegion(ivd, sReg, ObjCObjectRegionKind) {} 457a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 4586304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, 4596304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek const ObjCInterfaceDecl* ivd, 460a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek const MemRegion* superRegion) { 461a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCObjectRegionKind); 462a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek } 463a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 464a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenekpublic: 465a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek const ObjCInterfaceDecl* getInterface() const { 466a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek return cast<ObjCInterfaceDecl>(D); 467a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek } 468a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 469a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu QualType getValueType(ASTContext& C) const { 4703b3a45858c6b2a45114e91902c3bf3c4b7f5f302Daniel Dunbar return C.getObjCInterfaceType(getInterface()); 471a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek } 472a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 473a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek static bool classof(const MemRegion* R) { 474a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek return R->getKind() == ObjCObjectRegionKind; 475a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek } 476a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek}; 477a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 4789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass ObjCIvarRegion : public DeclRegion { 4799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 4819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 482993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek ObjCIvarRegion(const ObjCIvarDecl* ivd, const MemRegion* sReg) 4839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(ivd, sReg, ObjCIvarRegionKind) {} 4849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4856304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const ObjCIvarDecl* ivd, 4866304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek const MemRegion* superRegion) { 4879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCIvarRegionKind); 4889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 4899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 4919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const ObjCIvarDecl* getDecl() const { return cast<ObjCIvarDecl>(D); } 492a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu QualType getValueType(ASTContext&) const { return getDecl()->getType(); } 4939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 4959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == ObjCIvarRegionKind; 4969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 4979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 498511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 49927b57063d83b00474d7563fb5d608544e2364862Zhongxing Xuclass ElementRegion : public TypedRegion { 500511191ce8920160525611be2be754c32a0724c3eZhongxing Xu friend class MemRegionManager; 501511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 502f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek QualType ElementType; 503511191ce8920160525611be2be754c32a0724c3eZhongxing Xu SVal Index; 504511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 505f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek ElementRegion(QualType elementType, SVal Idx, const MemRegion* sReg) 506f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek : TypedRegion(sReg, ElementRegionKind), 507f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek ElementType(elementType), Index(Idx) { 5083d8173c1c68f451c7492f92023d829c626845925Chris Lattner assert((!isa<nonloc::ConcreteInt>(&Idx) || 5093d8173c1c68f451c7492f92023d829c626845925Chris Lattner cast<nonloc::ConcreteInt>(&Idx)->getValue().isSigned()) && 51043b28d07019bc78447ecbbb721526de4ffd83f20Chris Lattner "The index must be signed"); 5110395b5d4987fe5baa818015e9d294c128619e4ecZhongxing Xu } 512abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek 513f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, QualType elementType, 514f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek SVal Idx, const MemRegion* superRegion); 515511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 516511191ce8920160525611be2be754c32a0724c3eZhongxing Xupublic: 517511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 5186e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu SVal getIndex() const { return Index; } 5196e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu 520a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu QualType getValueType(ASTContext&) const { 521f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek return ElementType; 522f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek } 523f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek 524f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek QualType getElementType() const { 525f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek return ElementType; 526abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek } 527abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek 528b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu void print(llvm::raw_ostream& os) const; 529b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 530511191ce8920160525611be2be754c32a0724c3eZhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const; 531511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 532511191ce8920160525611be2be754c32a0724c3eZhongxing Xu static bool classof(const MemRegion* R) { 533511191ce8920160525611be2be754c32a0724c3eZhongxing Xu return R->getKind() == ElementRegionKind; 534511191ce8920160525611be2be754c32a0724c3eZhongxing Xu } 535511191ce8920160525611be2be754c32a0724c3eZhongxing Xu}; 536ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek 537ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenektemplate<typename RegionTy> 538ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenekconst RegionTy* MemRegion::getAs() const { 539ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek const MemRegion *R = this; 540ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek 541ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek do { 542ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek if (const RegionTy* RT = dyn_cast<RegionTy>(R)) 543ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek return RT; 544ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek 545ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek if (const TypedViewRegion *TR = dyn_cast<TypedViewRegion>(R)) { 546ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek R = TR->getSuperRegion(); 547ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek continue; 548ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek } 549ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek 550ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek break; 551ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek } 552ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek while (R); 553ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek 554ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek return 0; 555ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek} 556511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 5579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 5589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager - Factory object for creating regions. 5599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 5609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 5619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager { 5629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek llvm::BumpPtrAllocator& A; 5639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek llvm::FoldingSet<MemRegion> Regions; 5649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 5659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* globals; 5669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* stack; 5679e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* heap; 568178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu MemSpaceRegion* unknown; 569ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu MemSpaceRegion* code; 570dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 5719e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 5729e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemRegionManager(llvm::BumpPtrAllocator& a) 57383a1d1d1a28aafca1f2a271189b78a299b4c9d65Ted Kremenek : A(a), globals(0), stack(0), heap(0), unknown(0), code(0) {} 5749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 5759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek ~MemRegionManager() {} 5769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 5779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getStackRegion - Retrieve the memory region associated with the 5789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// current stack frame. 5799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* getStackRegion(); 5809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 5819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getGlobalsRegion - Retrieve the memory region associated with 5829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// all global variables. 5839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* getGlobalsRegion(); 5849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 5859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getHeapRegion - Retrieve the memory region associated with the 5869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// generic "heap". 5879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* getHeapRegion(); 588178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 589178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu /// getUnknownRegion - Retrieve the memory region associated with unknown 590178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu /// memory space. 591178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu MemSpaceRegion* getUnknownRegion(); 592c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu 593ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu MemSpaceRegion* getCodeRegion(); 594ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 595c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu bool isGlobalsRegion(const MemRegion* R) { 596ce63911d6bdd795f63365723d4cdaa6998529e1eZhongxing Xu assert(R); 597c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu return R == globals; 598c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu } 5994193eca10ce0cc8b2dae887e935a43b26f492b5bZhongxing Xu 6004193eca10ce0cc8b2dae887e935a43b26f492b5bZhongxing Xu /// onStack - check if the region is allocated on the stack. 6014193eca10ce0cc8b2dae887e935a43b26f492b5bZhongxing Xu bool onStack(const MemRegion* R); 6024193eca10ce0cc8b2dae887e935a43b26f492b5bZhongxing Xu 6034193eca10ce0cc8b2dae887e935a43b26f492b5bZhongxing Xu /// onHeap - check if the region is allocated on the heap, usually by malloc. 6044193eca10ce0cc8b2dae887e935a43b26f492b5bZhongxing Xu bool onHeap(const MemRegion* R); 6059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 606250101353b711a409b075f1bc11070dddec7100bTed Kremenek bool hasStackStorage(const MemRegion* R); 607250101353b711a409b075f1bc11070dddec7100bTed Kremenek 6087090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek /// getAllocaRegion - Retrieve a region associated with a call to alloca(). 6097090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek AllocaRegion* getAllocaRegion(const Expr* Ex, unsigned Cnt); 6107090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek 611329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek /// getCompoundLiteralRegion - Retrieve the region associated with a 612329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek /// given CompoundLiteral. 613329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek CompoundLiteralRegion* 614329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek getCompoundLiteralRegion(const CompoundLiteralExpr* CL); 615329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 616993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek /// getSymbolicRegion - Retrieve or create a "symbolic" memory region. 617e0e4ebf6bfca5a71b2344d8a1b748b852509279cTed Kremenek SymbolicRegion* getSymbolicRegion(SymbolRef sym); 618e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 619e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu StringRegion* getStringRegion(const StringLiteral* Str); 620e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 6219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getVarRegion - Retrieve or create the memory region associated with 6229a1f03afc569abbdcc182379c99d1fe1ece67c9dTed Kremenek /// a specified VarDecl. 6239a1f03afc569abbdcc182379c99d1fe1ece67c9dTed Kremenek VarRegion* getVarRegion(const VarDecl* vd); 624329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 625f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek /// getElementRegion - Retrieve the memory region associated with the 626f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek /// associated element type, index, and super region. 627f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek ElementRegion* getElementRegion(QualType elementType, SVal Idx, 628143b2fc6fd3945c250b333383749010c2c8e3a4cZhongxing Xu const MemRegion* superRegion,ASTContext &Ctx); 629511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 6309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getFieldRegion - Retrieve or create the memory region associated with 6319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a specified FieldDecl. 'superRegion' corresponds to the containing 6329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// memory region (which typically represents the memory representing 6339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a structure or class). 634abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek FieldRegion* getFieldRegion(const FieldDecl* fd, 635abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek const MemRegion* superRegion); 6369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 637a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek /// getObjCObjectRegion - Retrieve or create the memory region associated with 638a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek /// the instance of a specified Objective-C class. 639a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek ObjCObjectRegion* getObjCObjectRegion(const ObjCInterfaceDecl* ID, 640a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek const MemRegion* superRegion); 641a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 6429e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getObjCIvarRegion - Retrieve or create the memory region associated with 6439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a specified Objective-c instance variable. 'superRegion' corresponds 6449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// to the containing region (which typically represents the Objective-C 6459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// object). 6469e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek ObjCIvarRegion* getObjCIvarRegion(const ObjCIvarDecl* ivd, 647993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek const MemRegion* superRegion); 648178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 649b2dea734527ae75281642a1c6ace28f9e00cab11Ted Kremenek TypedViewRegion* getTypedViewRegion(QualType LValueType, 650b2dea734527ae75281642a1c6ace28f9e00cab11Ted Kremenek const MemRegion* superRegion); 651dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 652ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu CodeTextRegion* getCodeTextRegion(SymbolRef sym, QualType t); 653ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu CodeTextRegion* getCodeTextRegion(const FunctionDecl* fd, QualType t); 654250101353b711a409b075f1bc11070dddec7100bTed Kremenek 655250101353b711a409b075f1bc11070dddec7100bTed Kremenek template <typename RegionTy, typename A1> 656250101353b711a409b075f1bc11070dddec7100bTed Kremenek RegionTy* getRegion(const A1 a1); 6576304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek 6586304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek template <typename RegionTy, typename A1> 6596304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek RegionTy* getRegion(const A1 a1, const MemRegion* superRegion); 6607ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek 6617ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek template <typename RegionTy, typename A1, typename A2> 6627ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek RegionTy* getRegion(const A1 a1, const A2 a2); 663dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 6649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate: 6659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* LazyAllocate(MemSpaceRegion*& region); 666ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek}; 667250101353b711a409b075f1bc11070dddec7100bTed Kremenek 668250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 669250101353b711a409b075f1bc11070dddec7100bTed Kremenek// Out-of-line member template definitions. 670250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 671250101353b711a409b075f1bc11070dddec7100bTed Kremenek 672250101353b711a409b075f1bc11070dddec7100bTed Kremenektemplate<typename RegionTy> struct MemRegionManagerTrait; 673250101353b711a409b075f1bc11070dddec7100bTed Kremenek 674250101353b711a409b075f1bc11070dddec7100bTed Kremenektemplate <typename RegionTy, typename A1> 675250101353b711a409b075f1bc11070dddec7100bTed KremenekRegionTy* MemRegionManager::getRegion(const A1 a1) { 676250101353b711a409b075f1bc11070dddec7100bTed Kremenek 677250101353b711a409b075f1bc11070dddec7100bTed Kremenek const typename MemRegionManagerTrait<RegionTy>::SuperRegionTy *superRegion = 678250101353b711a409b075f1bc11070dddec7100bTed Kremenek MemRegionManagerTrait<RegionTy>::getSuperRegion(*this, a1); 679250101353b711a409b075f1bc11070dddec7100bTed Kremenek 680250101353b711a409b075f1bc11070dddec7100bTed Kremenek llvm::FoldingSetNodeID ID; 681250101353b711a409b075f1bc11070dddec7100bTed Kremenek RegionTy::ProfileRegion(ID, a1, superRegion); 682250101353b711a409b075f1bc11070dddec7100bTed Kremenek void* InsertPos; 683250101353b711a409b075f1bc11070dddec7100bTed Kremenek RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID, 684250101353b711a409b075f1bc11070dddec7100bTed Kremenek InsertPos)); 685250101353b711a409b075f1bc11070dddec7100bTed Kremenek 686250101353b711a409b075f1bc11070dddec7100bTed Kremenek if (!R) { 6876304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek R = (RegionTy*) A.Allocate<RegionTy>(); 6886304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek new (R) RegionTy(a1, superRegion); 6896304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek Regions.InsertNode(R, InsertPos); 6906304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek } 6916304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek 6926304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek return R; 6936304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek} 6946304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek 6956304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenektemplate <typename RegionTy, typename A1> 6966304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed KremenekRegionTy* MemRegionManager::getRegion(const A1 a1, const MemRegion *superRegion) 6976304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek{ 6986304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek llvm::FoldingSetNodeID ID; 6996304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek RegionTy::ProfileRegion(ID, a1, superRegion); 7006304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek void* InsertPos; 7016304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID, 7026304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek InsertPos)); 7036304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek 7046304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek if (!R) { 705250101353b711a409b075f1bc11070dddec7100bTed Kremenek R = (RegionTy*) A.Allocate<RegionTy>(); 706250101353b711a409b075f1bc11070dddec7100bTed Kremenek new (R) RegionTy(a1, superRegion); 707250101353b711a409b075f1bc11070dddec7100bTed Kremenek Regions.InsertNode(R, InsertPos); 708250101353b711a409b075f1bc11070dddec7100bTed Kremenek } 709250101353b711a409b075f1bc11070dddec7100bTed Kremenek 710250101353b711a409b075f1bc11070dddec7100bTed Kremenek return R; 711250101353b711a409b075f1bc11070dddec7100bTed Kremenek} 712250101353b711a409b075f1bc11070dddec7100bTed Kremenek 7137ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenektemplate <typename RegionTy, typename A1, typename A2> 7147ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed KremenekRegionTy* MemRegionManager::getRegion(const A1 a1, const A2 a2) { 7157ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek 7167ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek const typename MemRegionManagerTrait<RegionTy>::SuperRegionTy *superRegion = 7177ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek MemRegionManagerTrait<RegionTy>::getSuperRegion(*this, a1, a2); 7187ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek 7197ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek llvm::FoldingSetNodeID ID; 7207ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek RegionTy::ProfileRegion(ID, a1, a2, superRegion); 7217ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek void* InsertPos; 7227ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID, 7237ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek InsertPos)); 7247ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek 7257ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek if (!R) { 7267ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek R = (RegionTy*) A.Allocate<RegionTy>(); 7277ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek new (R) RegionTy(a1, a2, superRegion); 7287ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek Regions.InsertNode(R, InsertPos); 7297ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek } 7307ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek 7317ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek return R; 7327ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek} 7337ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek 734250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 735250101353b711a409b075f1bc11070dddec7100bTed Kremenek// Traits for constructing regions. 736250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 737250101353b711a409b075f1bc11070dddec7100bTed Kremenek 7387ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenektemplate <> struct MemRegionManagerTrait<AllocaRegion> { 7397ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek typedef MemRegion SuperRegionTy; 7407ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek static const SuperRegionTy* getSuperRegion(MemRegionManager& MRMgr, 7417ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek const Expr *, unsigned) { 7427ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek return MRMgr.getStackRegion(); 7437ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek } 7447ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek}; 7457ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek 746250101353b711a409b075f1bc11070dddec7100bTed Kremenektemplate <> struct MemRegionManagerTrait<CompoundLiteralRegion> { 747250101353b711a409b075f1bc11070dddec7100bTed Kremenek typedef MemRegion SuperRegionTy; 748250101353b711a409b075f1bc11070dddec7100bTed Kremenek static const SuperRegionTy* getSuperRegion(MemRegionManager& MRMgr, 749250101353b711a409b075f1bc11070dddec7100bTed Kremenek const CompoundLiteralExpr *CL) { 750250101353b711a409b075f1bc11070dddec7100bTed Kremenek 751250101353b711a409b075f1bc11070dddec7100bTed Kremenek return CL->isFileScope() ? MRMgr.getGlobalsRegion() 752250101353b711a409b075f1bc11070dddec7100bTed Kremenek : MRMgr.getStackRegion(); 753250101353b711a409b075f1bc11070dddec7100bTed Kremenek } 754250101353b711a409b075f1bc11070dddec7100bTed Kremenek}; 755250101353b711a409b075f1bc11070dddec7100bTed Kremenek 756250101353b711a409b075f1bc11070dddec7100bTed Kremenektemplate <> struct MemRegionManagerTrait<StringRegion> { 757250101353b711a409b075f1bc11070dddec7100bTed Kremenek typedef MemSpaceRegion SuperRegionTy; 758250101353b711a409b075f1bc11070dddec7100bTed Kremenek static const SuperRegionTy* getSuperRegion(MemRegionManager& MRMgr, 759250101353b711a409b075f1bc11070dddec7100bTed Kremenek const StringLiteral*) { 760250101353b711a409b075f1bc11070dddec7100bTed Kremenek return MRMgr.getGlobalsRegion(); 761250101353b711a409b075f1bc11070dddec7100bTed Kremenek } 762250101353b711a409b075f1bc11070dddec7100bTed Kremenek}; 763250101353b711a409b075f1bc11070dddec7100bTed Kremenek 764250101353b711a409b075f1bc11070dddec7100bTed Kremenektemplate <> struct MemRegionManagerTrait<VarRegion> { 765250101353b711a409b075f1bc11070dddec7100bTed Kremenek typedef MemRegion SuperRegionTy; 766250101353b711a409b075f1bc11070dddec7100bTed Kremenek static const SuperRegionTy* getSuperRegion(MemRegionManager& MRMgr, 767250101353b711a409b075f1bc11070dddec7100bTed Kremenek const VarDecl *d) { 768250101353b711a409b075f1bc11070dddec7100bTed Kremenek return d->hasLocalStorage() ? MRMgr.getStackRegion() 769250101353b711a409b075f1bc11070dddec7100bTed Kremenek : MRMgr.getGlobalsRegion(); 770250101353b711a409b075f1bc11070dddec7100bTed Kremenek } 771250101353b711a409b075f1bc11070dddec7100bTed Kremenek}; 772250101353b711a409b075f1bc11070dddec7100bTed Kremenek 773250101353b711a409b075f1bc11070dddec7100bTed Kremenektemplate <> struct MemRegionManagerTrait<SymbolicRegion> { 774250101353b711a409b075f1bc11070dddec7100bTed Kremenek typedef MemRegion SuperRegionTy; 775250101353b711a409b075f1bc11070dddec7100bTed Kremenek static const SuperRegionTy* getSuperRegion(MemRegionManager& MRMgr, 776250101353b711a409b075f1bc11070dddec7100bTed Kremenek SymbolRef) { 777250101353b711a409b075f1bc11070dddec7100bTed Kremenek return MRMgr.getUnknownRegion(); 778250101353b711a409b075f1bc11070dddec7100bTed Kremenek } 779250101353b711a409b075f1bc11070dddec7100bTed Kremenek}; 780250101353b711a409b075f1bc11070dddec7100bTed Kremenek 781250101353b711a409b075f1bc11070dddec7100bTed Kremenek 782be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end clang namespace 7839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 784250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 785250101353b711a409b075f1bc11070dddec7100bTed Kremenek// Pretty-printing regions. 786250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 787250101353b711a409b075f1bc11070dddec7100bTed Kremenek 788be91224894e1501133e224934285ba6440bf5b59Ted Kremeneknamespace llvm { 789be91224894e1501133e224934285ba6440bf5b59Ted Kremenekstatic inline raw_ostream& operator<<(raw_ostream& O, 790be91224894e1501133e224934285ba6440bf5b59Ted Kremenek const clang::MemRegion* R) { 791be91224894e1501133e224934285ba6440bf5b59Ted Kremenek R->print(O); 792be91224894e1501133e224934285ba6440bf5b59Ted Kremenek return O; 793be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} 794be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end llvm namespace 7959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 7969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#endif 797