MemRegion.h revision e0d24eb1060a213ec9820dc02c45f26b2d5b348b
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 165a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis#ifndef LLVM_CLANG_GR_MEMREGION_H 175a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis#define LLVM_CLANG_GR_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" 224c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek#include "clang/AST/ExprObjC.h" 23d47d3b0cfeb7e8564ff77f48130fe63282b6d127Chris Lattner#include "clang/Basic/LLVM.h" 249b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenek#include "clang/StaticAnalyzer/Core/PathSensitive/SVals.h" 259c1845dbed9817520f5a7db8bd80a560c6c6ae6bArgyrios Kyrtzidis#include "llvm/Support/ErrorHandling.h" 269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/ADT/FoldingSet.h" 279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include <string> 289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 295e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramernamespace llvm { 305e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramerclass BumpPtrAllocator; 315e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramer} 329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremeneknamespace clang { 341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenekclass LocationContext; 3667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackFrameContext; 375a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis 389ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremeneknamespace ento { 395a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis 405a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidisclass MemRegionManager; 415a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidisclass MemSpaceRegion; 42c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenekclass SValBuilder; 434240096011a187807058f887eb81df750ffa17feTed Kremenekclass VarRegion; 44dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekclass CodeTextRegion; 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 51e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu /// The bit offset within the base region. It shouldn't be negative. 52e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu int64_t Offset; 53e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu 54e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xupublic: 55e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose RegionOffset() : R(0) {} 56e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu RegionOffset(const MemRegion *r, int64_t off) : R(r), Offset(off) {} 57e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu 58e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu const MemRegion *getRegion() const { return R; } 59e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu int64_t getOffset() const { return Offset; } 60e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose 61e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose bool isValid() const { return R; } 62e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu}; 63e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu 6419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===// 6519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// Base region classes. 6619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===// 671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 689e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemRegion - The root abstract class for all memory regions. 699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegion : public llvm::FoldingSetNode { 704240096011a187807058f887eb81df750ffa17feTed Kremenek friend class MemRegionManager; 719e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 7267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek enum Kind { 7367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek // Memory spaces. 74dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek GenericMemSpaceRegionKind, 7567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StackLocalsSpaceRegionKind, 7667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StackArgumentsSpaceRegionKind, 7767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek HeapSpaceRegionKind, 782b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek UnknownSpaceRegionKind, 79dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek StaticGlobalSpaceRegionKind, 80eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalInternalSpaceRegionKind, 81eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalSystemSpaceRegionKind, 82eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalImmutableSpaceRegionKind, 83eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks BEG_NON_STATIC_GLOBAL_MEMSPACES = GlobalInternalSpaceRegionKind, 84eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks END_NON_STATIC_GLOBAL_MEMSPACES = GlobalImmutableSpaceRegionKind, 85eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks BEG_GLOBAL_MEMSPACES = StaticGlobalSpaceRegionKind, 86eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks END_GLOBAL_MEMSPACES = GlobalImmutableSpaceRegionKind, 87dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek BEG_MEMSPACES = GenericMemSpaceRegionKind, 88eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks END_MEMSPACES = GlobalImmutableSpaceRegionKind, 8967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek // Untyped regions. 9067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek SymbolicRegionKind, 9167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek AllocaRegionKind, 929697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek BlockDataRegionKind, 9367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek // Typed regions. 9467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BEG_TYPED_REGIONS, 9567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek FunctionTextRegionKind = BEG_TYPED_REGIONS, 9667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BlockTextRegionKind, 979697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek BEG_TYPED_VALUE_REGIONS, 989697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek CompoundLiteralRegionKind = BEG_TYPED_VALUE_REGIONS, 99de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek CXXThisRegionKind, 10067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StringRegionKind, 1014c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek ObjCStringRegionKind, 10267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek ElementRegionKind, 10367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek // Decl Regions. 10467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BEG_DECL_REGIONS, 10567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek VarRegionKind = BEG_DECL_REGIONS, 10667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek FieldRegionKind, 10767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek ObjCIvarRegionKind, 1084fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu END_DECL_REGIONS = ObjCIvarRegionKind, 10902fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu CXXTempObjectRegionKind, 1104fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu CXXBaseObjectRegionKind, 111096aef9597b263b4cd6a0feaacf9e7214fa9c75aJordy Rose END_TYPED_VALUE_REGIONS = CXXBaseObjectRegionKind, 112096aef9597b263b4cd6a0feaacf9e7214fa9c75aJordy Rose END_TYPED_REGIONS = CXXBaseObjectRegionKind 11367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek }; 11467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 1159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate: 1169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const Kind kind; 1171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 1199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemRegion(Kind k) : kind(k) {} 1209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek virtual ~MemRegion(); 1219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 123a6275a534da701f37d19a068e6361e5f10f983a1Ted Kremenek ASTContext &getContext() const; 1241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek virtual void Profile(llvm::FoldingSetNodeID& ID) const = 0; 126a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 127a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek virtual MemRegionManager* getMemRegionManager() const = 0; 128a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 129bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek const MemSpaceRegion *getMemorySpace() const; 1301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 131adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu const MemRegion *getBaseRegion() const; 132adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu 133479529e679957fbb92b56e116e3c86734429331eZhongxing Xu const MemRegion *StripCasts() const; 1341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1351508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek bool hasGlobalsOrParametersStorage() const; 1361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 137de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek bool hasStackStorage() const; 138de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 139de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek bool hasStackNonParametersStorage() const; 140de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 141de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek bool hasStackParametersStorage() const; 142b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 143e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu /// Compute the offset within the top level memory object. 144e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu RegionOffset getAsOffset() const; 145e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu 1463d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks /// \brief Get a string representation of a region for debug use. 1473d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks std::string getString() const; 1483d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks 1499c378f705405d37f49795d5e915989de774fe11fTed Kremenek virtual void dumpToStream(raw_ostream &os) const; 1507f39d29cb69e7488f994870800d548008e50e1cbTed Kremenek 1518800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek void dump() const; 1521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1533d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks /// \brief Print the region for use in diagnostics. 1543d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks virtual void dumpPretty(raw_ostream &os) const; 1553d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks 1561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Kind getKind() const { return kind; } 1571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 158ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek template<typename RegionTy> const RegionTy* getAs() const; 1591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 160f0f0605c87739c906861f73d4287798a4969b1e0Zhongxing Xu virtual bool isBoundable() const { return false; } 161b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 1629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion*) { return true; } 1639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 1641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 165eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// MemSpaceRegion - A memory region that represents a "memory space"; 1669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// for example, the set of global variables, the stack frame, etc. 1679e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemSpaceRegion : public MemRegion { 168a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenekprotected: 16967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 17067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 171a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek MemRegionManager *Mgr; 172a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 17367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek MemSpaceRegion(MemRegionManager *mgr, Kind k = GenericMemSpaceRegionKind) 17467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : MemRegion(k), Mgr(mgr) { 17567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek assert(classof(this)); 17667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 17767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 17867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek MemRegionManager* getMemRegionManager() const { return Mgr; } 1791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 18067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 18167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek bool isBoundable() const { return false; } 18267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 18367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek void Profile(llvm::FoldingSetNodeID &ID) const; 18467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 18567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 18667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek Kind k = R->getKind(); 18767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return k >= BEG_MEMSPACES && k <= END_MEMSPACES; 188a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek } 18967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 19067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 19167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass GlobalsSpaceRegion : public MemSpaceRegion { 19299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 193dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekprotected: 194dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek GlobalsSpaceRegion(MemRegionManager *mgr, Kind k) 195dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek : MemSpaceRegion(mgr, k) {} 196dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekpublic: 197dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek static bool classof(const MemRegion *R) { 198dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek Kind k = R->getKind(); 199dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek return k >= BEG_GLOBAL_MEMSPACES && k <= END_GLOBAL_MEMSPACES; 200dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek } 201dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek}; 202eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 203914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region of the static variables within the current CodeTextRegion 204eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// scope. 205914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// 206eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// Currently, only the static locals are placed there, so we know that these 207eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// variables do not get invalidated by calls to other functions. 208dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekclass StaticGlobalSpaceRegion : public GlobalsSpaceRegion { 20967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 210a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 211dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek const CodeTextRegion *CR; 212dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 213dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek StaticGlobalSpaceRegion(MemRegionManager *mgr, const CodeTextRegion *cr) 214dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek : GlobalsSpaceRegion(mgr, StaticGlobalSpaceRegionKind), CR(cr) {} 215dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 216dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekpublic: 217dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek void Profile(llvm::FoldingSetNodeID &ID) const; 218dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 2199c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 220fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek 221dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek const CodeTextRegion *getCodeRegion() const { return CR; } 222dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 223dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek static bool classof(const MemRegion *R) { 224dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek return R->getKind() == StaticGlobalSpaceRegionKind; 225dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek } 226dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek}; 227eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 228914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region for all the non-static global variables. 229eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// 230eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// This class is further split into subclasses for efficient implementation of 231eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// invalidating a set of related global values as is done in 232eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// RegionStoreManager::invalidateRegions (instead of finding all the dependent 233eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// globals, we invalidate the whole parent region). 234dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekclass NonStaticGlobalSpaceRegion : public GlobalsSpaceRegion { 235dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek friend class MemRegionManager; 236dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 237eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksprotected: 238eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks NonStaticGlobalSpaceRegion(MemRegionManager *mgr, Kind k) 239eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks : GlobalsSpaceRegion(mgr, k) {} 240dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 2419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 242fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek 24367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 244eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks Kind k = R->getKind(); 245eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks return k >= BEG_NON_STATIC_GLOBAL_MEMSPACES && 246eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks k <= END_NON_STATIC_GLOBAL_MEMSPACES; 24767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 24867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 249eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 250914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region containing globals which are defined in system/external 251eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// headers and are considered modifiable by system calls (ex: errno). 252eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksclass GlobalSystemSpaceRegion : public NonStaticGlobalSpaceRegion { 253eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks friend class MemRegionManager; 254eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 255eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalSystemSpaceRegion(MemRegionManager *mgr) 256eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks : NonStaticGlobalSpaceRegion(mgr, GlobalSystemSpaceRegionKind) {} 257eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 258eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zakspublic: 259eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 260eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks void dumpToStream(raw_ostream &os) const; 261eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 262eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks static bool classof(const MemRegion *R) { 263eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks return R->getKind() == GlobalSystemSpaceRegionKind; 264eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks } 265eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks}; 266eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 267914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region containing globals which are considered not to be modified 268eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// or point to data which could be modified as a result of a function call 269eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// (system or internal). Ex: Const global scalars would be modeled as part of 270eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// this region. This region also includes most system globals since they have 271eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// low chance of being modified. 272eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksclass GlobalImmutableSpaceRegion : public NonStaticGlobalSpaceRegion { 273eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks friend class MemRegionManager; 274eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 275eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalImmutableSpaceRegion(MemRegionManager *mgr) 276eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks : NonStaticGlobalSpaceRegion(mgr, GlobalImmutableSpaceRegionKind) {} 277eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 278eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zakspublic: 279eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 280eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks void dumpToStream(raw_ostream &os) const; 281eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 282eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks static bool classof(const MemRegion *R) { 283eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks return R->getKind() == GlobalImmutableSpaceRegionKind; 284eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks } 285eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks}; 286eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 287914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region containing globals which can be modified by calls to 288eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// "internally" defined functions - (for now just) functions other then system 289eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// calls. 290eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksclass GlobalInternalSpaceRegion : public NonStaticGlobalSpaceRegion { 291eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks friend class MemRegionManager; 292eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 293eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalInternalSpaceRegion(MemRegionManager *mgr) 294eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks : NonStaticGlobalSpaceRegion(mgr, GlobalInternalSpaceRegionKind) {} 295eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 296eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zakspublic: 297eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 298eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks void dumpToStream(raw_ostream &os) const; 299eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 300eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks static bool classof(const MemRegion *R) { 301eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks return R->getKind() == GlobalInternalSpaceRegionKind; 302eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks } 303eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks}; 304eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 30567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass HeapSpaceRegion : public MemSpaceRegion { 30699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 30767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 30867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 30967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek HeapSpaceRegion(MemRegionManager *mgr) 31067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : MemSpaceRegion(mgr, HeapSpaceRegionKind) {} 31167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 31236397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 31336397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose void dumpToStream(raw_ostream &os) const; 31436397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 31567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 31667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return R->getKind() == HeapSpaceRegionKind; 31767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 31867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 31967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 3202b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenekclass UnknownSpaceRegion : public MemSpaceRegion { 32199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 3222b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek friend class MemRegionManager; 3232b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek UnknownSpaceRegion(MemRegionManager *mgr) 3242b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek : MemSpaceRegion(mgr, UnknownSpaceRegionKind) {} 3252b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenekpublic: 32636397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 32736397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose void dumpToStream(raw_ostream &os) const; 32836397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 3292b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek static bool classof(const MemRegion *R) { 3302b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek return R->getKind() == UnknownSpaceRegionKind; 3312b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek } 3322b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek}; 3332b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek 33467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackSpaceRegion : public MemSpaceRegion { 33567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate: 33667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackFrameContext *SFC; 3379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 33867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprotected: 33967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StackSpaceRegion(MemRegionManager *mgr, Kind k, const StackFrameContext *sfc) 34067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : MemSpaceRegion(mgr, k), SFC(sfc) { 34167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek assert(classof(this)); 34267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 34341168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek 34467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 34567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackFrameContext *getStackFrame() const { return SFC; } 34667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 34767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek void Profile(llvm::FoldingSetNodeID &ID) const; 34867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 34967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 35067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek Kind k = R->getKind(); 35167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return k >= StackLocalsSpaceRegionKind && 35267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek k <= StackArgumentsSpaceRegionKind; 35367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 35467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 35567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 35667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackLocalsSpaceRegion : public StackSpaceRegion { 35799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 35867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 35967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StackLocalsSpaceRegion(MemRegionManager *mgr, const StackFrameContext *sfc) 36067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : StackSpaceRegion(mgr, StackLocalsSpaceRegionKind, sfc) {} 36167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 36236397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 36336397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose void dumpToStream(raw_ostream &os) const; 36436397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 36567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 36667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return R->getKind() == StackLocalsSpaceRegionKind; 36767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 36867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 36967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 37067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackArgumentsSpaceRegion : public StackSpaceRegion { 37167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate: 37299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 37367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 37467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StackArgumentsSpaceRegion(MemRegionManager *mgr, const StackFrameContext *sfc) 37567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : StackSpaceRegion(mgr, StackArgumentsSpaceRegionKind, sfc) {} 37667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 37736397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 37836397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose void dumpToStream(raw_ostream &os) const; 37936397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 38067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 38167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return R->getKind() == StackArgumentsSpaceRegionKind; 3829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 3849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3857caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 386993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// SubRegion - A region that subsets another larger region. Most regions 387993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// are subclasses of SubRegion. 388993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass SubRegion : public MemRegion { 38999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikieprivate: 39099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 3919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 3921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const MemRegion* superRegion; 393993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek SubRegion(const MemRegion* sReg, Kind k) : MemRegion(k), superRegion(sReg) {} 3949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 3959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* getSuperRegion() const { 3969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return superRegion; 3979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 39932f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose /// getExtent - Returns the size of the region in bytes. 400c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek virtual DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const { 40132f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose return UnknownVal(); 40232f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose } 40332f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 404a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek MemRegionManager* getMemRegionManager() const; 4051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4067e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu bool isSubRegionOf(const MemRegion* R) const; 4071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 40967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return R->getKind() > END_MEMSPACES; 410993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek } 411993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek}; 4121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 41319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===// 41419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// MemRegion subclasses. 4151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump//===----------------------------------------------------------------------===// 416ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 41782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek/// AllocaRegion - A region that represents an untyped blob of bytes created 41882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek/// by a call to 'alloca'. 41982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekclass AllocaRegion : public SubRegion { 42082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek friend class MemRegionManager; 42182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekprotected: 42282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek unsigned Cnt; // Block counter. Used to distinguish different pieces of 42382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek // memory allocated by alloca at the same call site. 4249c378f705405d37f49795d5e915989de774fe11fTed Kremenek const Expr *Ex; 42582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 4269c378f705405d37f49795d5e915989de774fe11fTed Kremenek AllocaRegion(const Expr *ex, unsigned cnt, const MemRegion *superRegion) 42782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek : SubRegion(superRegion, AllocaRegionKind), Cnt(cnt), Ex(ex) {} 4281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 42982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekpublic: 4301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4319c378f705405d37f49795d5e915989de774fe11fTed Kremenek const Expr *getExpr() const { return Ex; } 4329852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu 4339852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu bool isBoundable() const { return true; } 4349852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu 435c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const; 43632f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 43782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 43882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 4399c378f705405d37f49795d5e915989de774fe11fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Expr *Ex, 4407ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek unsigned Cnt, const MemRegion *superRegion); 4411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4429c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 4431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 44482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek static bool classof(const MemRegion* R) { 44582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek return R->getKind() == AllocaRegionKind; 44682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek } 4471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}; 4481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 449993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// TypedRegion - An abstract class representing regions that are typed. 450993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass TypedRegion : public SubRegion { 45199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikiepublic: 45299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 453993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekprotected: 454993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek TypedRegion(const MemRegion* sReg, Kind k) : SubRegion(sReg, k) {} 4551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 456993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekpublic: 4579697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek virtual QualType getLocationType() const = 0; 4589697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek 4599697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek QualType getDesugaredLocationType(ASTContext &Context) const { 4609697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek return getLocationType().getDesugaredType(Context); 4619697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek } 4629697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek 4639697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek bool isBoundable() const { return true; } 4649697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek 4659697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek static bool classof(const MemRegion* R) { 4669697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek unsigned k = R->getKind(); 4679697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek return k >= BEG_TYPED_REGIONS && k <= END_TYPED_REGIONS; 4689697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek } 4699697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek}; 4709697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek 4719697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek/// TypedValueRegion - An abstract class representing regions having a typed value. 4729697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass TypedValueRegion : public TypedRegion { 47399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikiepublic: 47499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 4759697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekprotected: 4769697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek TypedValueRegion(const MemRegion* sReg, Kind k) : TypedRegion(sReg, k) {} 4779697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek 4789697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekpublic: 479018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu virtual QualType getValueType() const = 0; 4801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 481018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu virtual QualType getLocationType() const { 4826eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek // FIXME: We can possibly optimize this later to cache this value. 483a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek QualType T = getValueType(); 484a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek ASTContext &ctx = getContext(); 485a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek if (T->getAs<ObjCObjectType>()) 486a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek return ctx.getObjCObjectPointerType(T); 487a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek return ctx.getPointerType(getValueType()); 4886eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek } 4891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 49049f4e1cbd839da27ff4814b4ea6d85a79f786cbdJohn McCall QualType getDesugaredValueType(ASTContext &Context) const { 491018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType T = getValueType(); 4921ab55e9bb87d98bff1d42c7a0ee502c64755d9f5Douglas Gregor return T.getTypePtrOrNull() ? T.getDesugaredType(Context) : T; 49314553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek } 4941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 495e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const; 496e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose 497993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek static bool classof(const MemRegion* R) { 4989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek unsigned k = R->getKind(); 4999697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek return k >= BEG_TYPED_VALUE_REGIONS && k <= END_TYPED_VALUE_REGIONS; 5009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 5019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 5029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 503ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 504eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass CodeTextRegion : public TypedRegion { 50599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikiepublic: 50699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 507eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekprotected: 508eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek CodeTextRegion(const MemRegion *sreg, Kind k) : TypedRegion(sreg, k) {} 509ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xupublic: 510eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek bool isBoundable() const { return false; } 511eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 512eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek static bool classof(const MemRegion* R) { 513eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek Kind k = R->getKind(); 514eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return k >= FunctionTextRegionKind && k <= BlockTextRegionKind; 515eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek } 516eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek}; 517ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 518eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek/// FunctionTextRegion - A region that represents code texts of function. 519eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass FunctionTextRegion : public CodeTextRegion { 520eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek const FunctionDecl *FD; 521eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekpublic: 5229c378f705405d37f49795d5e915989de774fe11fTed Kremenek FunctionTextRegion(const FunctionDecl *fd, const MemRegion* sreg) 523eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek : CodeTextRegion(sreg, FunctionTextRegionKind), FD(fd) {} 524eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 525018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getLocationType() const { 526018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu return getContext().getPointerType(FD->getType()); 527ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu } 528eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 529abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek const FunctionDecl *getDecl() const { 530abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek return FD; 53172e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek } 532eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 5339c378f705405d37f49795d5e915989de774fe11fTed Kremenek virtual void dumpToStream(raw_ostream &os) const; 534eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 535ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const; 536eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 537abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const FunctionDecl *FD, 538abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek const MemRegion*); 539eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 540ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu static bool classof(const MemRegion* R) { 541eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return R->getKind() == FunctionTextRegionKind; 542eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek } 543eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek}; 544eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 545eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 546eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek/// BlockTextRegion - A region that represents code texts of blocks (closures). 5470a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// Blocks are represented with two kinds of regions. BlockTextRegions 5480a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// represent the "code", while BlockDataRegions represent instances of blocks, 5490a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// which correspond to "code+data". The distinction is important, because 5500a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// like a closure a block captures the values of externally referenced 5510a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// variables. 552eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass BlockTextRegion : public CodeTextRegion { 55367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 55467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 555eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek const BlockDecl *BD; 5561d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContext *AC; 557eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek CanQualType locTy; 55867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 55967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BlockTextRegion(const BlockDecl *bd, CanQualType lTy, 5601d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContext *ac, const MemRegion* sreg) 56167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : CodeTextRegion(sreg, BlockTextRegionKind), BD(bd), AC(ac), locTy(lTy) {} 56267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 56367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 564018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getLocationType() const { 565eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return locTy; 566eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek } 567eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 568eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek const BlockDecl *getDecl() const { 569eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return BD; 570eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek } 57167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 5721d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContext *getAnalysisDeclContext() const { return AC; } 573eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 5749c378f705405d37f49795d5e915989de774fe11fTed Kremenek virtual void dumpToStream(raw_ostream &os) const; 575eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 576eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 577eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 578eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const BlockDecl *BD, 5791d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek CanQualType, const AnalysisDeclContext*, 58067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const MemRegion*); 581eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 582eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek static bool classof(const MemRegion* R) { 583eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return R->getKind() == BlockTextRegionKind; 584ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu } 585ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu}; 5860a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 5870a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// BlockDataRegion - A region that represents a block instance. 5880a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// Blocks are represented with two kinds of regions. BlockTextRegions 5890a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// represent the "code", while BlockDataRegions represent instances of blocks, 5900a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// which correspond to "code+data". The distinction is important, because 5910a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// like a closure a block captures the values of externally referenced 5920a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// variables. 5930a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenekclass BlockDataRegion : public SubRegion { 59467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 5950a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek const BlockTextRegion *BC; 59667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *LC; // Can be null */ 5974240096011a187807058f887eb81df750ffa17feTed Kremenek void *ReferencedVars; 59885d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek void *OriginalVars; 59967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 60067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BlockDataRegion(const BlockTextRegion *bc, const LocationContext *lc, 6010a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek const MemRegion *sreg) 60285d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek : SubRegion(sreg, BlockDataRegionKind), BC(bc), LC(lc), 60385d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek ReferencedVars(0), OriginalVars(0) {} 6040a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 60585d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenekpublic: 6060a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek const BlockTextRegion *getCodeRegion() const { return BC; } 6074240096011a187807058f887eb81df750ffa17feTed Kremenek 608d02e83a548359df978f40cc1a52ffd78b7ef371bTed Kremenek const BlockDecl *getDecl() const { return BC->getDecl(); } 609d02e83a548359df978f40cc1a52ffd78b7ef371bTed Kremenek 61081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek class referenced_vars_iterator { 61181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek const MemRegion * const *R; 61285d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek const MemRegion * const *OriginalR; 61381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek public: 61485d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek explicit referenced_vars_iterator(const MemRegion * const *r, 61585d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek const MemRegion * const *originalR) 61685d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek : R(r), OriginalR(originalR) {} 61781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek 61881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek operator const MemRegion * const *() const { 61981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return R; 62081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 62185d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek 62285d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek const MemRegion *getCapturedRegion() const { 62385d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek return *R; 62485d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek } 62585d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek const MemRegion *getOriginalRegion() const { 62685d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek return *OriginalR; 62785d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek } 62885d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek 62981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek const VarRegion* operator*() const { 63081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return cast<VarRegion>(*R); 63181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 63281cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek 63381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek bool operator==(const referenced_vars_iterator &I) const { 63481cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return I.R == R; 63581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 63681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek bool operator!=(const referenced_vars_iterator &I) const { 63781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return I.R != R; 63881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 6399c378f705405d37f49795d5e915989de774fe11fTed Kremenek referenced_vars_iterator &operator++() { 64081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek ++R; 64185d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek ++OriginalR; 64281cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return *this; 64381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 64481cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek }; 64581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek 6464240096011a187807058f887eb81df750ffa17feTed Kremenek referenced_vars_iterator referenced_vars_begin() const; 6474240096011a187807058f887eb81df750ffa17feTed Kremenek referenced_vars_iterator referenced_vars_end() const; 6480a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 6499c378f705405d37f49795d5e915989de774fe11fTed Kremenek virtual void dumpToStream(raw_ostream &os) const; 6500a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 6510a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 6520a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 65367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID&, const BlockTextRegion *, 65467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *, const MemRegion *); 6550a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 6560a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek static bool classof(const MemRegion* R) { 6570a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek return R->getKind() == BlockDataRegionKind; 6580a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek } 6594240096011a187807058f887eb81df750ffa17feTed Kremenekprivate: 6604240096011a187807058f887eb81df750ffa17feTed Kremenek void LazyInitializeReferencedVars(); 6610a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek}; 662ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 663026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// SymbolicRegion - A special, "non-concrete" region. Unlike other region 664026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// clases, SymbolicRegion represents a region that serves as an alias for 665026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// either a real region, a NULL pointer, etc. It essentially is used to 666026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// map the concept of symbolic values into the domain of regions. Symbolic 667026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// regions do not need to be typed. 668e8e86482da4c1872673bbb9c237649229d19793bTed Kremenekclass SymbolicRegion : public SubRegion { 669026c66395b88a09437319139a43b090093f7e1ddZhongxing Xuprotected: 670026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu const SymbolRef sym; 671026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 672026c66395b88a09437319139a43b090093f7e1ddZhongxing Xupublic: 6731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SymbolicRegion(const SymbolRef s, const MemRegion* sreg) 674e8e86482da4c1872673bbb9c237649229d19793bTed Kremenek : SubRegion(sreg, SymbolicRegionKind), sym(s) {} 6751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 676026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu SymbolRef getSymbol() const { 677026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu return sym; 678026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu } 679026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 6809852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu bool isBoundable() const { return true; } 6819852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu 682c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const; 68332f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 684026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const; 685026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 686250101353b711a409b075f1bc11070dddec7100bTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, 687250101353b711a409b075f1bc11070dddec7100bTed Kremenek SymbolRef sym, 688250101353b711a409b075f1bc11070dddec7100bTed Kremenek const MemRegion* superRegion); 6891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6909c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 6911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 692026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu static bool classof(const MemRegion* R) { 693026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu return R->getKind() == SymbolicRegionKind; 694026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu } 6951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}; 696026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 697e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu/// StringRegion - Region associated with a StringLiteral. 6989697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass StringRegion : public TypedValueRegion { 699e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu friend class MemRegionManager; 700e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const StringLiteral* Str; 701e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuprotected: 702e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 703250101353b711a409b075f1bc11070dddec7100bTed Kremenek StringRegion(const StringLiteral* str, const MemRegion* sreg) 7049697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sreg, StringRegionKind), Str(str) {} 705e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 706e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID& ID, 707e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const StringLiteral* Str, 708e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const MemRegion* superRegion); 709e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 710e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xupublic: 7116613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu 7126613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu const StringLiteral* getStringLiteral() const { return Str; } 7131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 714018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 715ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu return Str->getType(); 716ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu } 717e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 718c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const; 71932f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 7200a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu bool isBoundable() const { return false; } 7210a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu 722e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const { 723e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu ProfileRegion(ID, Str, superRegion); 724e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 725e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 7269c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 727cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu 728e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static bool classof(const MemRegion* R) { 729e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu return R->getKind() == StringRegionKind; 730e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 731e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu}; 7324c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7334c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek/// The region associated with an ObjCStringLiteral. 7344c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekclass ObjCStringRegion : public TypedValueRegion { 7354c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek friend class MemRegionManager; 7364c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek const ObjCStringLiteral* Str; 7374c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekprotected: 7384c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7394c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek ObjCStringRegion(const ObjCStringLiteral* str, const MemRegion* sreg) 7404c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek : TypedValueRegion(sreg, ObjCStringRegionKind), Str(str) {} 7414c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7424c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, 7434c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek const ObjCStringLiteral* Str, 7444c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek const MemRegion* superRegion); 7454c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7464c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekpublic: 7474c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7484c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek const ObjCStringLiteral* getObjCStringLiteral() const { return Str; } 7494c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7504c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek QualType getValueType() const { 7514c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek return Str->getType(); 7524c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek } 7534c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7544c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek bool isBoundable() const { return false; } 7554c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7564c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek void Profile(llvm::FoldingSetNodeID& ID) const { 7574c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek ProfileRegion(ID, Str, superRegion); 7584c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek } 7594c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7604c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek void dumpToStream(raw_ostream &os) const; 7614c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7624c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek static bool classof(const MemRegion* R) { 7634c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek return R->getKind() == ObjCStringRegionKind; 7644c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek } 7654c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek}; 766e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 767329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// CompoundLiteralRegion - A memory region representing a compound literal. 768329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// Compound literals are essentially temporaries that are stack allocated 769329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// or in the global constant pool. 7709697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CompoundLiteralRegion : public TypedValueRegion { 771329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekprivate: 772329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek friend class MemRegionManager; 7739c378f705405d37f49795d5e915989de774fe11fTed Kremenek const CompoundLiteralExpr *CL; 774329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 7759c378f705405d37f49795d5e915989de774fe11fTed Kremenek CompoundLiteralRegion(const CompoundLiteralExpr *cl, const MemRegion* sReg) 7769697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sReg, CompoundLiteralRegionKind), CL(cl) {} 7771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 778329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, 7799c378f705405d37f49795d5e915989de774fe11fTed Kremenek const CompoundLiteralExpr *CL, 780329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek const MemRegion* superRegion); 781329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekpublic: 782018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 783018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu return CL->getType(); 78477cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu } 7850a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu 7869a08fee80a34938b8c11c7166e009a89ced4c2b4Zhongxing Xu bool isBoundable() const { return !CL->isFileScope(); } 7879a08fee80a34938b8c11c7166e009a89ced4c2b4Zhongxing Xu 788329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 7891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7909c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 791329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 7929c378f705405d37f49795d5e915989de774fe11fTed Kremenek const CompoundLiteralExpr *getLiteralExpr() const { return CL; } 7931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 794329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek static bool classof(const MemRegion* R) { 795329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek return R->getKind() == CompoundLiteralRegionKind; 796329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek } 797329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek}; 798178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 7999697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass DeclRegion : public TypedValueRegion { 8009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 8019c378f705405d37f49795d5e915989de774fe11fTed Kremenek const Decl *D; 8029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 8039c378f705405d37f49795d5e915989de774fe11fTed Kremenek DeclRegion(const Decl *d, const MemRegion* sReg, Kind k) 8049697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sReg, k), D(d) {} 8059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 8069c378f705405d37f49795d5e915989de774fe11fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl *D, 8079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion, Kind k); 8081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 809bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xupublic: 8109c378f705405d37f49795d5e915989de774fe11fTed Kremenek const Decl *getDecl() const { return D; } 8119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 8121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 813e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static bool classof(const MemRegion* R) { 814e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu unsigned k = R->getKind(); 81567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return k >= BEG_DECL_REGIONS && k <= END_DECL_REGIONS; 816e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 8179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 8181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass VarRegion : public DeclRegion { 8209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 821d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek 822d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek // Constructors and private methods. 8239c378f705405d37f49795d5e915989de774fe11fTed Kremenek VarRegion(const VarDecl *vd, const MemRegion* sReg) 82467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : DeclRegion(vd, sReg, VarRegionKind) {} 8259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 8269c378f705405d37f49795d5e915989de774fe11fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const VarDecl *VD, 827d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek const MemRegion *superRegion) { 8289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, VD, superRegion, VarRegionKind); 8299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 8301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 831d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 8321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic: 834d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek const VarDecl *getDecl() const { return cast<VarDecl>(D); } 8351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8365348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek const StackFrameContext *getStackFrame() const; 8375348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek 838018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 8396eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek // FIXME: We can cache this if needed. 840018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu return getDecl()->getType(); 8411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 8421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8439c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 8441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 8469e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == VarRegionKind; 8471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 8483d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks 8493d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks void dumpPretty(raw_ostream &os) const; 8509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 851de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 852de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek/// CXXThisRegion - Represents the region for the implicit 'this' parameter 853de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek/// in a call to a C++ method. This region doesn't represent the object 854de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek/// referred to by 'this', but rather 'this' itself. 8559697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CXXThisRegion : public TypedValueRegion { 856de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek friend class MemRegionManager; 857de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek CXXThisRegion(const PointerType *thisPointerTy, 858de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const MemRegion *sReg) 8599697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sReg, CXXThisRegionKind), ThisPointerTy(thisPointerTy) {} 860de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 861de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID &ID, 862de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const PointerType *PT, 863de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const MemRegion *sReg); 864de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 865de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek void Profile(llvm::FoldingSetNodeID &ID) const; 866de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 867de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekpublic: 868018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 869de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek return QualType(ThisPointerTy, 0); 870de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek } 8717caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 8729c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 873de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 874de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek static bool classof(const MemRegion* R) { 875de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek return R->getKind() == CXXThisRegionKind; 876de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek } 877de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 878de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekprivate: 879de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const PointerType *ThisPointerTy; 880de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek}; 8819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 8829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass FieldRegion : public DeclRegion { 8839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 8849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 8859c378f705405d37f49795d5e915989de774fe11fTed Kremenek FieldRegion(const FieldDecl *fd, const MemRegion* sReg) 8869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(fd, sReg, FieldRegionKind) {} 8879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 8884bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenekpublic: 8899c378f705405d37f49795d5e915989de774fe11fTed Kremenek const FieldDecl *getDecl() const { return cast<FieldDecl>(D); } 8901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 891018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 8926eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek // FIXME: We can cache this if needed. 893018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu return getDecl()->getType(); 8941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 8954bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek 896c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const; 89732f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 8989c378f705405d37f49795d5e915989de774fe11fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const FieldDecl *FD, 8996304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek const MemRegion* superRegion) { 9009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, FD, superRegion, FieldRegionKind); 9019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 9021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 9049e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == FieldRegionKind; 9059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 9063d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks 9073d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks void dumpToStream(raw_ostream &os) const; 9083d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks void dumpPretty(raw_ostream &os) const; 9099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 9101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass ObjCIvarRegion : public DeclRegion { 9121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 9141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 915c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer ObjCIvarRegion(const ObjCIvarDecl *ivd, const MemRegion* sReg); 9169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 9179c378f705405d37f49795d5e915989de774fe11fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const ObjCIvarDecl *ivd, 918c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer const MemRegion* superRegion); 9191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 921c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer const ObjCIvarDecl *getDecl() const; 922c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer QualType getValueType() const; 9231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9249c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 9251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 9279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == ObjCIvarRegionKind; 9289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 9299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 9307caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu//===----------------------------------------------------------------------===// 931fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner// Auxiliary data classes for use with MemRegions. 9327caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu//===----------------------------------------------------------------------===// 9337caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 9347caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuclass ElementRegion; 9357caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 9367caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuclass RegionRawOffset { 9377caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuprivate: 9387caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu friend class ElementRegion; 9397caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 9407caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu const MemRegion *Region; 9419ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck CharUnits Offset; 9427caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 9439ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck RegionRawOffset(const MemRegion* reg, CharUnits offset = CharUnits::Zero()) 9447caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu : Region(reg), Offset(offset) {} 9457caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 9467caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xupublic: 9477caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu // FIXME: Eventually support symbolic offsets. 9489ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck CharUnits getOffset() const { return Offset; } 9497caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu const MemRegion *getRegion() const { return Region; } 9507caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 9519c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 9527caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu void dump() const; 9537caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu}; 954511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 9551437425a62dbf7bdb0a855d3ed3b05ed2019ec1eAnna Zaks/// \brief ElementRegin is used to represent both array elements and casts. 9569697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass ElementRegion : public TypedValueRegion { 957511191ce8920160525611be2be754c32a0724c3eZhongxing Xu friend class MemRegionManager; 958511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 959f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek QualType ElementType; 96002282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek NonLoc Index; 961511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 96202282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek ElementRegion(QualType elementType, NonLoc Idx, const MemRegion* sReg) 9639697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sReg, ElementRegionKind), 964f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek ElementType(elementType), Index(Idx) { 9653d8173c1c68f451c7492f92023d829c626845925Chris Lattner assert((!isa<nonloc::ConcreteInt>(&Idx) || 9663d8173c1c68f451c7492f92023d829c626845925Chris Lattner cast<nonloc::ConcreteInt>(&Idx)->getValue().isSigned()) && 96743b28d07019bc78447ecbbb721526de4ffd83f20Chris Lattner "The index must be signed"); 9680395b5d4987fe5baa818015e9d294c128619e4ecZhongxing Xu } 9691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 970f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, QualType elementType, 971f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek SVal Idx, const MemRegion* superRegion); 972511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 973511191ce8920160525611be2be754c32a0724c3eZhongxing Xupublic: 974511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 97502282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek NonLoc getIndex() const { return Index; } 9766e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu 977018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 978f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek return ElementType; 979f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek } 9801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 981f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek QualType getElementType() const { 982f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek return ElementType; 983abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek } 9847caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu /// Compute the offset within the array. The array might also be a subobject. 9857caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu RegionRawOffset getAsArrayOffset() const; 9861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9879c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 988b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 989511191ce8920160525611be2be754c32a0724c3eZhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const; 990511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 991511191ce8920160525611be2be754c32a0724c3eZhongxing Xu static bool classof(const MemRegion* R) { 992511191ce8920160525611be2be754c32a0724c3eZhongxing Xu return R->getKind() == ElementRegionKind; 993511191ce8920160525611be2be754c32a0724c3eZhongxing Xu } 994511191ce8920160525611be2be754c32a0724c3eZhongxing Xu}; 99519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 996bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu// C++ temporary object associated with an expression. 9979697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CXXTempObjectRegion : public TypedValueRegion { 998bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu friend class MemRegionManager; 999bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 1000bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu Expr const *Ex; 1001bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 100202fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu CXXTempObjectRegion(Expr const *E, MemRegion const *sReg) 10039697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sReg, CXXTempObjectRegionKind), Ex(E) {} 1004bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 1005bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID &ID, 1006bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu Expr const *E, const MemRegion *sReg); 1007bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 1008bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xupublic: 1009782f63ecd124f9384f988dc7e0cf4ae1540c15f6Jeffrey Yasskin const Expr *getExpr() const { return Ex; } 1010782f63ecd124f9384f988dc7e0cf4ae1540c15f6Jeffrey Yasskin 1011018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 1012bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu return Ex->getType(); 1013bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu } 1014bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 10159c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 1016e1aeb13251a4858724d2b7ad1925d25076f23d08Zhongxing Xu 1017bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu void Profile(llvm::FoldingSetNodeID &ID) const; 1018bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 1019bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu static bool classof(const MemRegion* R) { 102002fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu return R->getKind() == CXXTempObjectRegionKind; 1021bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu } 1022bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu}; 1023bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 10244fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu// CXXBaseObjectRegion represents a base object within a C++ object. It is 10254fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu// identified by the base class declaration and the region of its parent object. 10269697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CXXBaseObjectRegion : public TypedValueRegion { 10274fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu friend class MemRegionManager; 10284fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 10294fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu const CXXRecordDecl *decl; 10304fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 10314fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu CXXBaseObjectRegion(const CXXRecordDecl *d, const MemRegion *sReg) 10329697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sReg, CXXBaseObjectRegionKind), decl(d) {} 10334fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 10344fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID &ID, 10354fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu const CXXRecordDecl *decl, const MemRegion *sReg); 10364fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 10374fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xupublic: 1038d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu const CXXRecordDecl *getDecl() const { return decl; } 1039d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu 10404fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu QualType getValueType() const; 10414fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 10429c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 10434fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 10444fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu void Profile(llvm::FoldingSetNodeID &ID) const; 10454fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 10464fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu static bool classof(const MemRegion *region) { 10474fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu return region->getKind() == CXXBaseObjectRegionKind; 10484fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu } 10494fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu}; 10504fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 1051ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenektemplate<typename RegionTy> 1052ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenekconst RegionTy* MemRegion::getAs() const { 1053f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek if (const RegionTy* RT = dyn_cast<RegionTy>(this)) 1054f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek return RT; 10551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1056f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek return NULL; 1057ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek} 1058511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 10599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 10609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager - Factory object for creating regions. 10619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 10629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 10639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager { 1064a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek ASTContext &C; 10659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek llvm::BumpPtrAllocator& A; 10669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek llvm::FoldingSet<MemRegion> Regions; 10671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1068eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalInternalSpaceRegion *InternalGlobals; 1069eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalSystemSpaceRegion *SystemGlobals; 1070eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalImmutableSpaceRegion *ImmutableGlobals; 1071eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 10722b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek 1073c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu llvm::DenseMap<const StackFrameContext *, StackLocalsSpaceRegion *> 1074c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu StackLocalsSpaceRegions; 1075c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu llvm::DenseMap<const StackFrameContext *, StackArgumentsSpaceRegion *> 1076c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu StackArgumentsSpaceRegions; 1077dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek llvm::DenseMap<const CodeTextRegion *, StaticGlobalSpaceRegion *> 1078dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek StaticsGlobalSpaceRegions; 10792b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek 108067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek HeapSpaceRegion *heap; 10812b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek UnknownSpaceRegion *unknown; 1082d05552a21377f493c882298c59e8829040b01d34Ted Kremenek MemSpaceRegion *code; 1083dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 10849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 1085a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek MemRegionManager(ASTContext &c, llvm::BumpPtrAllocator& a) 1086eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks : C(c), A(a), InternalGlobals(0), SystemGlobals(0), ImmutableGlobals(0), 1087eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks heap(0), unknown(0), code(0) {} 10881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 10894240096011a187807058f887eb81df750ffa17feTed Kremenek ~MemRegionManager(); 10901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1091a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek ASTContext &getContext() { return C; } 10924240096011a187807058f887eb81df750ffa17feTed Kremenek 10934240096011a187807058f887eb81df750ffa17feTed Kremenek llvm::BumpPtrAllocator &getAllocator() { return A; } 10941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 109567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// getStackLocalsRegion - Retrieve the memory region associated with the 109667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// specified stack frame. 109767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackLocalsSpaceRegion * 109867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek getStackLocalsRegion(const StackFrameContext *STC); 1099d05552a21377f493c882298c59e8829040b01d34Ted Kremenek 1100d05552a21377f493c882298c59e8829040b01d34Ted Kremenek /// getStackArgumentsRegion - Retrieve the memory region associated with 110167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// function/method arguments of the specified stack frame. 110267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackArgumentsSpaceRegion * 110367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek getStackArgumentsRegion(const StackFrameContext *STC); 11041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 11059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getGlobalsRegion - Retrieve the memory region associated with 1106dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek /// global variables. 1107eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks const GlobalsSpaceRegion *getGlobalsRegion( 1108eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks MemRegion::Kind K = MemRegion::GlobalInternalSpaceRegionKind, 1109eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks const CodeTextRegion *R = 0); 11101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 11119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getHeapRegion - Retrieve the memory region associated with the 11129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// generic "heap". 111367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const HeapSpaceRegion *getHeapRegion(); 1114178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 1115178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu /// getUnknownRegion - Retrieve the memory region associated with unknown 1116178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu /// memory space. 1117b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemSpaceRegion *getUnknownRegion(); 1118c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu 1119b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemSpaceRegion *getCodeRegion(); 1120ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 11217090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek /// getAllocaRegion - Retrieve a region associated with a call to alloca(). 11229c378f705405d37f49795d5e915989de774fe11fTed Kremenek const AllocaRegion *getAllocaRegion(const Expr *Ex, unsigned Cnt, 112367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *LC); 11241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1125329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek /// getCompoundLiteralRegion - Retrieve the region associated with a 1126329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek /// given CompoundLiteral. 1127b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const CompoundLiteralRegion* 11289c378f705405d37f49795d5e915989de774fe11fTed Kremenek getCompoundLiteralRegion(const CompoundLiteralExpr *CL, 112967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *LC); 1130de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 1131fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner /// getCXXThisRegion - Retrieve the [artificial] region associated with the 1132de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek /// parameter 'this'. 1133de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const CXXThisRegion *getCXXThisRegion(QualType thisPointerTy, 1134de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const LocationContext *LC); 11351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1136e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks /// \brief Retrieve or create a "symbolic" memory region. 1137e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks const SymbolicRegion* getSymbolicRegion(SymbolRef Sym); 1138e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks 1139e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks /// \brief Return a unique symbolic region belonging to heap memory space. 1140e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks const SymbolicRegion *getSymbolicHeapRegion(SymbolRef sym); 1141e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 11424c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek const StringRegion *getStringRegion(const StringLiteral* Str); 11434c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 11444c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek const ObjCStringRegion *getObjCStringRegion(const ObjCStringLiteral *Str); 1145e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 11469e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getVarRegion - Retrieve or create the memory region associated with 1147d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek /// a specified VarDecl and LocationContext. 1148b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const VarRegion* getVarRegion(const VarDecl *D, const LocationContext *LC); 11491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 115067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// getVarRegion - Retrieve or create the memory region associated with 115167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// a specified VarDecl and super region. 115267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const VarRegion* getVarRegion(const VarDecl *D, const MemRegion *superR); 115367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 1154f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek /// getElementRegion - Retrieve the memory region associated with the 1155f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek /// associated element type, index, and super region. 115602282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek const ElementRegion *getElementRegion(QualType elementType, NonLoc Idx, 1157856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu const MemRegion *superRegion, 1158856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu ASTContext &Ctx); 11591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1160b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const ElementRegion *getElementRegionWithSuper(const ElementRegion *ER, 1161856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu const MemRegion *superRegion) { 1162a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek return getElementRegion(ER->getElementType(), ER->getIndex(), 1163a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek superRegion, ER->getContext()); 1164a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek } 1165511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 11669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getFieldRegion - Retrieve or create the memory region associated with 11679e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a specified FieldDecl. 'superRegion' corresponds to the containing 11689e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// memory region (which typically represents the memory representing 11699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a structure or class). 11709c378f705405d37f49795d5e915989de774fe11fTed Kremenek const FieldRegion *getFieldRegion(const FieldDecl *fd, 1171b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemRegion* superRegion); 11721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1173b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const FieldRegion *getFieldRegionWithSuper(const FieldRegion *FR, 1174b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemRegion *superRegion) { 1175a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek return getFieldRegion(FR->getDecl(), superRegion); 1176a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek } 11771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 11789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getObjCIvarRegion - Retrieve or create the memory region associated with 11799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a specified Objective-c instance variable. 'superRegion' corresponds 11809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// to the containing region (which typically represents the Objective-C 11819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// object). 11829c378f705405d37f49795d5e915989de774fe11fTed Kremenek const ObjCIvarRegion *getObjCIvarRegion(const ObjCIvarDecl *ivd, 1183b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemRegion* superRegion); 11841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 118502fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu const CXXTempObjectRegion *getCXXTempObjectRegion(Expr const *Ex, 118602fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu LocationContext const *LC); 1187bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 11884fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu const CXXBaseObjectRegion *getCXXBaseObjectRegion(const CXXRecordDecl *decl, 11894fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu const MemRegion *superRegion); 11904fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 1191d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu /// Create a CXXBaseObjectRegion with the same CXXRecordDecl but a different 1192d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu /// super region. 1193d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu const CXXBaseObjectRegion * 1194d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu getCXXBaseObjectRegionWithSuper(const CXXBaseObjectRegion *baseReg, 1195d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu const MemRegion *superRegion) { 1196d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu return getCXXBaseObjectRegion(baseReg->getDecl(), superRegion); 1197d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu } 1198d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu 1199b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const FunctionTextRegion *getFunctionTextRegion(const FunctionDecl *FD); 1200b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const BlockTextRegion *getBlockTextRegion(const BlockDecl *BD, 120167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek CanQualType locTy, 12021d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContext *AC); 120367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 120467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// getBlockDataRegion - Get the memory region associated with an instance 120567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// of a block. Unlike many other MemRegions, the LocationContext* 120667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// argument is allowed to be NULL for cases where we have no known 120767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// context. 1208b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const BlockDataRegion *getBlockDataRegion(const BlockTextRegion *bc, 120967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *lc = NULL); 12101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1211bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenekprivate: 1212250101353b711a409b075f1bc11070dddec7100bTed Kremenek template <typename RegionTy, typename A1> 1213250101353b711a409b075f1bc11070dddec7100bTed Kremenek RegionTy* getRegion(const A1 a1); 12141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 12156304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek template <typename RegionTy, typename A1> 1216eeea45611d45238c34474c183cee96d47ae79e24Ted Kremenek RegionTy* getSubRegion(const A1 a1, const MemRegion* superRegion); 12171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 12187ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek template <typename RegionTy, typename A1, typename A2> 12197ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek RegionTy* getRegion(const A1 a1, const A2 a2); 1220dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 12210a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek template <typename RegionTy, typename A1, typename A2> 12220a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek RegionTy* getSubRegion(const A1 a1, const A2 a2, 12230a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek const MemRegion* superRegion); 12240a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 122567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek template <typename RegionTy, typename A1, typename A2, typename A3> 122667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek RegionTy* getSubRegion(const A1 a1, const A2 a2, const A3 a3, 122767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const MemRegion* superRegion); 122867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 122967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek template <typename REG> 123067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const REG* LazyAllocate(REG*& region); 123167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 123267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek template <typename REG, typename ARG> 123367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const REG* LazyAllocate(REG*& region, ARG a); 1234ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek}; 12351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1236250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 1237a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek// Out-of-line member definitions. 1238250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 1239250101353b711a409b075f1bc11070dddec7100bTed Kremenek 12409c378f705405d37f49795d5e915989de774fe11fTed Kremenekinline ASTContext &MemRegion::getContext() const { 1241a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek return getMemRegionManager()->getContext(); 1242a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek} 1243eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 12445a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis} // end GR namespace 12455a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis 1246be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end clang namespace 12479e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1248250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 1249250101353b711a409b075f1bc11070dddec7100bTed Kremenek// Pretty-printing regions. 1250250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 1251250101353b711a409b075f1bc11070dddec7100bTed Kremenek 1252be91224894e1501133e224934285ba6440bf5b59Ted Kremeneknamespace llvm { 12539c378f705405d37f49795d5e915989de774fe11fTed Kremenekstatic inline raw_ostream &operator<<(raw_ostream &os, 12549ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremenek const clang::ento::MemRegion* R) { 12558800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek R->dumpToStream(os); 12568800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek return os; 1257be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} 1258be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end llvm namespace 12599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 12609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#endif 1261