MemRegion.h revision eeea45611d45238c34474c183cee96d47ae79e24
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; 36bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenekclass MemSpaceRegion; 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(); 62a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek ASTContext &getContext() const; 639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek virtual void Profile(llvm::FoldingSetNodeID& ID) const = 0; 66a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 67a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek virtual MemRegionManager* getMemRegionManager() const = 0; 68a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek std::string getString() const; 70bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek 71bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek const MemSpaceRegion *getMemorySpace() const; 72ea20cd74793d257679267032419a9ff7fc89dc05Ted Kremenek 73ea20cd74793d257679267032419a9ff7fc89dc05Ted Kremenek bool hasStackStorage() const; 74ea20cd74793d257679267032419a9ff7fc89dc05Ted Kremenek 751508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek bool hasParametersStorage() const; 761508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek 771508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek bool hasGlobalsStorage() const; 781508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek 791508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek bool hasGlobalsOrParametersStorage() const; 801508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek 81ea20cd74793d257679267032419a9ff7fc89dc05Ted Kremenek bool hasHeapStorage() const; 82bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek 83bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek bool hasHeapOrStackStorage() const; 84b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 857f39d29cb69e7488f994870800d548008e50e1cbTed Kremenek virtual void print(llvm::raw_ostream& os) const; 867f39d29cb69e7488f994870800d548008e50e1cbTed Kremenek 877f39d29cb69e7488f994870800d548008e50e1cbTed Kremenek void printStdErr() const; 889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek Kind getKind() const { return kind; } 9041168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek 91ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek template<typename RegionTy> const RegionTy* getAs() const; 92ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek 93f0f0605c87739c906861f73d4287798a4969b1e0Zhongxing Xu virtual bool isBoundable() const { return false; } 94b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion*) { return true; } 969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemSpaceRegion - A memory region that represents and "memory space"; 999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// for example, the set of global variables, the stack frame, etc. 1009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemSpaceRegion : public MemRegion { 1019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 102a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 103a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenekprotected: 104a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek MemRegionManager *Mgr; 105a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 106a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek MemSpaceRegion(MemRegionManager *mgr) : MemRegion(MemSpaceRegionKind), 107a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek Mgr(mgr) {} 1089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 109a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek MemRegionManager* getMemRegionManager() const { 110a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek return Mgr; 111a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek } 112a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 1139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 1149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 1159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 116a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek bool isBoundable() const { return false; } 11741168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek 1189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 1199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == MemSpaceRegionKind; 1209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 1219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 1229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 123993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// SubRegion - A region that subsets another larger region. Most regions 124993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// are subclasses of SubRegion. 125993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass SubRegion : public MemRegion { 1269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 127993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek const MemRegion* superRegion; 128993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek SubRegion(const MemRegion* sReg, Kind k) : MemRegion(k), superRegion(sReg) {} 1299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 1309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* getSuperRegion() const { 1319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return superRegion; 1329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 133a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 134a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek MemRegionManager* getMemRegionManager() const; 1354193eca10ce0cc8b2dae887e935a43b26f492b5bZhongxing Xu 1367e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu bool isSubRegionOf(const MemRegion* R) const; 1377e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu 1389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 139026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu return R->getKind() > MemSpaceRegionKind; 140993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek } 141993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek}; 142ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 14382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek/// AllocaRegion - A region that represents an untyped blob of bytes created 14482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek/// by a call to 'alloca'. 14582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekclass AllocaRegion : public SubRegion { 14682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek friend class MemRegionManager; 14782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekprotected: 14882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek unsigned Cnt; // Block counter. Used to distinguish different pieces of 14982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek // memory allocated by alloca at the same call site. 15082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek const Expr* Ex; 15182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 1527ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek AllocaRegion(const Expr* ex, unsigned cnt, const MemRegion *superRegion) 15382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek : SubRegion(superRegion, AllocaRegionKind), Cnt(cnt), Ex(ex) {} 15482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 15582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekpublic: 15682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 15782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek const Expr* getExpr() const { return Ex; } 1589852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu 1599852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu bool isBoundable() const { return true; } 1609852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu 16182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 16282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 16382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Expr* Ex, 1647ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek unsigned Cnt, const MemRegion *superRegion); 16582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 16682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek void print(llvm::raw_ostream& os) const; 16782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 16882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek static bool classof(const MemRegion* R) { 16982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek return R->getKind() == AllocaRegionKind; 17082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek } 17182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek}; 17282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 173993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// TypedRegion - An abstract class representing regions that are typed. 174993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass TypedRegion : public SubRegion { 175993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekprotected: 176993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek TypedRegion(const MemRegion* sReg, Kind k) : SubRegion(sReg, k) {} 177993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 178993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekpublic: 179a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu virtual QualType getValueType(ASTContext &C) const = 0; 1806eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek 181ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu virtual QualType getLocationType(ASTContext& C) const { 1826eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek // FIXME: We can possibly optimize this later to cache this value. 183a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu return C.getPointerType(getValueType(C)); 1846eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek } 18514553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek 186a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu QualType getDesugaredValueType(ASTContext& C) const { 187a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu QualType T = getValueType(C); 1881b9b883a95215e38e153d253a46a2a2fcac25896Ted Kremenek return T.getTypePtr() ? T->getDesugaredType() : T; 18914553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek } 19014553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek 191ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu QualType getDesugaredLocationType(ASTContext& C) const { 192ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu return getLocationType(C)->getDesugaredType(); 19314553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek } 1941b9b883a95215e38e153d253a46a2a2fcac25896Ted Kremenek 195a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek bool isBoundable() const { 196a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek return !getValueType(getContext()).isNull(); 19741168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek } 1986eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek 199993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek static bool classof(const MemRegion* R) { 2009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek unsigned k = R->getKind(); 2019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return k > BEG_TYPED_REGIONS && k < END_TYPED_REGIONS; 2029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 2039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 2049e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 205ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu/// CodeTextRegion - A region that represents code texts of a function. It wraps 206ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu/// two kinds of code texts: real function and symbolic function. Real function 207ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu/// is a function declared in the program. Symbolic function is a function 208ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu/// pointer that we don't know which function it points to. 209ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xuclass CodeTextRegion : public TypedRegion { 210ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xupublic: 211ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu enum CodeKind { Declared, Symbolic }; 212ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 213ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xuprivate: 214ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu // The function pointer kind that this CodeTextRegion represents. 215ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu CodeKind codekind; 216ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 217ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu // Data may be a SymbolRef or FunctionDecl*. 218ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu const void* Data; 219ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 220ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu // Cached function pointer type. 221ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu QualType LocationType; 222ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 223ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xupublic: 224ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 225ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu CodeTextRegion(const FunctionDecl* fd, QualType t, const MemRegion* sreg) 226ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu : TypedRegion(sreg, CodeTextRegionKind), 227ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu codekind(Declared), 228ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu Data(fd), 229ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu LocationType(t) {} 230ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 231ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu CodeTextRegion(SymbolRef sym, QualType t, const MemRegion* sreg) 232ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu : TypedRegion(sreg, CodeTextRegionKind), 233ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu codekind(Symbolic), 234ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu Data(sym), 235ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu LocationType(t) {} 236ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 237a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu QualType getValueType(ASTContext &C) const { 238ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu // Do not get the object type of a CodeTextRegion. 239ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu assert(0); 240ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu return QualType(); 241ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu } 242ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 243ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu QualType getLocationType(ASTContext &C) const { 244ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu return LocationType; 245ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu } 246369f447eded97e6048ced02c0c2be3842f61fc1cZhongxing Xu 247369f447eded97e6048ced02c0c2be3842f61fc1cZhongxing Xu bool isDeclared() const { return codekind == Declared; } 248264e93799c891c03d60cf0b09a032b0a9935d3b5Zhongxing Xu bool isSymbolic() const { return codekind == Symbolic; } 249369f447eded97e6048ced02c0c2be3842f61fc1cZhongxing Xu 250369f447eded97e6048ced02c0c2be3842f61fc1cZhongxing Xu const FunctionDecl* getDecl() const { 251369f447eded97e6048ced02c0c2be3842f61fc1cZhongxing Xu assert(codekind == Declared); 252369f447eded97e6048ced02c0c2be3842f61fc1cZhongxing Xu return static_cast<const FunctionDecl*>(Data); 253369f447eded97e6048ced02c0c2be3842f61fc1cZhongxing Xu } 2548ec3d7dbff9d526fcdce4fbea683830192340c90Ted Kremenek 25572e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek SymbolRef getSymbol() const { 25672e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek assert(codekind == Symbolic); 25772e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek return const_cast<SymbolRef>(static_cast<const SymbolRef>(Data)); 25872e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek } 25972e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek 260a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek bool isBoundable() const { return false; } 26172e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek 26272e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek virtual void print(llvm::raw_ostream& os) const; 263ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 264ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const; 265ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 266ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID& ID, 2670dea5241bca707789d706ed1fda3a29a8fedc4c0Zhongxing Xu const void* data, QualType t, const MemRegion*); 268ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 269ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu static bool classof(const MemRegion* R) { 270ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu return R->getKind() == CodeTextRegionKind; 271ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu } 272ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu}; 273ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 274026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// SymbolicRegion - A special, "non-concrete" region. Unlike other region 275026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// clases, SymbolicRegion represents a region that serves as an alias for 276026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// either a real region, a NULL pointer, etc. It essentially is used to 277026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// map the concept of symbolic values into the domain of regions. Symbolic 278026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// regions do not need to be typed. 279e8e86482da4c1872673bbb9c237649229d19793bTed Kremenekclass SymbolicRegion : public SubRegion { 280026c66395b88a09437319139a43b090093f7e1ddZhongxing Xuprotected: 281026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu const SymbolRef sym; 282026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 283026c66395b88a09437319139a43b090093f7e1ddZhongxing Xupublic: 284e0e4ebf6bfca5a71b2344d8a1b748b852509279cTed Kremenek SymbolicRegion(const SymbolRef s, const MemRegion* sreg) 285e8e86482da4c1872673bbb9c237649229d19793bTed Kremenek : SubRegion(sreg, SymbolicRegionKind), sym(s) {} 286026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 287026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu SymbolRef getSymbol() const { 288026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu return sym; 289026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu } 290026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 2919852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu bool isBoundable() const { return true; } 2929852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu 293026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const; 294026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 295250101353b711a409b075f1bc11070dddec7100bTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, 296250101353b711a409b075f1bc11070dddec7100bTed Kremenek SymbolRef sym, 297250101353b711a409b075f1bc11070dddec7100bTed Kremenek const MemRegion* superRegion); 298026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 299026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu void print(llvm::raw_ostream& os) const; 300026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 301026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu static bool classof(const MemRegion* R) { 302026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu return R->getKind() == SymbolicRegionKind; 303026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu } 304026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu}; 305026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 306e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu/// StringRegion - Region associated with a StringLiteral. 307e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuclass StringRegion : public TypedRegion { 308e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu friend class MemRegionManager; 309e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const StringLiteral* Str; 310e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuprotected: 311e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 312250101353b711a409b075f1bc11070dddec7100bTed Kremenek StringRegion(const StringLiteral* str, const MemRegion* sreg) 313e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu : TypedRegion(sreg, StringRegionKind), Str(str) {} 314e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 315e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID& ID, 316e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const StringLiteral* Str, 317e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const MemRegion* superRegion); 318e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 319e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xupublic: 3206613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu 3216613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu const StringLiteral* getStringLiteral() const { return Str; } 3226eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek 323a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu QualType getValueType(ASTContext& C) const { 324ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu return Str->getType(); 325ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu } 326e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 3270a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu bool isBoundable() const { return false; } 3280a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu 329e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const { 330e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu ProfileRegion(ID, Str, superRegion); 331e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 332e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 333cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu void print(llvm::raw_ostream& os) const; 334cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu 335e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static bool classof(const MemRegion* R) { 336e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu return R->getKind() == StringRegionKind; 337e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 338e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu}; 339e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 3400312c0e09c9de480d78607972ac64a88f4e94a33Ted Kremenekclass TypedViewRegion : public TypedRegion { 341dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu friend class MemRegionManager; 342b2dea734527ae75281642a1c6ace28f9e00cab11Ted Kremenek QualType LValueType; 343dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 344b2dea734527ae75281642a1c6ace28f9e00cab11Ted Kremenek TypedViewRegion(QualType lvalueType, const MemRegion* sreg) 345b2dea734527ae75281642a1c6ace28f9e00cab11Ted Kremenek : TypedRegion(sreg, TypedViewRegionKind), LValueType(lvalueType) {} 346dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 347dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID& ID, QualType T, 348dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu const MemRegion* superRegion); 349dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 350dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xupublic: 351dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 352500d2ee83d407106d80920fb4325fa2e06fa61a5Ted Kremenek void print(llvm::raw_ostream& os) const; 353500d2ee83d407106d80920fb4325fa2e06fa61a5Ted Kremenek 354ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu QualType getLocationType(ASTContext&) const { 355e6fbdf538bc50122876639e08a1401e2bc9555baTed Kremenek return LValueType; 356e6fbdf538bc50122876639e08a1401e2bc9555baTed Kremenek } 357e6fbdf538bc50122876639e08a1401e2bc9555baTed Kremenek 358a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu QualType getValueType(ASTContext&) const { 359b2dea734527ae75281642a1c6ace28f9e00cab11Ted Kremenek const PointerType* PTy = LValueType->getAsPointerType(); 3602e3f73b963b5831d6230f69e157b0964b11eff91Zhongxing Xu assert(PTy); 3612e3f73b963b5831d6230f69e157b0964b11eff91Zhongxing Xu return PTy->getPointeeType(); 362dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu } 363b2dea734527ae75281642a1c6ace28f9e00cab11Ted Kremenek 364a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek bool isBoundable() const { 365b2dea734527ae75281642a1c6ace28f9e00cab11Ted Kremenek return isa<PointerType>(LValueType); 366b2dea734527ae75281642a1c6ace28f9e00cab11Ted Kremenek } 367dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 368dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const { 369b2dea734527ae75281642a1c6ace28f9e00cab11Ted Kremenek ProfileRegion(ID, LValueType, superRegion); 370dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu } 371dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 372dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu static bool classof(const MemRegion* R) { 3730312c0e09c9de480d78607972ac64a88f4e94a33Ted Kremenek return R->getKind() == TypedViewRegionKind; 374dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu } 3751670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek 3761670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek const MemRegion *removeViews() const; 377dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu}; 3786eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek 379178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 380329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// CompoundLiteralRegion - A memory region representing a compound literal. 381329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// Compound literals are essentially temporaries that are stack allocated 382329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// or in the global constant pool. 38377cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xuclass CompoundLiteralRegion : public TypedRegion { 384329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekprivate: 385329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek friend class MemRegionManager; 386329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek const CompoundLiteralExpr* CL; 387329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 388329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek CompoundLiteralRegion(const CompoundLiteralExpr* cl, const MemRegion* sReg) 38977cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu : TypedRegion(sReg, CompoundLiteralRegionKind), CL(cl) {} 390329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 391329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, 392329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek const CompoundLiteralExpr* CL, 393329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek const MemRegion* superRegion); 394329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekpublic: 395a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu QualType getValueType(ASTContext& C) const { 39677cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu return C.getCanonicalType(CL->getType()); 39777cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu } 3980a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu 3999a08fee80a34938b8c11c7166e009a89ced4c2b4Zhongxing Xu bool isBoundable() const { return !CL->isFileScope(); } 4009a08fee80a34938b8c11c7166e009a89ced4c2b4Zhongxing Xu 401329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 402329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 403329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek void print(llvm::raw_ostream& os) const; 404329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 40511a83dc7a9a5738cc0bc76180b508eae896eefa9Ted Kremenek const CompoundLiteralExpr* getLiteralExpr() const { return CL; } 40611a83dc7a9a5738cc0bc76180b508eae896eefa9Ted Kremenek 407329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek static bool classof(const MemRegion* R) { 408329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek return R->getKind() == CompoundLiteralRegionKind; 409329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek } 410329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek}; 411178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 4129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass DeclRegion : public TypedRegion { 4139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 4149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const Decl* D; 4159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 416993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek DeclRegion(const Decl* d, const MemRegion* sReg, Kind k) 4179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : TypedRegion(sReg, k), D(d) {} 4189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl* D, 4209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion, Kind k); 4219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 422bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xupublic: 423bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xu const Decl* getDecl() const { return D; } 4249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 4256eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek 426e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static bool classof(const MemRegion* R) { 427e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu unsigned k = R->getKind(); 428e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu return k > BEG_DECL_REGIONS && k < END_DECL_REGIONS; 429e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 4309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 4319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass VarRegion : public DeclRegion { 4339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 4349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 435993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek VarRegion(const VarDecl* vd, const MemRegion* sReg) 4369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(vd, sReg, VarRegionKind) {} 4379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 438250101353b711a409b075f1bc11070dddec7100bTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const VarDecl* VD, 4396304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek const MemRegion* superRegion) { 4409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, VD, superRegion, VarRegionKind); 4419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 4429e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 4446eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek const VarDecl* getDecl() const { return cast<VarDecl>(D); } 4459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 446a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu QualType getValueType(ASTContext& C) const { 4476eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek // FIXME: We can cache this if needed. 4486eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek return C.getCanonicalType(getDecl()->getType()); 4496eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek } 4506eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek 4519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek void print(llvm::raw_ostream& os) const; 4529e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 4549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == VarRegionKind; 4559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 4569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 4579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass FieldRegion : public DeclRegion { 4599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 4609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 461993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek FieldRegion(const FieldDecl* fd, const MemRegion* sReg) 4629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(fd, sReg, FieldRegionKind) {} 4639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4644bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenekpublic: 4654bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek 4664bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek void print(llvm::raw_ostream& os) const; 4674bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek 4684bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek const FieldDecl* getDecl() const { return cast<FieldDecl>(D); } 4696eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek 470a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu QualType getValueType(ASTContext& C) const { 4716eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek // FIXME: We can cache this if needed. 472e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu return C.getCanonicalType(getDecl()->getType()); 4736eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek } 4744bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek 4756304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const FieldDecl* FD, 4766304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek const MemRegion* superRegion) { 4779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, FD, superRegion, FieldRegionKind); 4789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 4799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 4819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == FieldRegionKind; 4829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 4839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 4849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 485a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenekclass ObjCObjectRegion : public DeclRegion { 486a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 487a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek friend class MemRegionManager; 488a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 489a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek ObjCObjectRegion(const ObjCInterfaceDecl* ivd, const MemRegion* sReg) 490a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek : DeclRegion(ivd, sReg, ObjCObjectRegionKind) {} 491a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 4926304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, 4936304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek const ObjCInterfaceDecl* ivd, 494a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek const MemRegion* superRegion) { 495a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCObjectRegionKind); 496a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek } 497a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 498a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenekpublic: 499a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek const ObjCInterfaceDecl* getInterface() const { 500a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek return cast<ObjCInterfaceDecl>(D); 501a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek } 502a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 503a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu QualType getValueType(ASTContext& C) const { 5043b3a45858c6b2a45114e91902c3bf3c4b7f5f302Daniel Dunbar return C.getObjCInterfaceType(getInterface()); 505a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek } 506a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 507a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek static bool classof(const MemRegion* R) { 508a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek return R->getKind() == ObjCObjectRegionKind; 509a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek } 510a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek}; 511a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 5129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass ObjCIvarRegion : public DeclRegion { 5139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 5149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 5159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 516993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek ObjCIvarRegion(const ObjCIvarDecl* ivd, const MemRegion* sReg) 5179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(ivd, sReg, ObjCIvarRegionKind) {} 5189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 5196304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const ObjCIvarDecl* ivd, 5206304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek const MemRegion* superRegion) { 5219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCIvarRegionKind); 5229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 5239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 5249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 5259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const ObjCIvarDecl* getDecl() const { return cast<ObjCIvarDecl>(D); } 526a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu QualType getValueType(ASTContext&) const { return getDecl()->getType(); } 5279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 5289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 5299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == ObjCIvarRegionKind; 5309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 5319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 532511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 53327b57063d83b00474d7563fb5d608544e2364862Zhongxing Xuclass ElementRegion : public TypedRegion { 534511191ce8920160525611be2be754c32a0724c3eZhongxing Xu friend class MemRegionManager; 535511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 536f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek QualType ElementType; 537511191ce8920160525611be2be754c32a0724c3eZhongxing Xu SVal Index; 538511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 539f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek ElementRegion(QualType elementType, SVal Idx, const MemRegion* sReg) 540f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek : TypedRegion(sReg, ElementRegionKind), 541f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek ElementType(elementType), Index(Idx) { 5423d8173c1c68f451c7492f92023d829c626845925Chris Lattner assert((!isa<nonloc::ConcreteInt>(&Idx) || 5433d8173c1c68f451c7492f92023d829c626845925Chris Lattner cast<nonloc::ConcreteInt>(&Idx)->getValue().isSigned()) && 54443b28d07019bc78447ecbbb721526de4ffd83f20Chris Lattner "The index must be signed"); 5450395b5d4987fe5baa818015e9d294c128619e4ecZhongxing Xu } 546abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek 547f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, QualType elementType, 548f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek SVal Idx, const MemRegion* superRegion); 549511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 550511191ce8920160525611be2be754c32a0724c3eZhongxing Xupublic: 551511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 5526e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu SVal getIndex() const { return Index; } 5536e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu 554a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu QualType getValueType(ASTContext&) const { 555f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek return ElementType; 556f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek } 557f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek 558f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek QualType getElementType() const { 559f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek return ElementType; 560abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek } 561abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek 562b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu void print(llvm::raw_ostream& os) const; 563b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 564511191ce8920160525611be2be754c32a0724c3eZhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const; 565511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 566511191ce8920160525611be2be754c32a0724c3eZhongxing Xu static bool classof(const MemRegion* R) { 567511191ce8920160525611be2be754c32a0724c3eZhongxing Xu return R->getKind() == ElementRegionKind; 568511191ce8920160525611be2be754c32a0724c3eZhongxing Xu } 569511191ce8920160525611be2be754c32a0724c3eZhongxing Xu}; 570ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek 571ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenektemplate<typename RegionTy> 572ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenekconst RegionTy* MemRegion::getAs() const { 573ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek const MemRegion *R = this; 574ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek 575ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek do { 576ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek if (const RegionTy* RT = dyn_cast<RegionTy>(R)) 577ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek return RT; 578ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek 579ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek if (const TypedViewRegion *TR = dyn_cast<TypedViewRegion>(R)) { 580ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek R = TR->getSuperRegion(); 581ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek continue; 582ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek } 583ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek 584ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek break; 585ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek } 586ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek while (R); 587ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek 588ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek return 0; 589ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek} 590511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 5919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 5929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager - Factory object for creating regions. 5939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 5949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 5959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager { 596a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek ASTContext &C; 5979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek llvm::BumpPtrAllocator& A; 5989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek llvm::FoldingSet<MemRegion> Regions; 5999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 600d05552a21377f493c882298c59e8829040b01d34Ted Kremenek MemSpaceRegion *globals; 601d05552a21377f493c882298c59e8829040b01d34Ted Kremenek MemSpaceRegion *stack; 602d05552a21377f493c882298c59e8829040b01d34Ted Kremenek MemSpaceRegion *stackArguments; 603d05552a21377f493c882298c59e8829040b01d34Ted Kremenek MemSpaceRegion *heap; 604d05552a21377f493c882298c59e8829040b01d34Ted Kremenek MemSpaceRegion *unknown; 605d05552a21377f493c882298c59e8829040b01d34Ted Kremenek MemSpaceRegion *code; 606dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 6079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 608a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek MemRegionManager(ASTContext &c, llvm::BumpPtrAllocator& a) 609d05552a21377f493c882298c59e8829040b01d34Ted Kremenek : C(c), A(a), globals(0), stack(0), stackArguments(0), heap(0), 610d05552a21377f493c882298c59e8829040b01d34Ted Kremenek unknown(0), code(0) {} 6119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 6129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek ~MemRegionManager() {} 6139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 614a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek ASTContext &getContext() { return C; } 615a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 6169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getStackRegion - Retrieve the memory region associated with the 6179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// current stack frame. 618d05552a21377f493c882298c59e8829040b01d34Ted Kremenek MemSpaceRegion *getStackRegion(); 619d05552a21377f493c882298c59e8829040b01d34Ted Kremenek 620d05552a21377f493c882298c59e8829040b01d34Ted Kremenek /// getStackArgumentsRegion - Retrieve the memory region associated with 621d05552a21377f493c882298c59e8829040b01d34Ted Kremenek /// function/method arguments of the current stack frame. 622d05552a21377f493c882298c59e8829040b01d34Ted Kremenek MemSpaceRegion *getStackArgumentsRegion(); 6239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 6249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getGlobalsRegion - Retrieve the memory region associated with 6259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// all global variables. 626d05552a21377f493c882298c59e8829040b01d34Ted Kremenek MemSpaceRegion *getGlobalsRegion(); 6279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 6289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getHeapRegion - Retrieve the memory region associated with the 6299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// generic "heap". 630d05552a21377f493c882298c59e8829040b01d34Ted Kremenek MemSpaceRegion *getHeapRegion(); 631178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 632178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu /// getUnknownRegion - Retrieve the memory region associated with unknown 633178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu /// memory space. 634d05552a21377f493c882298c59e8829040b01d34Ted Kremenek MemSpaceRegion *getUnknownRegion(); 635c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu 636d05552a21377f493c882298c59e8829040b01d34Ted Kremenek MemSpaceRegion *getCodeRegion(); 637ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 6387090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek /// getAllocaRegion - Retrieve a region associated with a call to alloca(). 639d05552a21377f493c882298c59e8829040b01d34Ted Kremenek AllocaRegion *getAllocaRegion(const Expr* Ex, unsigned Cnt); 6407090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek 641329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek /// getCompoundLiteralRegion - Retrieve the region associated with a 642329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek /// given CompoundLiteral. 643329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek CompoundLiteralRegion* 644329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek getCompoundLiteralRegion(const CompoundLiteralExpr* CL); 645329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 646993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek /// getSymbolicRegion - Retrieve or create a "symbolic" memory region. 647e0e4ebf6bfca5a71b2344d8a1b748b852509279cTed Kremenek SymbolicRegion* getSymbolicRegion(SymbolRef sym); 648e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 649e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu StringRegion* getStringRegion(const StringLiteral* Str); 650e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 6519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getVarRegion - Retrieve or create the memory region associated with 6529a1f03afc569abbdcc182379c99d1fe1ece67c9dTed Kremenek /// a specified VarDecl. 6539a1f03afc569abbdcc182379c99d1fe1ece67c9dTed Kremenek VarRegion* getVarRegion(const VarDecl* vd); 654329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 655f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek /// getElementRegion - Retrieve the memory region associated with the 656f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek /// associated element type, index, and super region. 657f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek ElementRegion* getElementRegion(QualType elementType, SVal Idx, 658143b2fc6fd3945c250b333383749010c2c8e3a4cZhongxing Xu const MemRegion* superRegion,ASTContext &Ctx); 659511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 6609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getFieldRegion - Retrieve or create the memory region associated with 6619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a specified FieldDecl. 'superRegion' corresponds to the containing 6629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// memory region (which typically represents the memory representing 6639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a structure or class). 664abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek FieldRegion* getFieldRegion(const FieldDecl* fd, 665abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek const MemRegion* superRegion); 6669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 667a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek /// getObjCObjectRegion - Retrieve or create the memory region associated with 668a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek /// the instance of a specified Objective-C class. 669a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek ObjCObjectRegion* getObjCObjectRegion(const ObjCInterfaceDecl* ID, 670a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek const MemRegion* superRegion); 671a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 6729e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getObjCIvarRegion - Retrieve or create the memory region associated with 6739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a specified Objective-c instance variable. 'superRegion' corresponds 6749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// to the containing region (which typically represents the Objective-C 6759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// object). 6769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek ObjCIvarRegion* getObjCIvarRegion(const ObjCIvarDecl* ivd, 677993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek const MemRegion* superRegion); 678178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 679b2dea734527ae75281642a1c6ace28f9e00cab11Ted Kremenek TypedViewRegion* getTypedViewRegion(QualType LValueType, 680b2dea734527ae75281642a1c6ace28f9e00cab11Ted Kremenek const MemRegion* superRegion); 681dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 682ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu CodeTextRegion* getCodeTextRegion(SymbolRef sym, QualType t); 683ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu CodeTextRegion* getCodeTextRegion(const FunctionDecl* fd, QualType t); 684250101353b711a409b075f1bc11070dddec7100bTed Kremenek 685250101353b711a409b075f1bc11070dddec7100bTed Kremenek template <typename RegionTy, typename A1> 686250101353b711a409b075f1bc11070dddec7100bTed Kremenek RegionTy* getRegion(const A1 a1); 6876304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek 6886304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek template <typename RegionTy, typename A1> 689eeea45611d45238c34474c183cee96d47ae79e24Ted Kremenek RegionTy* getSubRegion(const A1 a1, const MemRegion* superRegion); 6907ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek 6917ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek template <typename RegionTy, typename A1, typename A2> 6927ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek RegionTy* getRegion(const A1 a1, const A2 a2); 693dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 694dd198f04897df87c52fef66398035cbf67fdc33dZhongxing Xu bool isGlobalsRegion(const MemRegion* R) { 695dd198f04897df87c52fef66398035cbf67fdc33dZhongxing Xu assert(R); 696dd198f04897df87c52fef66398035cbf67fdc33dZhongxing Xu return R == globals; 697dd198f04897df87c52fef66398035cbf67fdc33dZhongxing Xu } 698dd198f04897df87c52fef66398035cbf67fdc33dZhongxing Xu 6999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate: 7009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* LazyAllocate(MemSpaceRegion*& region); 701ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek}; 702250101353b711a409b075f1bc11070dddec7100bTed Kremenek 703250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 704a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek// Out-of-line member definitions. 705250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 706250101353b711a409b075f1bc11070dddec7100bTed Kremenek 707a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenekinline ASTContext& MemRegion::getContext() const { 708a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek return getMemRegionManager()->getContext(); 709a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek} 710a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 711250101353b711a409b075f1bc11070dddec7100bTed Kremenektemplate<typename RegionTy> struct MemRegionManagerTrait; 712250101353b711a409b075f1bc11070dddec7100bTed Kremenek 713250101353b711a409b075f1bc11070dddec7100bTed Kremenektemplate <typename RegionTy, typename A1> 714250101353b711a409b075f1bc11070dddec7100bTed KremenekRegionTy* MemRegionManager::getRegion(const A1 a1) { 715250101353b711a409b075f1bc11070dddec7100bTed Kremenek 716250101353b711a409b075f1bc11070dddec7100bTed Kremenek const typename MemRegionManagerTrait<RegionTy>::SuperRegionTy *superRegion = 717250101353b711a409b075f1bc11070dddec7100bTed Kremenek MemRegionManagerTrait<RegionTy>::getSuperRegion(*this, a1); 718250101353b711a409b075f1bc11070dddec7100bTed Kremenek 719250101353b711a409b075f1bc11070dddec7100bTed Kremenek llvm::FoldingSetNodeID ID; 720250101353b711a409b075f1bc11070dddec7100bTed Kremenek RegionTy::ProfileRegion(ID, a1, superRegion); 721250101353b711a409b075f1bc11070dddec7100bTed Kremenek void* InsertPos; 722250101353b711a409b075f1bc11070dddec7100bTed Kremenek RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID, 723250101353b711a409b075f1bc11070dddec7100bTed Kremenek InsertPos)); 724250101353b711a409b075f1bc11070dddec7100bTed Kremenek 725250101353b711a409b075f1bc11070dddec7100bTed Kremenek if (!R) { 7266304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek R = (RegionTy*) A.Allocate<RegionTy>(); 7276304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek new (R) RegionTy(a1, superRegion); 7286304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek Regions.InsertNode(R, InsertPos); 7296304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek } 7306304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek 7316304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek return R; 7326304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek} 7336304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek 7346304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenektemplate <typename RegionTy, typename A1> 735eeea45611d45238c34474c183cee96d47ae79e24Ted KremenekRegionTy* MemRegionManager::getSubRegion(const A1 a1, 736eeea45611d45238c34474c183cee96d47ae79e24Ted Kremenek const MemRegion *superRegion) { 7376304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek llvm::FoldingSetNodeID ID; 7386304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek RegionTy::ProfileRegion(ID, a1, superRegion); 7396304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek void* InsertPos; 7406304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID, 7416304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek InsertPos)); 7426304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek 7436304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek if (!R) { 744250101353b711a409b075f1bc11070dddec7100bTed Kremenek R = (RegionTy*) A.Allocate<RegionTy>(); 745250101353b711a409b075f1bc11070dddec7100bTed Kremenek new (R) RegionTy(a1, superRegion); 746250101353b711a409b075f1bc11070dddec7100bTed Kremenek Regions.InsertNode(R, InsertPos); 747250101353b711a409b075f1bc11070dddec7100bTed Kremenek } 748250101353b711a409b075f1bc11070dddec7100bTed Kremenek 749250101353b711a409b075f1bc11070dddec7100bTed Kremenek return R; 750250101353b711a409b075f1bc11070dddec7100bTed Kremenek} 751250101353b711a409b075f1bc11070dddec7100bTed Kremenek 7527ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenektemplate <typename RegionTy, typename A1, typename A2> 7537ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed KremenekRegionTy* MemRegionManager::getRegion(const A1 a1, const A2 a2) { 7547ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek 7557ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek const typename MemRegionManagerTrait<RegionTy>::SuperRegionTy *superRegion = 7567ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek MemRegionManagerTrait<RegionTy>::getSuperRegion(*this, a1, a2); 7577ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek 7587ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek llvm::FoldingSetNodeID ID; 7597ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek RegionTy::ProfileRegion(ID, a1, a2, superRegion); 7607ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek void* InsertPos; 7617ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID, 7627ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek InsertPos)); 7637ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek 7647ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek if (!R) { 7657ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek R = (RegionTy*) A.Allocate<RegionTy>(); 7667ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek new (R) RegionTy(a1, a2, superRegion); 7677ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek Regions.InsertNode(R, InsertPos); 7687ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek } 7697ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek 7707ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek return R; 7717ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek} 7727ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek 773250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 774250101353b711a409b075f1bc11070dddec7100bTed Kremenek// Traits for constructing regions. 775250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 776250101353b711a409b075f1bc11070dddec7100bTed Kremenek 7777ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenektemplate <> struct MemRegionManagerTrait<AllocaRegion> { 7787ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek typedef MemRegion SuperRegionTy; 7797ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek static const SuperRegionTy* getSuperRegion(MemRegionManager& MRMgr, 7807ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek const Expr *, unsigned) { 7817ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek return MRMgr.getStackRegion(); 7827ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek } 7837ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek}; 7847ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek 785250101353b711a409b075f1bc11070dddec7100bTed Kremenektemplate <> struct MemRegionManagerTrait<CompoundLiteralRegion> { 786250101353b711a409b075f1bc11070dddec7100bTed Kremenek typedef MemRegion SuperRegionTy; 787250101353b711a409b075f1bc11070dddec7100bTed Kremenek static const SuperRegionTy* getSuperRegion(MemRegionManager& MRMgr, 788250101353b711a409b075f1bc11070dddec7100bTed Kremenek const CompoundLiteralExpr *CL) { 789250101353b711a409b075f1bc11070dddec7100bTed Kremenek 790250101353b711a409b075f1bc11070dddec7100bTed Kremenek return CL->isFileScope() ? MRMgr.getGlobalsRegion() 791250101353b711a409b075f1bc11070dddec7100bTed Kremenek : MRMgr.getStackRegion(); 792250101353b711a409b075f1bc11070dddec7100bTed Kremenek } 793250101353b711a409b075f1bc11070dddec7100bTed Kremenek}; 794250101353b711a409b075f1bc11070dddec7100bTed Kremenek 795250101353b711a409b075f1bc11070dddec7100bTed Kremenektemplate <> struct MemRegionManagerTrait<StringRegion> { 796250101353b711a409b075f1bc11070dddec7100bTed Kremenek typedef MemSpaceRegion SuperRegionTy; 797250101353b711a409b075f1bc11070dddec7100bTed Kremenek static const SuperRegionTy* getSuperRegion(MemRegionManager& MRMgr, 798250101353b711a409b075f1bc11070dddec7100bTed Kremenek const StringLiteral*) { 799250101353b711a409b075f1bc11070dddec7100bTed Kremenek return MRMgr.getGlobalsRegion(); 800250101353b711a409b075f1bc11070dddec7100bTed Kremenek } 801250101353b711a409b075f1bc11070dddec7100bTed Kremenek}; 802250101353b711a409b075f1bc11070dddec7100bTed Kremenek 803250101353b711a409b075f1bc11070dddec7100bTed Kremenektemplate <> struct MemRegionManagerTrait<VarRegion> { 804250101353b711a409b075f1bc11070dddec7100bTed Kremenek typedef MemRegion SuperRegionTy; 805250101353b711a409b075f1bc11070dddec7100bTed Kremenek static const SuperRegionTy* getSuperRegion(MemRegionManager& MRMgr, 806250101353b711a409b075f1bc11070dddec7100bTed Kremenek const VarDecl *d) { 807d05552a21377f493c882298c59e8829040b01d34Ted Kremenek if (d->hasLocalStorage()) { 808d05552a21377f493c882298c59e8829040b01d34Ted Kremenek return isa<ParmVarDecl>(d) || isa<ImplicitParamDecl>(d) 809d05552a21377f493c882298c59e8829040b01d34Ted Kremenek ? MRMgr.getStackArgumentsRegion() : MRMgr.getStackRegion(); 810d05552a21377f493c882298c59e8829040b01d34Ted Kremenek } 811d05552a21377f493c882298c59e8829040b01d34Ted Kremenek 812d05552a21377f493c882298c59e8829040b01d34Ted Kremenek return MRMgr.getGlobalsRegion(); 813250101353b711a409b075f1bc11070dddec7100bTed Kremenek } 814250101353b711a409b075f1bc11070dddec7100bTed Kremenek}; 815250101353b711a409b075f1bc11070dddec7100bTed Kremenek 816250101353b711a409b075f1bc11070dddec7100bTed Kremenektemplate <> struct MemRegionManagerTrait<SymbolicRegion> { 817250101353b711a409b075f1bc11070dddec7100bTed Kremenek typedef MemRegion SuperRegionTy; 818250101353b711a409b075f1bc11070dddec7100bTed Kremenek static const SuperRegionTy* getSuperRegion(MemRegionManager& MRMgr, 819250101353b711a409b075f1bc11070dddec7100bTed Kremenek SymbolRef) { 820250101353b711a409b075f1bc11070dddec7100bTed Kremenek return MRMgr.getUnknownRegion(); 821250101353b711a409b075f1bc11070dddec7100bTed Kremenek } 822250101353b711a409b075f1bc11070dddec7100bTed Kremenek}; 8230dea5241bca707789d706ed1fda3a29a8fedc4c0Zhongxing Xu 8240dea5241bca707789d706ed1fda3a29a8fedc4c0Zhongxing Xutemplate<> struct MemRegionManagerTrait<CodeTextRegion> { 8250dea5241bca707789d706ed1fda3a29a8fedc4c0Zhongxing Xu typedef MemSpaceRegion SuperRegionTy; 8260dea5241bca707789d706ed1fda3a29a8fedc4c0Zhongxing Xu static const SuperRegionTy* getSuperRegion(MemRegionManager& MRMgr, 8270dea5241bca707789d706ed1fda3a29a8fedc4c0Zhongxing Xu const FunctionDecl*, QualType) { 8280dea5241bca707789d706ed1fda3a29a8fedc4c0Zhongxing Xu return MRMgr.getCodeRegion(); 8290dea5241bca707789d706ed1fda3a29a8fedc4c0Zhongxing Xu } 8300dea5241bca707789d706ed1fda3a29a8fedc4c0Zhongxing Xu static const SuperRegionTy* getSuperRegion(MemRegionManager& MRMgr, 8310dea5241bca707789d706ed1fda3a29a8fedc4c0Zhongxing Xu SymbolRef, QualType) { 8320dea5241bca707789d706ed1fda3a29a8fedc4c0Zhongxing Xu return MRMgr.getCodeRegion(); 8330dea5241bca707789d706ed1fda3a29a8fedc4c0Zhongxing Xu } 8340dea5241bca707789d706ed1fda3a29a8fedc4c0Zhongxing Xu}; 835250101353b711a409b075f1bc11070dddec7100bTed Kremenek 836be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end clang namespace 8379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 838250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 839250101353b711a409b075f1bc11070dddec7100bTed Kremenek// Pretty-printing regions. 840250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 841250101353b711a409b075f1bc11070dddec7100bTed Kremenek 842be91224894e1501133e224934285ba6440bf5b59Ted Kremeneknamespace llvm { 843be91224894e1501133e224934285ba6440bf5b59Ted Kremenekstatic inline raw_ostream& operator<<(raw_ostream& O, 844be91224894e1501133e224934285ba6440bf5b59Ted Kremenek const clang::MemRegion* R) { 845be91224894e1501133e224934285ba6440bf5b59Ted Kremenek R->print(O); 846be91224894e1501133e224934285ba6440bf5b59Ted Kremenek return O; 847be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} 848be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end llvm namespace 8499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 8509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#endif 851