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 16176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#ifndef LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_MEMREGION_H 17176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#define LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_MEMREGION_H 189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 19478851c3ed6bd784e7377dffd8e57b200c1b9ba9Benjamin Kramer#include "clang/AST/ASTContext.h" 209ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck#include "clang/AST/CharUnits.h" 21993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek#include "clang/AST/Decl.h" 224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "clang/AST/DeclCXX.h" 234c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek#include "clang/AST/ExprObjC.h" 244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "clang/Analysis/AnalysisContext.h" 25d47d3b0cfeb7e8564ff77f48130fe63282b6d127Chris Lattner#include "clang/Basic/LLVM.h" 269b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenek#include "clang/StaticAnalyzer/Core/PathSensitive/SVals.h" 279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/ADT/FoldingSet.h" 28651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "llvm/Support/Allocator.h" 2930a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include "llvm/Support/ErrorHandling.h" 309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include <string> 319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremeneknamespace clang { 331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenekclass LocationContext; 3567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackFrameContext; 365a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis 379ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremeneknamespace ento { 385a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis 398ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaksclass CodeTextRegion; 405a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidisclass MemRegionManager; 415a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidisclass MemSpaceRegion; 42c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenekclass SValBuilder; 438ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaksclass SymbolicRegion; 444240096011a187807058f887eb81df750ffa17feTed Kremenekclass VarRegion; 451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 46e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu/// Represent a region's offset within the top level base region. 47e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xuclass RegionOffset { 48e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu /// The base region. 49e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu const MemRegion *R; 50e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu 5187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// The bit offset within the base region. Can be negative. 52e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu int64_t Offset; 53e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu 54e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xupublic: 555375d82d1d096ddd8879d8e6641a8f042b0d1d43Aaron Ballman // We're using a const instead of an enumeration due to the size required; 565375d82d1d096ddd8879d8e6641a8f042b0d1d43Aaron Ballman // Visual Studio will only create enumerations of size int, not long long. 575375d82d1d096ddd8879d8e6641a8f042b0d1d43Aaron Ballman static const int64_t Symbolic = INT64_MAX; 58824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose 596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines RegionOffset() : R(nullptr) {} 60e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu RegionOffset(const MemRegion *r, int64_t off) : R(r), Offset(off) {} 61e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu 62e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu const MemRegion *getRegion() const { return R; } 63824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose 64824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose bool hasSymbolicOffset() const { return Offset == Symbolic; } 65824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose 66824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose int64_t getOffset() const { 67824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose assert(!hasSymbolicOffset()); 68824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose return Offset; 69824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose } 70e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose 71e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose bool isValid() const { return R; } 72e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu}; 73e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu 7419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===// 7519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// Base region classes. 7619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===// 771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemRegion - The root abstract class for all memory regions. 799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegion : public llvm::FoldingSetNode { 809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 8167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek enum Kind { 824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#define REGION(Id, Parent) Id ## Kind, 834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#define REGION_RANGE(Id, First, Last) BEGIN_##Id = First, END_##Id = Last, 844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "clang/StaticAnalyzer/Core/PathSensitive/Regions.def" 8567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek }; 864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate: 889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const Kind kind; 891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemRegion(Kind k) : kind(k) {} 929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek virtual ~MemRegion(); 939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 95a6275a534da701f37d19a068e6361e5f10f983a1Ted Kremenek ASTContext &getContext() const; 961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek virtual void Profile(llvm::FoldingSetNodeID& ID) const = 0; 98a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 99a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek virtual MemRegionManager* getMemRegionManager() const = 0; 100a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 101bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek const MemSpaceRegion *getMemorySpace() const; 1021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 103adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu const MemRegion *getBaseRegion() const; 104adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu 105522fc21f3adc647817edc8017e6928a64c96899bAnna Zaks /// Check if the region is a subregion of the given region. 1065f7c0add1ea1d8e1d2f920d77fd1a7b6160c2d93Anna Zaks virtual bool isSubRegionOf(const MemRegion *R) const; 107522fc21f3adc647817edc8017e6928a64c96899bAnna Zaks 108b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose const MemRegion *StripCasts(bool StripBaseCasts = true) const; 1091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1108ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks /// \brief If this is a symbolic region, returns the region. Otherwise, 1118ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks /// goes up the base chain looking for the first symbolic base region. 1128ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks const SymbolicRegion *getSymbolicBase() const; 1138ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks 1141508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek bool hasGlobalsOrParametersStorage() const; 1151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 116de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek bool hasStackStorage() const; 117de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 118de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek bool hasStackNonParametersStorage() const; 119de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 120de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek bool hasStackParametersStorage() const; 121b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 122e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu /// Compute the offset within the top level memory object. 123e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu RegionOffset getAsOffset() const; 124e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu 1253d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks /// \brief Get a string representation of a region for debug use. 1263d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks std::string getString() const; 1273d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks 1289c378f705405d37f49795d5e915989de774fe11fTed Kremenek virtual void dumpToStream(raw_ostream &os) const; 1297f39d29cb69e7488f994870800d548008e50e1cbTed Kremenek 1308800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek void dump() const; 1311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 132919e8a1c6698bfa6848571d366430126bced727dJordan Rose /// \brief Returns true if this region can be printed in a user-friendly way. 133919e8a1c6698bfa6848571d366430126bced727dJordan Rose virtual bool canPrintPretty() const; 134919e8a1c6698bfa6848571d366430126bced727dJordan Rose 1353d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks /// \brief Print the region for use in diagnostics. 136919e8a1c6698bfa6848571d366430126bced727dJordan Rose virtual void printPretty(raw_ostream &os) const; 1373d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks 13879d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks /// \brief Returns true if this region's textual representation can be used 13979d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks /// as part of a larger expression. 14079d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks virtual bool canPrintPrettyAsExpr() const; 14179d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks 14279d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks /// \brief Print the region as expression. 14379d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks /// 14479d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks /// When this region represents a subexpression, the method is for printing 14579d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks /// an expression containing it. 14679d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks virtual void printPrettyAsExpr(raw_ostream &os) const; 1479e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks 1481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Kind getKind() const { return kind; } 1491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 150ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek template<typename RegionTy> const RegionTy* getAs() const; 1511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 152f0f0605c87739c906861f73d4287798a4969b1e0Zhongxing Xu virtual bool isBoundable() const { return false; } 1534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// Get descriptive name for memory region. The name is obtained from 1564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// the variable/field declaration retrieved from the memory region. 1574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// Regions that point to an element of an array are returned as: "arr[0]". 1584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// Regions that point to a struct are returned as: "st.var". 1594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // 1604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// \param UseQuotes Set if the name should be quoted. 1614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// 1624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// \returns variable name for memory region 1634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar std::string getDescriptiveName(bool UseQuotes = true) const; 1644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// Retrieve source range from memory region. The range retrieval 1674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// is based on the decl obtained from the memory region. 1684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// For a VarRegion the range of the base region is returned. 1694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// For a FieldRegion the range of the field is returned. 1704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// If no declaration is found, an empty source range is returned. 1714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// The client is responsible for checking if the returned range is valid. 1724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// 1734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// \returns source range for declaration retrieved from memory region 1744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar clang::SourceRange sourceRange() const; 1759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 1761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 177eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// MemSpaceRegion - A memory region that represents a "memory space"; 1789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// for example, the set of global variables, the stack frame, etc. 1799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemSpaceRegion : public MemRegion { 180a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenekprotected: 181a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek MemRegionManager *Mgr; 182a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 1834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar MemSpaceRegion(MemRegionManager *mgr, Kind k) : MemRegion(k), Mgr(mgr) { 18467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek assert(classof(this)); 18567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 18667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 187651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines MemRegionManager* getMemRegionManager() const override { return Mgr; } 1881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 18967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 190651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool isBoundable() const override { return false; } 191651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 192651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void Profile(llvm::FoldingSetNodeID &ID) const override; 19367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 19467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 19567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek Kind k = R->getKind(); 1964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return k >= BEGIN_MEMSPACES && k <= END_MEMSPACES; 197a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek } 19867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 1994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 2004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// CodeSpaceRegion - The memory space that holds the executable code of 2014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// functions and blocks. 2024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass CodeSpaceRegion : public MemSpaceRegion { 2034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar friend class MemRegionManager; 2044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 2054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CodeSpaceRegion(MemRegionManager *mgr) 2064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : MemSpaceRegion(mgr, CodeSpaceRegionKind) {} 2074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 2084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarpublic: 2094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar void dumpToStream(raw_ostream &os) const override; 2104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 2114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar static bool classof(const MemRegion *R) { 2124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return R->getKind() == CodeSpaceRegionKind; 2134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 2144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}; 2154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 21667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass GlobalsSpaceRegion : public MemSpaceRegion { 21799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 218dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekprotected: 219dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek GlobalsSpaceRegion(MemRegionManager *mgr, Kind k) 220dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek : MemSpaceRegion(mgr, k) {} 221dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekpublic: 222dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek static bool classof(const MemRegion *R) { 223dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek Kind k = R->getKind(); 2244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return k >= BEGIN_GLOBAL_MEMSPACES && k <= END_GLOBAL_MEMSPACES; 225dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek } 226dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek}; 227eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 228914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region of the static variables within the current CodeTextRegion 229eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// scope. 230914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// 231eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// Currently, only the static locals are placed there, so we know that these 232eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// variables do not get invalidated by calls to other functions. 233dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekclass StaticGlobalSpaceRegion : public GlobalsSpaceRegion { 23467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 235a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 236dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek const CodeTextRegion *CR; 237dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 238dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek StaticGlobalSpaceRegion(MemRegionManager *mgr, const CodeTextRegion *cr) 239dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek : GlobalsSpaceRegion(mgr, StaticGlobalSpaceRegionKind), CR(cr) {} 240dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 241dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekpublic: 242651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void Profile(llvm::FoldingSetNodeID &ID) const override; 243651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 244651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void dumpToStream(raw_ostream &os) const override; 245fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek 246dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek const CodeTextRegion *getCodeRegion() const { return CR; } 247dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 248dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek static bool classof(const MemRegion *R) { 249dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek return R->getKind() == StaticGlobalSpaceRegionKind; 250dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek } 251dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek}; 252eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 253914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region for all the non-static global variables. 254eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// 255eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// This class is further split into subclasses for efficient implementation of 256eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// invalidating a set of related global values as is done in 257eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// RegionStoreManager::invalidateRegions (instead of finding all the dependent 258eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// globals, we invalidate the whole parent region). 259dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekclass NonStaticGlobalSpaceRegion : public GlobalsSpaceRegion { 260eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksprotected: 261eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks NonStaticGlobalSpaceRegion(MemRegionManager *mgr, Kind k) 262eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks : GlobalsSpaceRegion(mgr, k) {} 2634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 2649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 265fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek 26667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 267eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks Kind k = R->getKind(); 2684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return k >= BEGIN_NON_STATIC_GLOBAL_MEMSPACES && 269eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks k <= END_NON_STATIC_GLOBAL_MEMSPACES; 27067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 27167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 272eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 273914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region containing globals which are defined in system/external 274eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// headers and are considered modifiable by system calls (ex: errno). 275eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksclass GlobalSystemSpaceRegion : public NonStaticGlobalSpaceRegion { 276eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks friend class MemRegionManager; 277eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 278eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalSystemSpaceRegion(MemRegionManager *mgr) 279eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks : NonStaticGlobalSpaceRegion(mgr, GlobalSystemSpaceRegionKind) {} 280eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 281eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zakspublic: 282eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 283651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void dumpToStream(raw_ostream &os) const override; 284eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 285eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks static bool classof(const MemRegion *R) { 286eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks return R->getKind() == GlobalSystemSpaceRegionKind; 287eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks } 288eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks}; 289eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 290914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region containing globals which are considered not to be modified 291eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// or point to data which could be modified as a result of a function call 292eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// (system or internal). Ex: Const global scalars would be modeled as part of 293eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// this region. This region also includes most system globals since they have 294eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// low chance of being modified. 295eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksclass GlobalImmutableSpaceRegion : public NonStaticGlobalSpaceRegion { 296eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks friend class MemRegionManager; 297eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 298eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalImmutableSpaceRegion(MemRegionManager *mgr) 299eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks : NonStaticGlobalSpaceRegion(mgr, GlobalImmutableSpaceRegionKind) {} 300eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 301eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zakspublic: 302eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 303651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void dumpToStream(raw_ostream &os) const override; 304eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 305eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks static bool classof(const MemRegion *R) { 306eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks return R->getKind() == GlobalImmutableSpaceRegionKind; 307eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks } 308eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks}; 309eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 310914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region containing globals which can be modified by calls to 311eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// "internally" defined functions - (for now just) functions other then system 312eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// calls. 313eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksclass GlobalInternalSpaceRegion : public NonStaticGlobalSpaceRegion { 314eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks friend class MemRegionManager; 315eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 316eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalInternalSpaceRegion(MemRegionManager *mgr) 317eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks : NonStaticGlobalSpaceRegion(mgr, GlobalInternalSpaceRegionKind) {} 318eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 319eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zakspublic: 320eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 321651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void dumpToStream(raw_ostream &os) const override; 322eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 323eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks static bool classof(const MemRegion *R) { 324eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks return R->getKind() == GlobalInternalSpaceRegionKind; 325eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks } 326eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks}; 327eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 32867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass HeapSpaceRegion : public MemSpaceRegion { 32999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 33067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 33167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 33267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek HeapSpaceRegion(MemRegionManager *mgr) 33367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : MemSpaceRegion(mgr, HeapSpaceRegionKind) {} 33467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 33536397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 336651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void dumpToStream(raw_ostream &os) const override; 33736397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 33867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 33967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return R->getKind() == HeapSpaceRegionKind; 34067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 34167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 34267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 3432b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenekclass UnknownSpaceRegion : public MemSpaceRegion { 34499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 3452b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek friend class MemRegionManager; 3462b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek UnknownSpaceRegion(MemRegionManager *mgr) 3472b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek : MemSpaceRegion(mgr, UnknownSpaceRegionKind) {} 3482b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenekpublic: 34936397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 350651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void dumpToStream(raw_ostream &os) const override; 35136397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 3522b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek static bool classof(const MemRegion *R) { 3532b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek return R->getKind() == UnknownSpaceRegionKind; 3542b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek } 3552b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek}; 3564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 35767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackSpaceRegion : public MemSpaceRegion { 35867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate: 35967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackFrameContext *SFC; 3609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 36167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprotected: 36267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StackSpaceRegion(MemRegionManager *mgr, Kind k, const StackFrameContext *sfc) 36367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : MemSpaceRegion(mgr, k), SFC(sfc) { 36467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek assert(classof(this)); 36567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 36641168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek 3674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarpublic: 36867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackFrameContext *getStackFrame() const { return SFC; } 3694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 370651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void Profile(llvm::FoldingSetNodeID &ID) const override; 37167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 37267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 37367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek Kind k = R->getKind(); 3744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return k >= BEGIN_STACK_MEMSPACES && k <= END_STACK_MEMSPACES; 3754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 37667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 3774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 37867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackLocalsSpaceRegion : public StackSpaceRegion { 37999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 38067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 38167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StackLocalsSpaceRegion(MemRegionManager *mgr, const StackFrameContext *sfc) 38267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : StackSpaceRegion(mgr, StackLocalsSpaceRegionKind, sfc) {} 38367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 38436397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 385651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void dumpToStream(raw_ostream &os) const override; 38636397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 38767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 38867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return R->getKind() == StackLocalsSpaceRegionKind; 38967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 39067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 39167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 39267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackArgumentsSpaceRegion : public StackSpaceRegion { 39367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate: 39499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 39567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 39667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StackArgumentsSpaceRegion(MemRegionManager *mgr, const StackFrameContext *sfc) 39767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : StackSpaceRegion(mgr, StackArgumentsSpaceRegionKind, sfc) {} 39867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 39936397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 400651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void dumpToStream(raw_ostream &os) const override; 40136397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 40267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 40367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return R->getKind() == StackArgumentsSpaceRegionKind; 4049e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 4059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 4069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4077caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 408993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// SubRegion - A region that subsets another larger region. Most regions 409993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// are subclasses of SubRegion. 410993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass SubRegion : public MemRegion { 41199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikieprivate: 41299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 4139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 4141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const MemRegion* superRegion; 415993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek SubRegion(const MemRegion* sReg, Kind k) : MemRegion(k), superRegion(sReg) {} 4169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 4179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* getSuperRegion() const { 4189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return superRegion; 4199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 4201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 42132f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose /// getExtent - Returns the size of the region in bytes. 422c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek virtual DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const { 42332f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose return UnknownVal(); 42432f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose } 42532f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 426651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines MemRegionManager* getMemRegionManager() const override; 4271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 428651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool isSubRegionOf(const MemRegion* R) const override; 4291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 43167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return R->getKind() > END_MEMSPACES; 432993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek } 433993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek}; 4341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 43519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===// 43619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// MemRegion subclasses. 4371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump//===----------------------------------------------------------------------===// 438ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 43982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek/// AllocaRegion - A region that represents an untyped blob of bytes created 44082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek/// by a call to 'alloca'. 44182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekclass AllocaRegion : public SubRegion { 44282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek friend class MemRegionManager; 44382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekprotected: 44482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek unsigned Cnt; // Block counter. Used to distinguish different pieces of 44582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek // memory allocated by alloca at the same call site. 4469c378f705405d37f49795d5e915989de774fe11fTed Kremenek const Expr *Ex; 44782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 4489c378f705405d37f49795d5e915989de774fe11fTed Kremenek AllocaRegion(const Expr *ex, unsigned cnt, const MemRegion *superRegion) 44982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek : SubRegion(superRegion, AllocaRegionKind), Cnt(cnt), Ex(ex) {} 4501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 45182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekpublic: 4521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4539c378f705405d37f49795d5e915989de774fe11fTed Kremenek const Expr *getExpr() const { return Ex; } 4549852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu 455651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool isBoundable() const override { return true; } 4569852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu 457651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const override; 45832f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 459651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void Profile(llvm::FoldingSetNodeID& ID) const override; 46082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 4619c378f705405d37f49795d5e915989de774fe11fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Expr *Ex, 4627ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek unsigned Cnt, const MemRegion *superRegion); 4631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 464651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void dumpToStream(raw_ostream &os) const override; 4651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 46682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek static bool classof(const MemRegion* R) { 46782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek return R->getKind() == AllocaRegionKind; 46882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek } 4691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}; 4701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 471993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// TypedRegion - An abstract class representing regions that are typed. 472993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass TypedRegion : public SubRegion { 47399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikiepublic: 474651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void anchor() override; 475993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekprotected: 476993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek TypedRegion(const MemRegion* sReg, Kind k) : SubRegion(sReg, k) {} 4771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 478993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekpublic: 4799697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek virtual QualType getLocationType() const = 0; 4809697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek 4819697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek QualType getDesugaredLocationType(ASTContext &Context) const { 4829697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek return getLocationType().getDesugaredType(Context); 4839697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek } 4849697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek 485651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool isBoundable() const override { return true; } 4869697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek 4879697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek static bool classof(const MemRegion* R) { 4889697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek unsigned k = R->getKind(); 4894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return k >= BEGIN_TYPED_REGIONS && k <= END_TYPED_REGIONS; 4909697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek } 4919697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek}; 4929697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek 4939697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek/// TypedValueRegion - An abstract class representing regions having a typed value. 4949697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass TypedValueRegion : public TypedRegion { 49599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikiepublic: 496651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void anchor() override; 4979697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekprotected: 4989697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek TypedValueRegion(const MemRegion* sReg, Kind k) : TypedRegion(sReg, k) {} 4999697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek 5009697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekpublic: 501018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu virtual QualType getValueType() const = 0; 5021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 503651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines QualType getLocationType() const override { 5046eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek // FIXME: We can possibly optimize this later to cache this value. 505a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek QualType T = getValueType(); 506a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek ASTContext &ctx = getContext(); 507a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek if (T->getAs<ObjCObjectType>()) 508a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek return ctx.getObjCObjectPointerType(T); 509a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek return ctx.getPointerType(getValueType()); 5106eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek } 5111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 51249f4e1cbd839da27ff4814b4ea6d85a79f786cbdJohn McCall QualType getDesugaredValueType(ASTContext &Context) const { 513018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType T = getValueType(); 5141ab55e9bb87d98bff1d42c7a0ee502c64755d9f5Douglas Gregor return T.getTypePtrOrNull() ? T.getDesugaredType(Context) : T; 51514553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek } 5161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 517651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const override; 518e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose 519993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek static bool classof(const MemRegion* R) { 5209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek unsigned k = R->getKind(); 5214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return k >= BEGIN_TYPED_VALUE_REGIONS && k <= END_TYPED_VALUE_REGIONS; 5229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 5239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 5249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 525ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 526eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass CodeTextRegion : public TypedRegion { 52799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikiepublic: 528651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void anchor() override; 529eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekprotected: 530eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek CodeTextRegion(const MemRegion *sreg, Kind k) : TypedRegion(sreg, k) {} 531ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xupublic: 532651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool isBoundable() const override { return false; } 533651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 534eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek static bool classof(const MemRegion* R) { 535eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek Kind k = R->getKind(); 5364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return k >= BEGIN_CODE_TEXT_REGIONS && k <= END_CODE_TEXT_REGIONS; 537eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek } 538eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek}; 539ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 5404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// FunctionCodeRegion - A region that represents code texts of function. 5414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass FunctionCodeRegion : public CodeTextRegion { 5425fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks const NamedDecl *FD; 543eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekpublic: 5444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar FunctionCodeRegion(const NamedDecl *fd, const MemRegion* sreg) 5454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : CodeTextRegion(sreg, FunctionCodeRegionKind), FD(fd) { 5465fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks assert(isa<ObjCMethodDecl>(fd) || isa<FunctionDecl>(fd)); 5475fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks } 548651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 549651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines QualType getLocationType() const override { 5505fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks const ASTContext &Ctx = getContext(); 5515fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks if (const FunctionDecl *D = dyn_cast<FunctionDecl>(FD)) { 5525fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks return Ctx.getPointerType(D->getType()); 5535fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks } 5545fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks 5555fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks assert(isa<ObjCMethodDecl>(FD)); 5565fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks assert(false && "Getting the type of ObjCMethod is not supported yet"); 5575fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks 5585fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks // TODO: We might want to return a different type here (ex: id (*ty)(...)) 5595fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks // depending on how it is used. 5605fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks return QualType(); 561ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu } 5625fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks 5635fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks const NamedDecl *getDecl() const { 564abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek return FD; 56572e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek } 566651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 567651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void dumpToStream(raw_ostream &os) const override; 568651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 569651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void Profile(llvm::FoldingSetNodeID& ID) const override; 570651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 5715fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks static void ProfileRegion(llvm::FoldingSetNodeID& ID, const NamedDecl *FD, 572abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek const MemRegion*); 573eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 574ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu static bool classof(const MemRegion* R) { 5754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return R->getKind() == FunctionCodeRegionKind; 576eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek } 577eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek}; 578eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 579eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 5804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// BlockCodeRegion - A region that represents code texts of blocks (closures). 5814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// Blocks are represented with two kinds of regions. BlockCodeRegions 5820a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// represent the "code", while BlockDataRegions represent instances of blocks, 5830a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// which correspond to "code+data". The distinction is important, because 5840a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// like a closure a block captures the values of externally referenced 5850a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// variables. 5864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass BlockCodeRegion : public CodeTextRegion { 58767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 58867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 589eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek const BlockDecl *BD; 5901d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContext *AC; 591eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek CanQualType locTy; 59267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 5934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar BlockCodeRegion(const BlockDecl *bd, CanQualType lTy, 5941d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContext *ac, const MemRegion* sreg) 5954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : CodeTextRegion(sreg, BlockCodeRegionKind), BD(bd), AC(ac), locTy(lTy) {} 59667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 59767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 598651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines QualType getLocationType() const override { 599eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return locTy; 600eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek } 601eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 602eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek const BlockDecl *getDecl() const { 603eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return BD; 604eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek } 60567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 6061d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContext *getAnalysisDeclContext() const { return AC; } 607651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 60858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar void dumpToStream(raw_ostream &os) const override; 609651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 610651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void Profile(llvm::FoldingSetNodeID& ID) const override; 611651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 612eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const BlockDecl *BD, 6131d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek CanQualType, const AnalysisDeclContext*, 61467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const MemRegion*); 615eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 616eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek static bool classof(const MemRegion* R) { 6174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return R->getKind() == BlockCodeRegionKind; 618ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu } 619ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu}; 6200a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 6210a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// BlockDataRegion - A region that represents a block instance. 6224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// Blocks are represented with two kinds of regions. BlockCodeRegions 6230a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// represent the "code", while BlockDataRegions represent instances of blocks, 6240a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// which correspond to "code+data". The distinction is important, because 6250a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// like a closure a block captures the values of externally referenced 6260a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// variables. 6278ecf59afbab1dbf184dc4c0c47e7213cbd32ba0aJordan Roseclass BlockDataRegion : public TypedRegion { 62867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 6294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const BlockCodeRegion *BC; 63067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *LC; // Can be null */ 6313eb52bb5d791630f926ff2226dae25012315ad9aBill Wendling unsigned BlockCount; 6324240096011a187807058f887eb81df750ffa17feTed Kremenek void *ReferencedVars; 63385d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek void *OriginalVars; 63467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 6354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar BlockDataRegion(const BlockCodeRegion *bc, const LocationContext *lc, 6363eb52bb5d791630f926ff2226dae25012315ad9aBill Wendling unsigned count, const MemRegion *sreg) 6378ecf59afbab1dbf184dc4c0c47e7213cbd32ba0aJordan Rose : TypedRegion(sreg, BlockDataRegionKind), BC(bc), LC(lc), 6383eb52bb5d791630f926ff2226dae25012315ad9aBill Wendling BlockCount(count), 6396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ReferencedVars(nullptr), OriginalVars(nullptr) {} 6400a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 64185d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenekpublic: 6424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const BlockCodeRegion *getCodeRegion() const { return BC; } 6434240096011a187807058f887eb81df750ffa17feTed Kremenek 644d02e83a548359df978f40cc1a52ffd78b7ef371bTed Kremenek const BlockDecl *getDecl() const { return BC->getDecl(); } 6458ecf59afbab1dbf184dc4c0c47e7213cbd32ba0aJordan Rose 646651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines QualType getLocationType() const override { return BC->getLocationType(); } 647651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 64881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek class referenced_vars_iterator { 64981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek const MemRegion * const *R; 65085d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek const MemRegion * const *OriginalR; 65181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek public: 65285d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek explicit referenced_vars_iterator(const MemRegion * const *r, 65385d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek const MemRegion * const *originalR) 65485d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek : R(r), OriginalR(originalR) {} 65585d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek 656e3ce2c10c3f6ae7b26700d758de909deab190d42Ted Kremenek const VarRegion *getCapturedRegion() const { 65781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return cast<VarRegion>(*R); 65881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 659e3ce2c10c3f6ae7b26700d758de909deab190d42Ted Kremenek const VarRegion *getOriginalRegion() const { 660e3ce2c10c3f6ae7b26700d758de909deab190d42Ted Kremenek return cast<VarRegion>(*OriginalR); 661e3ce2c10c3f6ae7b26700d758de909deab190d42Ted Kremenek } 662e3ce2c10c3f6ae7b26700d758de909deab190d42Ted Kremenek 66381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek bool operator==(const referenced_vars_iterator &I) const { 6646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert((R == nullptr) == (I.R == nullptr)); 66581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return I.R == R; 66681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 66781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek bool operator!=(const referenced_vars_iterator &I) const { 6686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert((R == nullptr) == (I.R == nullptr)); 66981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return I.R != R; 67081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 6719c378f705405d37f49795d5e915989de774fe11fTed Kremenek referenced_vars_iterator &operator++() { 67281cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek ++R; 67385d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek ++OriginalR; 67481cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return *this; 67581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 67681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek }; 6775846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek 6785846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek /// Return the original region for a captured region, if 6795846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek /// one exists. 6805846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek const VarRegion *getOriginalRegion(const VarRegion *VR) const; 68181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek 6824240096011a187807058f887eb81df750ffa17feTed Kremenek referenced_vars_iterator referenced_vars_begin() const; 6834240096011a187807058f887eb81df750ffa17feTed Kremenek referenced_vars_iterator referenced_vars_end() const; 684651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 685651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void dumpToStream(raw_ostream &os) const override; 686651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 687651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void Profile(llvm::FoldingSetNodeID& ID) const override; 688651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 6894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar static void ProfileRegion(llvm::FoldingSetNodeID&, const BlockCodeRegion *, 6903eb52bb5d791630f926ff2226dae25012315ad9aBill Wendling const LocationContext *, unsigned, 6913eb52bb5d791630f926ff2226dae25012315ad9aBill Wendling const MemRegion *); 6920a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 6930a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek static bool classof(const MemRegion* R) { 6940a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek return R->getKind() == BlockDataRegionKind; 6950a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek } 6964240096011a187807058f887eb81df750ffa17feTed Kremenekprivate: 6974240096011a187807058f887eb81df750ffa17feTed Kremenek void LazyInitializeReferencedVars(); 69824570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek std::pair<const VarRegion *, const VarRegion *> 69924570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek getCaptureRegions(const VarDecl *VD); 7000a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek}; 701ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 702026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// SymbolicRegion - A special, "non-concrete" region. Unlike other region 70358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar/// classes, SymbolicRegion represents a region that serves as an alias for 704026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// either a real region, a NULL pointer, etc. It essentially is used to 705026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// map the concept of symbolic values into the domain of regions. Symbolic 706026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// regions do not need to be typed. 707e8e86482da4c1872673bbb9c237649229d19793bTed Kremenekclass SymbolicRegion : public SubRegion { 708026c66395b88a09437319139a43b090093f7e1ddZhongxing Xuprotected: 709026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu const SymbolRef sym; 710026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 711026c66395b88a09437319139a43b090093f7e1ddZhongxing Xupublic: 7121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SymbolicRegion(const SymbolRef s, const MemRegion* sreg) 713e8e86482da4c1872673bbb9c237649229d19793bTed Kremenek : SubRegion(sreg, SymbolicRegionKind), sym(s) {} 7141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 715026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu SymbolRef getSymbol() const { 716026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu return sym; 717026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu } 718026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 719651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool isBoundable() const override { return true; } 7209852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu 721651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const override; 72232f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 723651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void Profile(llvm::FoldingSetNodeID& ID) const override; 724026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 725250101353b711a409b075f1bc11070dddec7100bTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, 726250101353b711a409b075f1bc11070dddec7100bTed Kremenek SymbolRef sym, 727250101353b711a409b075f1bc11070dddec7100bTed Kremenek const MemRegion* superRegion); 7281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 729651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void dumpToStream(raw_ostream &os) const override; 7301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 731026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu static bool classof(const MemRegion* R) { 732026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu return R->getKind() == SymbolicRegionKind; 733026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu } 7341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}; 735026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 736e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu/// StringRegion - Region associated with a StringLiteral. 7379697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass StringRegion : public TypedValueRegion { 738e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu friend class MemRegionManager; 739e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const StringLiteral* Str; 740e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuprotected: 741e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 742250101353b711a409b075f1bc11070dddec7100bTed Kremenek StringRegion(const StringLiteral* str, const MemRegion* sreg) 7439697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sreg, StringRegionKind), Str(str) {} 744e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 745e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID& ID, 746e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const StringLiteral* Str, 747e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const MemRegion* superRegion); 748e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 749e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xupublic: 7506613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu 7516613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu const StringLiteral* getStringLiteral() const { return Str; } 7521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 753651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines QualType getValueType() const override { 754ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu return Str->getType(); 755ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu } 756e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 757651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const override; 75832f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 759651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool isBoundable() const override { return false; } 7600a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu 761651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void Profile(llvm::FoldingSetNodeID& ID) const override { 762e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu ProfileRegion(ID, Str, superRegion); 763e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 764e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 765651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void dumpToStream(raw_ostream &os) const override; 766cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu 767e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static bool classof(const MemRegion* R) { 768e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu return R->getKind() == StringRegionKind; 769e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 770e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu}; 7714c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7724c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek/// The region associated with an ObjCStringLiteral. 7734c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekclass ObjCStringRegion : public TypedValueRegion { 7744c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek friend class MemRegionManager; 7754c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek const ObjCStringLiteral* Str; 7764c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekprotected: 7774c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7784c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek ObjCStringRegion(const ObjCStringLiteral* str, const MemRegion* sreg) 7794c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek : TypedValueRegion(sreg, ObjCStringRegionKind), Str(str) {} 7804c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7814c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, 7824c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek const ObjCStringLiteral* Str, 7834c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek const MemRegion* superRegion); 7844c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7854c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekpublic: 7864c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7874c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek const ObjCStringLiteral* getObjCStringLiteral() const { return Str; } 788651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 789651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines QualType getValueType() const override { 7904c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek return Str->getType(); 7914c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek } 792651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 793651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool isBoundable() const override { return false; } 794651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 795651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void Profile(llvm::FoldingSetNodeID& ID) const override { 7964c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek ProfileRegion(ID, Str, superRegion); 7974c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek } 798651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 799651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void dumpToStream(raw_ostream &os) const override; 800651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 8014c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek static bool classof(const MemRegion* R) { 8024c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek return R->getKind() == ObjCStringRegionKind; 8034c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek } 8044c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek}; 805e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 806329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// CompoundLiteralRegion - A memory region representing a compound literal. 807329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// Compound literals are essentially temporaries that are stack allocated 808329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// or in the global constant pool. 8099697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CompoundLiteralRegion : public TypedValueRegion { 810329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekprivate: 811329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek friend class MemRegionManager; 8129c378f705405d37f49795d5e915989de774fe11fTed Kremenek const CompoundLiteralExpr *CL; 813329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 8149c378f705405d37f49795d5e915989de774fe11fTed Kremenek CompoundLiteralRegion(const CompoundLiteralExpr *cl, const MemRegion* sReg) 8159697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sReg, CompoundLiteralRegionKind), CL(cl) {} 8161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 817329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, 8189c378f705405d37f49795d5e915989de774fe11fTed Kremenek const CompoundLiteralExpr *CL, 819329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek const MemRegion* superRegion); 820329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekpublic: 821651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines QualType getValueType() const override { 822018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu return CL->getType(); 82377cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu } 8240a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu 825651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool isBoundable() const override { return !CL->isFileScope(); } 8269a08fee80a34938b8c11c7166e009a89ced4c2b4Zhongxing Xu 827651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void Profile(llvm::FoldingSetNodeID& ID) const override; 8281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 829651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void dumpToStream(raw_ostream &os) const override; 830329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 8319c378f705405d37f49795d5e915989de774fe11fTed Kremenek const CompoundLiteralExpr *getLiteralExpr() const { return CL; } 8321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 833329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek static bool classof(const MemRegion* R) { 834329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek return R->getKind() == CompoundLiteralRegionKind; 835329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek } 836329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek}; 837178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 8389697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass DeclRegion : public TypedValueRegion { 8399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 8409c378f705405d37f49795d5e915989de774fe11fTed Kremenek const Decl *D; 8419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 8429c378f705405d37f49795d5e915989de774fe11fTed Kremenek DeclRegion(const Decl *d, const MemRegion* sReg, Kind k) 8439697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sReg, k), D(d) {} 8449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 8459c378f705405d37f49795d5e915989de774fe11fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl *D, 8469e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion, Kind k); 8471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 848bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xupublic: 8499c378f705405d37f49795d5e915989de774fe11fTed Kremenek const Decl *getDecl() const { return D; } 850651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void Profile(llvm::FoldingSetNodeID& ID) const override; 8511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 852e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static bool classof(const MemRegion* R) { 853e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu unsigned k = R->getKind(); 8544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return k >= BEGIN_DECL_REGIONS && k <= END_DECL_REGIONS; 855e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 8569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 8571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass VarRegion : public DeclRegion { 8599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 860d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek 861d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek // Constructors and private methods. 8629c378f705405d37f49795d5e915989de774fe11fTed Kremenek VarRegion(const VarDecl *vd, const MemRegion* sReg) 86367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : DeclRegion(vd, sReg, VarRegionKind) {} 8649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 8659c378f705405d37f49795d5e915989de774fe11fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const VarDecl *VD, 866d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek const MemRegion *superRegion) { 8679e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, VD, superRegion, VarRegionKind); 8689e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 8691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 870651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void Profile(llvm::FoldingSetNodeID& ID) const override; 8711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic: 873d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek const VarDecl *getDecl() const { return cast<VarDecl>(D); } 8741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8755348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek const StackFrameContext *getStackFrame() const; 876651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 877651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines QualType getValueType() const override { 8786eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek // FIXME: We can cache this if needed. 879018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu return getDecl()->getType(); 8801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 8811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 882651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void dumpToStream(raw_ostream &os) const override; 8831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 8859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == VarRegionKind; 8861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 8873d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks 888651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool canPrintPrettyAsExpr() const override; 8899e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks 890651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void printPrettyAsExpr(raw_ostream &os) const override; 8919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 892de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 893de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek/// CXXThisRegion - Represents the region for the implicit 'this' parameter 894de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek/// in a call to a C++ method. This region doesn't represent the object 895de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek/// referred to by 'this', but rather 'this' itself. 8969697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CXXThisRegion : public TypedValueRegion { 897de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek friend class MemRegionManager; 898de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek CXXThisRegion(const PointerType *thisPointerTy, 899de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const MemRegion *sReg) 9009697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sReg, CXXThisRegionKind), ThisPointerTy(thisPointerTy) {} 901de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 902de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID &ID, 903de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const PointerType *PT, 904de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const MemRegion *sReg); 905de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 906651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void Profile(llvm::FoldingSetNodeID &ID) const override; 907de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 908651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinespublic: 909651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines QualType getValueType() const override { 910de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek return QualType(ThisPointerTy, 0); 911de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek } 9127caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 913651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void dumpToStream(raw_ostream &os) const override; 914651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 915de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek static bool classof(const MemRegion* R) { 916de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek return R->getKind() == CXXThisRegionKind; 917de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek } 918de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 919de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekprivate: 920de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const PointerType *ThisPointerTy; 921de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek}; 9229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 9239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass FieldRegion : public DeclRegion { 9249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 9259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 9269c378f705405d37f49795d5e915989de774fe11fTed Kremenek FieldRegion(const FieldDecl *fd, const MemRegion* sReg) 9279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(fd, sReg, FieldRegionKind) {} 9289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 9294bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenekpublic: 9309c378f705405d37f49795d5e915989de774fe11fTed Kremenek const FieldDecl *getDecl() const { return cast<FieldDecl>(D); } 9311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 932651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines QualType getValueType() const override { 9336eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek // FIXME: We can cache this if needed. 934018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu return getDecl()->getType(); 9351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 9364bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek 937651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const override; 93832f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 9399c378f705405d37f49795d5e915989de774fe11fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const FieldDecl *FD, 9406304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek const MemRegion* superRegion) { 9419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, FD, superRegion, FieldRegionKind); 9429e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 9431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 9459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == FieldRegionKind; 9469e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 9473d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks 948651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void dumpToStream(raw_ostream &os) const override; 949919e8a1c6698bfa6848571d366430126bced727dJordan Rose 950651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool canPrintPretty() const override; 951651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void printPretty(raw_ostream &os) const override; 952651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool canPrintPrettyAsExpr() const override; 953651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void printPrettyAsExpr(raw_ostream &os) const override; 9549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 9551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass ObjCIvarRegion : public DeclRegion { 9571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 9591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 960c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer ObjCIvarRegion(const ObjCIvarDecl *ivd, const MemRegion* sReg); 9619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 9629c378f705405d37f49795d5e915989de774fe11fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const ObjCIvarDecl *ivd, 963c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer const MemRegion* superRegion); 9641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 966c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer const ObjCIvarDecl *getDecl() const; 967651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines QualType getValueType() const override; 9681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 969651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool canPrintPrettyAsExpr() const override; 970651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void printPrettyAsExpr(raw_ostream &os) const override; 97143b82b823a6113fdbee54243b280db9c55ef72cbTed Kremenek 972651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void dumpToStream(raw_ostream &os) const override; 9731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 9759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == ObjCIvarRegionKind; 9769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 9779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 9787caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu//===----------------------------------------------------------------------===// 979fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner// Auxiliary data classes for use with MemRegions. 9807caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu//===----------------------------------------------------------------------===// 9817caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 9827caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuclass ElementRegion; 9837caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 9847caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuclass RegionRawOffset { 9857caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuprivate: 9867caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu friend class ElementRegion; 9877caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 9887caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu const MemRegion *Region; 9899ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck CharUnits Offset; 9907caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 9919ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck RegionRawOffset(const MemRegion* reg, CharUnits offset = CharUnits::Zero()) 9927caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu : Region(reg), Offset(offset) {} 9937caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 9947caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xupublic: 9957caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu // FIXME: Eventually support symbolic offsets. 9969ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck CharUnits getOffset() const { return Offset; } 9977caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu const MemRegion *getRegion() const { return Region; } 9987caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 9999c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 10007caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu void dump() const; 10017caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu}; 1002511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 10031437425a62dbf7bdb0a855d3ed3b05ed2019ec1eAnna Zaks/// \brief ElementRegin is used to represent both array elements and casts. 10049697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass ElementRegion : public TypedValueRegion { 1005511191ce8920160525611be2be754c32a0724c3eZhongxing Xu friend class MemRegionManager; 1006511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 1007f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek QualType ElementType; 100802282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek NonLoc Index; 1009511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 101002282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek ElementRegion(QualType elementType, NonLoc Idx, const MemRegion* sReg) 10119697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sReg, ElementRegionKind), 1012f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek ElementType(elementType), Index(Idx) { 10135251abea41b446c26e3239c8dd6c7edea6fc335dDavid Blaikie assert((!Idx.getAs<nonloc::ConcreteInt>() || 10145251abea41b446c26e3239c8dd6c7edea6fc335dDavid Blaikie Idx.castAs<nonloc::ConcreteInt>().getValue().isSigned()) && 101543b28d07019bc78447ecbbb721526de4ffd83f20Chris Lattner "The index must be signed"); 10160395b5d4987fe5baa818015e9d294c128619e4ecZhongxing Xu } 10171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1018f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, QualType elementType, 1019f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek SVal Idx, const MemRegion* superRegion); 1020511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 1021511191ce8920160525611be2be754c32a0724c3eZhongxing Xupublic: 1022511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 102302282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek NonLoc getIndex() const { return Index; } 10246e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu 1025651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines QualType getValueType() const override { 1026f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek return ElementType; 1027f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek } 10281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1029f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek QualType getElementType() const { 1030f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek return ElementType; 1031abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek } 10327caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu /// Compute the offset within the array. The array might also be a subobject. 10337caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu RegionRawOffset getAsArrayOffset() const; 10341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1035651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void dumpToStream(raw_ostream &os) const override; 1036b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 1037651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void Profile(llvm::FoldingSetNodeID& ID) const override; 1038511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 1039511191ce8920160525611be2be754c32a0724c3eZhongxing Xu static bool classof(const MemRegion* R) { 1040511191ce8920160525611be2be754c32a0724c3eZhongxing Xu return R->getKind() == ElementRegionKind; 1041511191ce8920160525611be2be754c32a0724c3eZhongxing Xu } 1042511191ce8920160525611be2be754c32a0724c3eZhongxing Xu}; 104319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 1044bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu// C++ temporary object associated with an expression. 10459697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CXXTempObjectRegion : public TypedValueRegion { 1046bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu friend class MemRegionManager; 1047bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 1048bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu Expr const *Ex; 1049bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 105002fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu CXXTempObjectRegion(Expr const *E, MemRegion const *sReg) 10519697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sReg, CXXTempObjectRegionKind), Ex(E) {} 1052bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 1053bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID &ID, 1054bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu Expr const *E, const MemRegion *sReg); 1055bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 1056bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xupublic: 1057782f63ecd124f9384f988dc7e0cf4ae1540c15f6Jeffrey Yasskin const Expr *getExpr() const { return Ex; } 1058782f63ecd124f9384f988dc7e0cf4ae1540c15f6Jeffrey Yasskin 1059651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines QualType getValueType() const override { 1060bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu return Ex->getType(); 1061bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu } 1062bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 1063651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void dumpToStream(raw_ostream &os) const override; 1064e1aeb13251a4858724d2b7ad1925d25076f23d08Zhongxing Xu 1065651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void Profile(llvm::FoldingSetNodeID &ID) const override; 1066bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 1067bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu static bool classof(const MemRegion* R) { 106802fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu return R->getKind() == CXXTempObjectRegionKind; 1069bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu } 1070bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu}; 1071bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 10724fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu// CXXBaseObjectRegion represents a base object within a C++ object. It is 10734fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu// identified by the base class declaration and the region of its parent object. 10749697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CXXBaseObjectRegion : public TypedValueRegion { 10754fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu friend class MemRegionManager; 10764fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 10774411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose llvm::PointerIntPair<const CXXRecordDecl *, 1, bool> Data; 10784fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 10794411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose CXXBaseObjectRegion(const CXXRecordDecl *RD, bool IsVirtual, 10804411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose const MemRegion *SReg) 10814411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose : TypedValueRegion(SReg, CXXBaseObjectRegionKind), Data(RD, IsVirtual) {} 10824fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 10834411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose static void ProfileRegion(llvm::FoldingSetNodeID &ID, const CXXRecordDecl *RD, 10844411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose bool IsVirtual, const MemRegion *SReg); 10854fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 10864fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xupublic: 10874411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose const CXXRecordDecl *getDecl() const { return Data.getPointer(); } 10884411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose bool isVirtual() const { return Data.getInt(); } 1089d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu 1090651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines QualType getValueType() const override; 10914fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 1092651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void dumpToStream(raw_ostream &os) const override; 10934fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 1094651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void Profile(llvm::FoldingSetNodeID &ID) const override; 10954fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 10964fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu static bool classof(const MemRegion *region) { 10974fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu return region->getKind() == CXXBaseObjectRegionKind; 10984fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu } 109907d8470effc0b0364801adddb6ff92bd22334402Anna Zaks 1100651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool canPrintPrettyAsExpr() const override; 1101651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1102651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void printPrettyAsExpr(raw_ostream &os) const override; 11034fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu}; 11044fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 1105ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenektemplate<typename RegionTy> 1106ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenekconst RegionTy* MemRegion::getAs() const { 1107f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek if (const RegionTy* RT = dyn_cast<RegionTy>(this)) 1108f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek return RT; 11091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 11106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 1111ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek} 1112511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 11139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 11149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager - Factory object for creating regions. 11159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 11169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 11179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager { 1118a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek ASTContext &C; 11199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek llvm::BumpPtrAllocator& A; 11209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek llvm::FoldingSet<MemRegion> Regions; 11211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1122eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalInternalSpaceRegion *InternalGlobals; 1123eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalSystemSpaceRegion *SystemGlobals; 1124eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalImmutableSpaceRegion *ImmutableGlobals; 1125eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 11262b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek 1127c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu llvm::DenseMap<const StackFrameContext *, StackLocalsSpaceRegion *> 1128c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu StackLocalsSpaceRegions; 1129c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu llvm::DenseMap<const StackFrameContext *, StackArgumentsSpaceRegion *> 1130c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu StackArgumentsSpaceRegions; 1131dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek llvm::DenseMap<const CodeTextRegion *, StaticGlobalSpaceRegion *> 1132dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek StaticsGlobalSpaceRegions; 11332b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek 113467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek HeapSpaceRegion *heap; 11352b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek UnknownSpaceRegion *unknown; 11364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CodeSpaceRegion *code; 1137dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 11389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 11396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines MemRegionManager(ASTContext &c, llvm::BumpPtrAllocator &a) 11406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : C(c), A(a), InternalGlobals(nullptr), SystemGlobals(nullptr), 11416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ImmutableGlobals(nullptr), heap(nullptr), unknown(nullptr), 11426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines code(nullptr) {} 11431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 11444240096011a187807058f887eb81df750ffa17feTed Kremenek ~MemRegionManager(); 11451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1146a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek ASTContext &getContext() { return C; } 11474240096011a187807058f887eb81df750ffa17feTed Kremenek 11484240096011a187807058f887eb81df750ffa17feTed Kremenek llvm::BumpPtrAllocator &getAllocator() { return A; } 11491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 115067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// getStackLocalsRegion - Retrieve the memory region associated with the 115167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// specified stack frame. 115267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackLocalsSpaceRegion * 115367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek getStackLocalsRegion(const StackFrameContext *STC); 1154d05552a21377f493c882298c59e8829040b01d34Ted Kremenek 1155d05552a21377f493c882298c59e8829040b01d34Ted Kremenek /// getStackArgumentsRegion - Retrieve the memory region associated with 115667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// function/method arguments of the specified stack frame. 115767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackArgumentsSpaceRegion * 115867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek getStackArgumentsRegion(const StackFrameContext *STC); 11591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 11609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getGlobalsRegion - Retrieve the memory region associated with 1161dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek /// global variables. 1162eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks const GlobalsSpaceRegion *getGlobalsRegion( 1163eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks MemRegion::Kind K = MemRegion::GlobalInternalSpaceRegionKind, 11646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const CodeTextRegion *R = nullptr); 11651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 11669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getHeapRegion - Retrieve the memory region associated with the 11679e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// generic "heap". 116867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const HeapSpaceRegion *getHeapRegion(); 1169178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 1170178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu /// getUnknownRegion - Retrieve the memory region associated with unknown 1171178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu /// memory space. 11724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const UnknownSpaceRegion *getUnknownRegion(); 1173c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu 11744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const CodeSpaceRegion *getCodeRegion(); 1175ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 11767090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek /// getAllocaRegion - Retrieve a region associated with a call to alloca(). 11779c378f705405d37f49795d5e915989de774fe11fTed Kremenek const AllocaRegion *getAllocaRegion(const Expr *Ex, unsigned Cnt, 117867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *LC); 11791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1180329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek /// getCompoundLiteralRegion - Retrieve the region associated with a 1181329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek /// given CompoundLiteral. 1182b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const CompoundLiteralRegion* 11839c378f705405d37f49795d5e915989de774fe11fTed Kremenek getCompoundLiteralRegion(const CompoundLiteralExpr *CL, 118467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *LC); 1185de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 1186fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner /// getCXXThisRegion - Retrieve the [artificial] region associated with the 1187de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek /// parameter 'this'. 1188de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const CXXThisRegion *getCXXThisRegion(QualType thisPointerTy, 1189de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const LocationContext *LC); 11901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1191e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks /// \brief Retrieve or create a "symbolic" memory region. 1192e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks const SymbolicRegion* getSymbolicRegion(SymbolRef Sym); 1193e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks 1194e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks /// \brief Return a unique symbolic region belonging to heap memory space. 1195e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks const SymbolicRegion *getSymbolicHeapRegion(SymbolRef sym); 1196e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 11974c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek const StringRegion *getStringRegion(const StringLiteral* Str); 11984c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 11994c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek const ObjCStringRegion *getObjCStringRegion(const ObjCStringLiteral *Str); 1200e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 12019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getVarRegion - Retrieve or create the memory region associated with 1202d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek /// a specified VarDecl and LocationContext. 1203b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const VarRegion* getVarRegion(const VarDecl *D, const LocationContext *LC); 12041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 120567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// getVarRegion - Retrieve or create the memory region associated with 120667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// a specified VarDecl and super region. 120767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const VarRegion* getVarRegion(const VarDecl *D, const MemRegion *superR); 120867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 1209f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek /// getElementRegion - Retrieve the memory region associated with the 1210f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek /// associated element type, index, and super region. 121102282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek const ElementRegion *getElementRegion(QualType elementType, NonLoc Idx, 1212856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu const MemRegion *superRegion, 1213856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu ASTContext &Ctx); 12141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1215b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const ElementRegion *getElementRegionWithSuper(const ElementRegion *ER, 1216856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu const MemRegion *superRegion) { 1217a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek return getElementRegion(ER->getElementType(), ER->getIndex(), 1218a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek superRegion, ER->getContext()); 1219a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek } 1220511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 12219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getFieldRegion - Retrieve or create the memory region associated with 12229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a specified FieldDecl. 'superRegion' corresponds to the containing 12239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// memory region (which typically represents the memory representing 12249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a structure or class). 12259c378f705405d37f49795d5e915989de774fe11fTed Kremenek const FieldRegion *getFieldRegion(const FieldDecl *fd, 1226b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemRegion* superRegion); 12271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1228b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const FieldRegion *getFieldRegionWithSuper(const FieldRegion *FR, 1229b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemRegion *superRegion) { 1230a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek return getFieldRegion(FR->getDecl(), superRegion); 1231a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek } 12321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 12339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getObjCIvarRegion - Retrieve or create the memory region associated with 12349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a specified Objective-c instance variable. 'superRegion' corresponds 12359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// to the containing region (which typically represents the Objective-C 12369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// object). 12379c378f705405d37f49795d5e915989de774fe11fTed Kremenek const ObjCIvarRegion *getObjCIvarRegion(const ObjCIvarDecl *ivd, 1238b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemRegion* superRegion); 12391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 124002fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu const CXXTempObjectRegion *getCXXTempObjectRegion(Expr const *Ex, 124102fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu LocationContext const *LC); 1242bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 12434411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose /// Create a CXXBaseObjectRegion with the given base class for region 12444411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose /// \p Super. 12454411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose /// 12464411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose /// The type of \p Super is assumed be a class deriving from \p BaseClass. 12474411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose const CXXBaseObjectRegion * 12484411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose getCXXBaseObjectRegion(const CXXRecordDecl *BaseClass, const MemRegion *Super, 12494411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose bool IsVirtual); 12504fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 1251d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu /// Create a CXXBaseObjectRegion with the same CXXRecordDecl but a different 1252d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu /// super region. 1253d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu const CXXBaseObjectRegion * 1254d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu getCXXBaseObjectRegionWithSuper(const CXXBaseObjectRegion *baseReg, 1255d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu const MemRegion *superRegion) { 12564411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose return getCXXBaseObjectRegion(baseReg->getDecl(), superRegion, 12574411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose baseReg->isVirtual()); 1258d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu } 1259d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu 12604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const FunctionCodeRegion *getFunctionCodeRegion(const NamedDecl *FD); 12614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const BlockCodeRegion *getBlockCodeRegion(const BlockDecl *BD, 126267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek CanQualType locTy, 12631d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContext *AC); 126467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 126567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// getBlockDataRegion - Get the memory region associated with an instance 126667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// of a block. Unlike many other MemRegions, the LocationContext* 126767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// argument is allowed to be NULL for cases where we have no known 126867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// context. 12694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const BlockDataRegion *getBlockDataRegion(const BlockCodeRegion *bc, 12703eb52bb5d791630f926ff2226dae25012315ad9aBill Wendling const LocationContext *lc, 12713eb52bb5d791630f926ff2226dae25012315ad9aBill Wendling unsigned blockCount); 12721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 127376b5dd48c9dbf2ed3e5830060ea55b81b7d1cca0Pavel Labath /// Create a CXXTempObjectRegion for temporaries which are lifetime-extended 127476b5dd48c9dbf2ed3e5830060ea55b81b7d1cca0Pavel Labath /// by static references. This differs from getCXXTempObjectRegion in the 127576b5dd48c9dbf2ed3e5830060ea55b81b7d1cca0Pavel Labath /// super-region used. 127676b5dd48c9dbf2ed3e5830060ea55b81b7d1cca0Pavel Labath const CXXTempObjectRegion *getCXXStaticTempObjectRegion(const Expr *Ex); 127776b5dd48c9dbf2ed3e5830060ea55b81b7d1cca0Pavel Labath 1278bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenekprivate: 1279250101353b711a409b075f1bc11070dddec7100bTed Kremenek template <typename RegionTy, typename A1> 1280250101353b711a409b075f1bc11070dddec7100bTed Kremenek RegionTy* getRegion(const A1 a1); 12811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 12826304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek template <typename RegionTy, typename A1> 1283eeea45611d45238c34474c183cee96d47ae79e24Ted Kremenek RegionTy* getSubRegion(const A1 a1, const MemRegion* superRegion); 12841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 12857ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek template <typename RegionTy, typename A1, typename A2> 12867ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek RegionTy* getRegion(const A1 a1, const A2 a2); 1287dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 12880a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek template <typename RegionTy, typename A1, typename A2> 12890a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek RegionTy* getSubRegion(const A1 a1, const A2 a2, 12900a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek const MemRegion* superRegion); 12910a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 129267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek template <typename RegionTy, typename A1, typename A2, typename A3> 129367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek RegionTy* getSubRegion(const A1 a1, const A2 a2, const A3 a3, 129467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const MemRegion* superRegion); 129567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 129667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek template <typename REG> 129767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const REG* LazyAllocate(REG*& region); 129867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 129967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek template <typename REG, typename ARG> 130067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const REG* LazyAllocate(REG*& region, ARG a); 1301ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek}; 13021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1303250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 1304a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek// Out-of-line member definitions. 1305250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 1306250101353b711a409b075f1bc11070dddec7100bTed Kremenek 13079c378f705405d37f49795d5e915989de774fe11fTed Kremenekinline ASTContext &MemRegion::getContext() const { 1308a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek return getMemRegionManager()->getContext(); 1309a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek} 1310da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev 1311da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev//===----------------------------------------------------------------------===// 1312da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev// Means for storing region/symbol handling traits. 1313da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev//===----------------------------------------------------------------------===// 1314da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev 1315da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev/// Information about invalidation for a particular region/symbol. 1316da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsevclass RegionAndSymbolInvalidationTraits { 1317da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev typedef unsigned char StorageTypeForKinds; 1318da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev llvm::DenseMap<const MemRegion *, StorageTypeForKinds> MRTraitsMap; 1319da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev llvm::DenseMap<SymbolRef, StorageTypeForKinds> SymTraitsMap; 1320da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev 1321da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev typedef llvm::DenseMap<const MemRegion *, StorageTypeForKinds>::const_iterator 1322da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev const_region_iterator; 1323da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev typedef llvm::DenseMap<SymbolRef, StorageTypeForKinds>::const_iterator 1324da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev const_symbol_iterator; 1325da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev 1326da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsevpublic: 1327da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev /// \brief Describes different invalidation traits. 1328da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev enum InvalidationKinds { 1329da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev /// Tells that a region's contents is not changed. 1330b7a747b0c271faeeb8d0f886f0e691eb25f637d9Anton Yartsev TK_PreserveContents = 0x1, 1331b7a747b0c271faeeb8d0f886f0e691eb25f637d9Anton Yartsev /// Suppress pointer-escaping of a region. 133287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar TK_SuppressEscape = 0x2, 133387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Do not invalidate super region. 133487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar TK_DoNotInvalidateSuperRegion = 0x4, 133587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// When applied to a MemSpaceRegion, indicates the entire memory space 133687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// should be invalidated. 133787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar TK_EntireMemSpace = 0x8 1338da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev 1339da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev // Do not forget to extend StorageTypeForKinds if number of traits exceed 1340da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev // the number of bits StorageTypeForKinds can store. 1341da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev }; 1342da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev 1343da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev void setTrait(SymbolRef Sym, InvalidationKinds IK); 1344da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev void setTrait(const MemRegion *MR, InvalidationKinds IK); 13454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar bool hasTrait(SymbolRef Sym, InvalidationKinds IK) const; 13464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar bool hasTrait(const MemRegion *MR, InvalidationKinds IK) const; 1347da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev}; 1348eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 13495a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis} // end GR namespace 13505a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis 1351be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end clang namespace 13529e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1353250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 1354250101353b711a409b075f1bc11070dddec7100bTed Kremenek// Pretty-printing regions. 1355250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 1356250101353b711a409b075f1bc11070dddec7100bTed Kremenek 1357be91224894e1501133e224934285ba6440bf5b59Ted Kremeneknamespace llvm { 13589c378f705405d37f49795d5e915989de774fe11fTed Kremenekstatic inline raw_ostream &operator<<(raw_ostream &os, 13599ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremenek const clang::ento::MemRegion* R) { 13608800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek R->dumpToStream(os); 13618800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek return os; 1362be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} 1363be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end llvm namespace 13649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 13659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#endif 1366