MemRegion.h revision 511191ce8920160525611be2be754c32a0724c3e
19e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//== MemRegion.h - Abstract memory regions for static analysis --*- C++ -*--==//
29e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//
39e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//                     The LLVM Compiler Infrastructure
49e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//
59e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// This file is distributed under the University of Illinois Open Source
69e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// License. See LICENSE.TXT for details.
79e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//
89e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
99e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//
109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//  This file defines MemRegion and its subclasses.  MemRegion defines a
119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//  partially-typed abstraction of memory useful for path-sensitive dataflow
129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//  analyses.
139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//
149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#ifndef LLVM_CLANG_ANALYSIS_MEMREGION_H
179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#define LLVM_CLANG_ANALYSIS_MEMREGION_H
189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
19993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek#include "clang/AST/Decl.h"
20993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek#include "clang/AST/DeclObjC.h"
21993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek#include "clang/Analysis/PathSensitive/SymbolManager.h"
22511191ce8920160525611be2be754c32a0724c3eZhongxing Xu#include "clang/Analysis/PathSensitive/RValues.h"
239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/Support/Casting.h"
249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/ADT/FoldingSet.h"
259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/Support/Allocator.h"
269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include <string>
279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremeneknamespace llvm { class raw_ostream; }
299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremeneknamespace clang {
319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager;
339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemRegion - The root abstract class for all memory regions.
369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegion : public llvm::FoldingSetNode {
379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
38993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  enum Kind { MemSpaceRegionKind, SymbolicRegionKind,
399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek              // Typed regions.
409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek              BEG_TYPED_REGIONS,
41511191ce8920160525611be2be754c32a0724c3eZhongxing Xu              VarRegionKind, FieldRegionKind, ElementRegionKind,
42511191ce8920160525611be2be754c32a0724c3eZhongxing Xu              ObjCIvarRegionKind,
43178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu              AnonTypedRegionKind, AnonPointeeRegionKind,
449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek              END_TYPED_REGIONS };
459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate:
469e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const Kind kind;
479e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemRegion(Kind k) : kind(k) {}
509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  virtual ~MemRegion();
519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
529e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  // virtual MemExtent getExtent(MemRegionManager& mrm) const = 0;
549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  virtual void Profile(llvm::FoldingSetNodeID& ID) const = 0;
559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  std::string getString() const;
579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  virtual void print(llvm::raw_ostream& os) const;
589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  Kind getKind() const { return kind; }
609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion*) { return true; }
619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemSpaceRegion - A memory region that represents and "memory space";
649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek///  for example, the set of global variables, the stack frame, etc.
659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemSpaceRegion : public MemRegion {
669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
679e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion() : MemRegion(MemSpaceRegionKind) {}
689e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
709e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  //RegionExtent getExtent() const { return UndefinedExtent(); }
719e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
729e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == MemSpaceRegionKind;
769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
79993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// SubRegion - A region that subsets another larger region.  Most regions
80993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek///  are subclasses of SubRegion.
81993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass SubRegion : public MemRegion {
829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
83993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  const MemRegion* superRegion;
84993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  SubRegion(const MemRegion* sReg, Kind k) : MemRegion(k), superRegion(sReg) {}
859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const MemRegion* getSuperRegion() const {
889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return superRegion;
899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
92993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek    return R->getKind() > SymbolicRegionKind;
93993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  }
94993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek};
95993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
96993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// SymbolicRegion - A special, "non-concrete" region. Unlike other region
97993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek///  clases, SymbolicRegion represents a region that serves as an alias for
98993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek///  either a real region, a NULL pointer, etc.  It essentially is used to
99993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek///  map the concept of symbolic values into the domain of regions.  Symbolic
100993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek///  regions do not need to be typed.
101993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass SymbolicRegion : public MemRegion {
102993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekprotected:
103993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  const SymbolID sym;
104993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
105993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekpublic:
106993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  SymbolicRegion(const SymbolID s) : MemRegion(SymbolicRegionKind), sym(s) {}
107993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
108993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  SymbolID getSymbol() const {
109993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek    return sym;
110993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  }
111993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
112993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
113993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, SymbolID sym);
114993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
115993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  void print(llvm::raw_ostream& os) const;
116993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
117993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  static bool classof(const MemRegion* R) {
118993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek    return R->getKind() == SymbolicRegionKind;
119993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  }
120993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek};
121993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
122993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// TypedRegion - An abstract class representing regions that are typed.
123993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass TypedRegion : public SubRegion {
124993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekprotected:
125993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  TypedRegion(const MemRegion* sReg, Kind k) : SubRegion(sReg, k) {}
126993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
127993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekpublic:
128993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  virtual QualType getType() const = 0;
129993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
130993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  static bool classof(const MemRegion* R) {
1319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    unsigned k = R->getKind();
1329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return k > BEG_TYPED_REGIONS && k < END_TYPED_REGIONS;
1339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
1349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
1359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// AnonTypedRegion - An "anonymous" region that simply types a chunk
1379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek///  of memory.
1389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass AnonTypedRegion : public TypedRegion {
139178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xuprotected:
1409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  QualType T;
1419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1429e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
1439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  AnonTypedRegion(QualType t, MemRegion* sreg)
1459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : TypedRegion(sreg, AnonTypedRegionKind), T(t) {}
1469e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1479e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, QualType T,
148178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu                            const MemRegion* superRegion);
149178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
1509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
1519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  QualType getType() const { return T; }
1529e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
1559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
1579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == AnonTypedRegionKind;
1589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
1599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
1609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
161178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu/// AnonPointeeRegion - anonymous regions pointed-at by pointer function
162178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu///  parameters or pointer globals. In RegionStoreManager, we assume pointer
163178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu///  parameters or globals point at some anonymous region initially. Such
164178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu///  regions are not the regions associated with the pointers themselves, but
165178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu///  are identified with the VarDecl of the parameters or globals.
166178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xuclass AnonPointeeRegion : public AnonTypedRegion {
167178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  friend class MemRegionManager;
168178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  // VD - the pointer variable that points at this region.
169178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  const VarDecl* VD;
170178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
171178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  AnonPointeeRegion(const VarDecl* d, QualType t, MemRegion* sreg)
172178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu    : AnonTypedRegion(t, sreg), VD(d) {}
173178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
174178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xupublic:
175178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const VarDecl* PVD,
176178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu                            QualType T, const MemRegion* superRegion);
177178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu};
178178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
179178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu/// AnonHeapRegion - anonymous region created by malloc().
180178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xuclass AnonHeapRegion : public AnonTypedRegion {
181178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu};
182178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
1839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass DeclRegion : public TypedRegion {
1849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
1859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const Decl* D;
1869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
187993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  DeclRegion(const Decl* d, const MemRegion* sReg, Kind k)
1889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : TypedRegion(sReg, k), D(d) {}
1899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl* D,
1919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek                      const MemRegion* superRegion, Kind k);
1929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
1949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
1959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
1969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass VarRegion : public DeclRegion {
1989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
1999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
200993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  VarRegion(const VarDecl* vd, const MemRegion* sReg)
2019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : DeclRegion(vd, sReg, VarRegionKind) {}
2029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, VarDecl* VD,
2049e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek                      const MemRegion* superRegion) {
2059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, VD, superRegion, VarRegionKind);
2069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
2079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
2099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const VarDecl* getDecl() const { return cast<VarDecl>(D); }
2109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  QualType getType() const { return getDecl()->getType(); }
2119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  void print(llvm::raw_ostream& os) const;
2139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
2159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == VarRegionKind;
2169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
2179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
2189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass FieldRegion : public DeclRegion {
2209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
2219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
222993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  FieldRegion(const FieldDecl* fd, const MemRegion* sReg)
2239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : DeclRegion(fd, sReg, FieldRegionKind) {}
2249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2254bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenekpublic:
2264bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek
2274bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek  void print(llvm::raw_ostream& os) const;
2284bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek
2294bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek  const FieldDecl* getDecl() const { return cast<FieldDecl>(D); }
2304bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek  QualType getType() const { return getDecl()->getType(); }
2314bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek
2329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, FieldDecl* FD,
2339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek                      const MemRegion* superRegion) {
2349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, FD, superRegion, FieldRegionKind);
2359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
2369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
2389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == FieldRegionKind;
2399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
2409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
2419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2429e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass ObjCIvarRegion : public DeclRegion {
2439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
2459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
246993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  ObjCIvarRegion(const ObjCIvarDecl* ivd, const MemRegion* sReg)
2479e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : DeclRegion(ivd, sReg, ObjCIvarRegionKind) {}
2489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, ObjCIvarDecl* ivd,
2509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek                      const MemRegion* superRegion) {
2519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCIvarRegionKind);
2529e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
2539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
2559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const ObjCIvarDecl* getDecl() const { return cast<ObjCIvarDecl>(D); }
2569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  QualType getType() const { return getDecl()->getType(); }
2579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
2599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == ObjCIvarRegionKind;
2609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
2619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
262511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
263511191ce8920160525611be2be754c32a0724c3eZhongxing Xuclass ElementRegion : public SubRegion {
264511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  friend class MemRegionManager;
265511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
266511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  SVal Index;
267511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
268511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  ElementRegion(SVal Idx, const MemRegion* sReg)
269511191ce8920160525611be2be754c32a0724c3eZhongxing Xu    : SubRegion(sReg, ElementRegionKind), Index(Idx) {}
270511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
271511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID& ID, SVal Idx,
272511191ce8920160525611be2be754c32a0724c3eZhongxing Xu                            const MemRegion* superRegion);
273511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
274511191ce8920160525611be2be754c32a0724c3eZhongxing Xupublic:
275511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
276511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const;
277511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
278511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  static bool classof(const MemRegion* R) {
279511191ce8920160525611be2be754c32a0724c3eZhongxing Xu    return R->getKind() == ElementRegionKind;
280511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  }
281511191ce8920160525611be2be754c32a0724c3eZhongxing Xu};
282511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
2839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
2849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager - Factory object for creating regions.
2859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
2869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager {
2889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  llvm::BumpPtrAllocator& A;
2899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  llvm::FoldingSet<MemRegion> Regions;
2909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* globals;
2929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* stack;
2939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* heap;
294178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  MemSpaceRegion* unknown;
2959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
2979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemRegionManager(llvm::BumpPtrAllocator& a)
2989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  : A(a), globals(0), stack(0), heap(0) {}
2999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ~MemRegionManager() {}
3019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getStackRegion - Retrieve the memory region associated with the
3039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  current stack frame.
3049e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* getStackRegion();
3059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getGlobalsRegion - Retrieve the memory region associated with
3079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  all global variables.
3089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* getGlobalsRegion();
3099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getHeapRegion - Retrieve the memory region associated with the
3119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  generic "heap".
3129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* getHeapRegion();
313178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
314178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  /// getUnknownRegion - Retrieve the memory region associated with unknown
315178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  /// memory space.
316178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  MemSpaceRegion* getUnknownRegion();
3179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
318993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  /// getSymbolicRegion - Retrieve or create a "symbolic" memory region.
319993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  SymbolicRegion* getSymbolicRegion(const SymbolID sym);
320993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
3219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getVarRegion - Retrieve or create the memory region associated with
3229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  a specified VarDecl.  'superRegion' corresponds to the containing
3239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  memory region, and 'off' is the offset within the containing region.
324993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  VarRegion* getVarRegion(const VarDecl* vd, const MemRegion* superRegion);
3259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  VarRegion* getVarRegion(const VarDecl* vd) {
3279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return getVarRegion(vd, vd->hasLocalStorage() ? getStackRegion()
3289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek                        : getGlobalsRegion());
3299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
330511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
331511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  ElementRegion* getElementRegion(SVal Idx, const MemRegion* superRegion);
332511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
3339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getFieldRegion - Retrieve or create the memory region associated with
3349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  a specified FieldDecl.  'superRegion' corresponds to the containing
3359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  memory region (which typically represents the memory representing
3369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  a structure or class).
337993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  FieldRegion* getFieldRegion(const FieldDecl* fd, const MemRegion* superRegion);
3389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getObjCIvarRegion - Retrieve or create the memory region associated with
3409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   a specified Objective-c instance variable.  'superRegion' corresponds
3419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   to the containing region (which typically represents the Objective-C
3429e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   object).
3439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ObjCIvarRegion* getObjCIvarRegion(const ObjCIvarDecl* ivd,
344993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek                                    const MemRegion* superRegion);
345178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
346178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  AnonPointeeRegion* getAnonPointeeRegion(const VarDecl* d);
347178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
3489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  bool hasStackStorage(const MemRegion* R);
3499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate:
3519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* LazyAllocate(MemSpaceRegion*& region);
3529e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
3539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} // end clang namespace
3579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#endif
358