MemRegion.h revision e17fdb2d5dbf0ffefd417587003eebbe5baf5984
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 199ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck#include "clang/AST/CharUnits.h" 20993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek#include "clang/AST/Decl.h" 214c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek#include "clang/AST/ExprObjC.h" 22d47d3b0cfeb7e8564ff77f48130fe63282b6d127Chris Lattner#include "clang/Basic/LLVM.h" 239b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenek#include "clang/StaticAnalyzer/Core/PathSensitive/SVals.h" 249c1845dbed9817520f5a7db8bd80a560c6c6ae6bArgyrios Kyrtzidis#include "llvm/Support/ErrorHandling.h" 259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/ADT/FoldingSet.h" 269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include <string> 279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 285e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramernamespace llvm { 295e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramerclass BumpPtrAllocator; 305e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramer} 319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremeneknamespace clang { 331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenekclass LocationContext; 3567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackFrameContext; 365a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis 379ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremeneknamespace ento { 385a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis 395a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidisclass MemRegionManager; 405a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidisclass MemSpaceRegion; 41c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenekclass SValBuilder; 424240096011a187807058f887eb81df750ffa17feTed Kremenekclass VarRegion; 43dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekclass CodeTextRegion; 441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 45e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu/// Represent a region's offset within the top level base region. 46e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xuclass RegionOffset { 47e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu /// The base region. 48e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu const MemRegion *R; 49e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu 50e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu /// The bit offset within the base region. It shouldn't be negative. 51e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu int64_t Offset; 52e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu 53e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xupublic: 54e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu RegionOffset(const MemRegion *r) : R(r), Offset(0) {} 55e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu RegionOffset(const MemRegion *r, int64_t off) : R(r), Offset(off) {} 56e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu 57e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu const MemRegion *getRegion() const { return R; } 58e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu int64_t getOffset() const { return Offset; } 59e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu}; 60e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu 6119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===// 6219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// Base region classes. 6319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===// 641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemRegion - The root abstract class for all memory regions. 669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegion : public llvm::FoldingSetNode { 674240096011a187807058f887eb81df750ffa17feTed Kremenek friend class MemRegionManager; 689e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 6967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek enum Kind { 7067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek // Memory spaces. 71dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek GenericMemSpaceRegionKind, 7267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StackLocalsSpaceRegionKind, 7367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StackArgumentsSpaceRegionKind, 7467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek HeapSpaceRegionKind, 752b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek UnknownSpaceRegionKind, 76dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek StaticGlobalSpaceRegionKind, 77eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalInternalSpaceRegionKind, 78eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalSystemSpaceRegionKind, 79eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalImmutableSpaceRegionKind, 80eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks BEG_NON_STATIC_GLOBAL_MEMSPACES = GlobalInternalSpaceRegionKind, 81eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks END_NON_STATIC_GLOBAL_MEMSPACES = GlobalImmutableSpaceRegionKind, 82eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks BEG_GLOBAL_MEMSPACES = StaticGlobalSpaceRegionKind, 83eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks END_GLOBAL_MEMSPACES = GlobalImmutableSpaceRegionKind, 84dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek BEG_MEMSPACES = GenericMemSpaceRegionKind, 85eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks END_MEMSPACES = GlobalImmutableSpaceRegionKind, 8667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek // Untyped regions. 8767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek SymbolicRegionKind, 8867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek AllocaRegionKind, 899697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek BlockDataRegionKind, 9067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek // Typed regions. 9167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BEG_TYPED_REGIONS, 9267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek FunctionTextRegionKind = BEG_TYPED_REGIONS, 9367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BlockTextRegionKind, 949697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek BEG_TYPED_VALUE_REGIONS, 959697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek CompoundLiteralRegionKind = BEG_TYPED_VALUE_REGIONS, 96de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek CXXThisRegionKind, 9767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StringRegionKind, 984c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek ObjCStringRegionKind, 9967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek ElementRegionKind, 10067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek // Decl Regions. 10167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BEG_DECL_REGIONS, 10267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek VarRegionKind = BEG_DECL_REGIONS, 10367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek FieldRegionKind, 10467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek ObjCIvarRegionKind, 1054fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu END_DECL_REGIONS = ObjCIvarRegionKind, 10602fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu CXXTempObjectRegionKind, 1074fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu CXXBaseObjectRegionKind, 108096aef9597b263b4cd6a0feaacf9e7214fa9c75aJordy Rose END_TYPED_VALUE_REGIONS = CXXBaseObjectRegionKind, 109096aef9597b263b4cd6a0feaacf9e7214fa9c75aJordy Rose END_TYPED_REGIONS = CXXBaseObjectRegionKind 11067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek }; 11167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 1129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate: 1139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const Kind kind; 1141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 1169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemRegion(Kind k) : kind(k) {} 1179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek virtual ~MemRegion(); 1189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 120a6275a534da701f37d19a068e6361e5f10f983a1Ted Kremenek ASTContext &getContext() const; 1211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek virtual void Profile(llvm::FoldingSetNodeID& ID) const = 0; 123a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 124a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek virtual MemRegionManager* getMemRegionManager() const = 0; 125a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 126bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek const MemSpaceRegion *getMemorySpace() const; 1271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 128adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu const MemRegion *getBaseRegion() const; 129adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu 130479529e679957fbb92b56e116e3c86734429331eZhongxing Xu const MemRegion *StripCasts() const; 1311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1321508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek bool hasGlobalsOrParametersStorage() const; 1331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 134de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek bool hasStackStorage() const; 135de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 136de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek bool hasStackNonParametersStorage() const; 137de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 138de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek bool hasStackParametersStorage() const; 139b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 140e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu /// Compute the offset within the top level memory object. 141e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu RegionOffset getAsOffset() const; 142e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu 1433d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks /// \brief Get a string representation of a region for debug use. 1443d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks std::string getString() const; 1453d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks 1469c378f705405d37f49795d5e915989de774fe11fTed Kremenek virtual void dumpToStream(raw_ostream &os) const; 1477f39d29cb69e7488f994870800d548008e50e1cbTed Kremenek 1488800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek void dump() const; 1491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1503d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks /// \brief Print the region for use in diagnostics. 1513d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks virtual void dumpPretty(raw_ostream &os) const; 1523d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks 1531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Kind getKind() const { return kind; } 1541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 155ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek template<typename RegionTy> const RegionTy* getAs() const; 1561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 157f0f0605c87739c906861f73d4287798a4969b1e0Zhongxing Xu virtual bool isBoundable() const { return false; } 158b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 1599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion*) { return true; } 1609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 1611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 162eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// MemSpaceRegion - A memory region that represents a "memory space"; 1639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// for example, the set of global variables, the stack frame, etc. 1649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemSpaceRegion : public MemRegion { 165a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenekprotected: 16667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 16767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 168a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek MemRegionManager *Mgr; 169a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 17067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek MemSpaceRegion(MemRegionManager *mgr, Kind k = GenericMemSpaceRegionKind) 17167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : MemRegion(k), Mgr(mgr) { 17267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek assert(classof(this)); 17367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 17467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 17567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek MemRegionManager* getMemRegionManager() const { return Mgr; } 1761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 17867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek bool isBoundable() const { return false; } 17967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 18067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek void Profile(llvm::FoldingSetNodeID &ID) const; 18167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 18267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 18367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek Kind k = R->getKind(); 18467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return k >= BEG_MEMSPACES && k <= END_MEMSPACES; 185a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek } 18667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 18767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 18867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass GlobalsSpaceRegion : public MemSpaceRegion { 18999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 190dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekprotected: 191dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek GlobalsSpaceRegion(MemRegionManager *mgr, Kind k) 192dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek : MemSpaceRegion(mgr, k) {} 193dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekpublic: 194dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek static bool classof(const MemRegion *R) { 195dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek Kind k = R->getKind(); 196dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek return k >= BEG_GLOBAL_MEMSPACES && k <= END_GLOBAL_MEMSPACES; 197dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek } 198dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek}; 199eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 200914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region of the static variables within the current CodeTextRegion 201eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// scope. 202914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// 203eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// Currently, only the static locals are placed there, so we know that these 204eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// variables do not get invalidated by calls to other functions. 205dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekclass StaticGlobalSpaceRegion : public GlobalsSpaceRegion { 20667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 207a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 208dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek const CodeTextRegion *CR; 209dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 210dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek StaticGlobalSpaceRegion(MemRegionManager *mgr, const CodeTextRegion *cr) 211dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek : GlobalsSpaceRegion(mgr, StaticGlobalSpaceRegionKind), CR(cr) {} 212dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 213dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekpublic: 214dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek void Profile(llvm::FoldingSetNodeID &ID) const; 215dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 2169c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 217fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek 218dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek const CodeTextRegion *getCodeRegion() const { return CR; } 219dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 220dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek static bool classof(const MemRegion *R) { 221dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek return R->getKind() == StaticGlobalSpaceRegionKind; 222dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek } 223dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek}; 224eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 225914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region for all the non-static global variables. 226eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// 227eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// This class is further split into subclasses for efficient implementation of 228eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// invalidating a set of related global values as is done in 229eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// RegionStoreManager::invalidateRegions (instead of finding all the dependent 230eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// globals, we invalidate the whole parent region). 231dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekclass NonStaticGlobalSpaceRegion : public GlobalsSpaceRegion { 232dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek friend class MemRegionManager; 233dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 234eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksprotected: 235eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks NonStaticGlobalSpaceRegion(MemRegionManager *mgr, Kind k) 236eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks : GlobalsSpaceRegion(mgr, k) {} 237dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 2389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 239fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek 24067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 241eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks Kind k = R->getKind(); 242eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks return k >= BEG_NON_STATIC_GLOBAL_MEMSPACES && 243eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks k <= END_NON_STATIC_GLOBAL_MEMSPACES; 24467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 24567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 246eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 247914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region containing globals which are defined in system/external 248eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// headers and are considered modifiable by system calls (ex: errno). 249eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksclass GlobalSystemSpaceRegion : public NonStaticGlobalSpaceRegion { 250eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks friend class MemRegionManager; 251eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 252eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalSystemSpaceRegion(MemRegionManager *mgr) 253eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks : NonStaticGlobalSpaceRegion(mgr, GlobalSystemSpaceRegionKind) {} 254eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 255eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zakspublic: 256eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 257eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks void dumpToStream(raw_ostream &os) const; 258eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 259eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks static bool classof(const MemRegion *R) { 260eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks return R->getKind() == GlobalSystemSpaceRegionKind; 261eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks } 262eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks}; 263eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 264914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region containing globals which are considered not to be modified 265eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// or point to data which could be modified as a result of a function call 266eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// (system or internal). Ex: Const global scalars would be modeled as part of 267eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// this region. This region also includes most system globals since they have 268eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// low chance of being modified. 269eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksclass GlobalImmutableSpaceRegion : public NonStaticGlobalSpaceRegion { 270eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks friend class MemRegionManager; 271eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 272eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalImmutableSpaceRegion(MemRegionManager *mgr) 273eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks : NonStaticGlobalSpaceRegion(mgr, GlobalImmutableSpaceRegionKind) {} 274eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 275eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zakspublic: 276eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 277eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks void dumpToStream(raw_ostream &os) const; 278eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 279eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks static bool classof(const MemRegion *R) { 280eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks return R->getKind() == GlobalImmutableSpaceRegionKind; 281eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks } 282eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks}; 283eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 284914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region containing globals which can be modified by calls to 285eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// "internally" defined functions - (for now just) functions other then system 286eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// calls. 287eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksclass GlobalInternalSpaceRegion : public NonStaticGlobalSpaceRegion { 288eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks friend class MemRegionManager; 289eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 290eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalInternalSpaceRegion(MemRegionManager *mgr) 291eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks : NonStaticGlobalSpaceRegion(mgr, GlobalInternalSpaceRegionKind) {} 292eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 293eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zakspublic: 294eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 295eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks void dumpToStream(raw_ostream &os) const; 296eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 297eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks static bool classof(const MemRegion *R) { 298eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks return R->getKind() == GlobalInternalSpaceRegionKind; 299eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks } 300eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks}; 301eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 30267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass HeapSpaceRegion : public MemSpaceRegion { 30399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 30467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 30567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 30667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek HeapSpaceRegion(MemRegionManager *mgr) 30767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : MemSpaceRegion(mgr, HeapSpaceRegionKind) {} 30867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 30936397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 31036397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose void dumpToStream(raw_ostream &os) const; 31136397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 31267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 31367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return R->getKind() == HeapSpaceRegionKind; 31467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 31567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 31667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 3172b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenekclass UnknownSpaceRegion : public MemSpaceRegion { 31899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 3192b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek friend class MemRegionManager; 3202b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek UnknownSpaceRegion(MemRegionManager *mgr) 3212b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek : MemSpaceRegion(mgr, UnknownSpaceRegionKind) {} 3222b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenekpublic: 32336397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 32436397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose void dumpToStream(raw_ostream &os) const; 32536397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 3262b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek static bool classof(const MemRegion *R) { 3272b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek return R->getKind() == UnknownSpaceRegionKind; 3282b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek } 3292b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek}; 3302b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek 33167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackSpaceRegion : public MemSpaceRegion { 33267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate: 33367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackFrameContext *SFC; 3349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 33567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprotected: 33667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StackSpaceRegion(MemRegionManager *mgr, Kind k, const StackFrameContext *sfc) 33767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : MemSpaceRegion(mgr, k), SFC(sfc) { 33867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek assert(classof(this)); 33967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 34041168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek 34167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 34267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackFrameContext *getStackFrame() const { return SFC; } 34367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 34467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek void Profile(llvm::FoldingSetNodeID &ID) const; 34567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 34667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 34767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek Kind k = R->getKind(); 34867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return k >= StackLocalsSpaceRegionKind && 34967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek k <= StackArgumentsSpaceRegionKind; 35067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 35167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 35267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 35367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackLocalsSpaceRegion : public StackSpaceRegion { 35499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 35567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 35667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StackLocalsSpaceRegion(MemRegionManager *mgr, const StackFrameContext *sfc) 35767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : StackSpaceRegion(mgr, StackLocalsSpaceRegionKind, sfc) {} 35867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 35936397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 36036397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose void dumpToStream(raw_ostream &os) const; 36136397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 36267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 36367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return R->getKind() == StackLocalsSpaceRegionKind; 36467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 36567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 36667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 36767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackArgumentsSpaceRegion : public StackSpaceRegion { 36867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate: 36999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 37067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 37167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek StackArgumentsSpaceRegion(MemRegionManager *mgr, const StackFrameContext *sfc) 37267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : StackSpaceRegion(mgr, StackArgumentsSpaceRegionKind, sfc) {} 37367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 37436397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 37536397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose void dumpToStream(raw_ostream &os) const; 37636397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 37767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static bool classof(const MemRegion *R) { 37867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return R->getKind() == StackArgumentsSpaceRegionKind; 3799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 3819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3827caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 383993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// SubRegion - A region that subsets another larger region. Most regions 384993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// are subclasses of SubRegion. 385993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass SubRegion : public MemRegion { 38699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikieprivate: 38799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 3889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 3891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const MemRegion* superRegion; 390993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek SubRegion(const MemRegion* sReg, Kind k) : MemRegion(k), superRegion(sReg) {} 3919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 3929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* getSuperRegion() const { 3939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return superRegion; 3949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 3951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 39632f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose /// getExtent - Returns the size of the region in bytes. 397c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek virtual DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const { 39832f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose return UnknownVal(); 39932f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose } 40032f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 401a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek MemRegionManager* getMemRegionManager() const; 4021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4037e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu bool isSubRegionOf(const MemRegion* R) const; 4041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 40667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return R->getKind() > END_MEMSPACES; 407993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek } 408993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek}; 4091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 41019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===// 41119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// MemRegion subclasses. 4121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump//===----------------------------------------------------------------------===// 413ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 41482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek/// AllocaRegion - A region that represents an untyped blob of bytes created 41582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek/// by a call to 'alloca'. 41682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekclass AllocaRegion : public SubRegion { 41782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek friend class MemRegionManager; 41882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekprotected: 41982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek unsigned Cnt; // Block counter. Used to distinguish different pieces of 42082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek // memory allocated by alloca at the same call site. 4219c378f705405d37f49795d5e915989de774fe11fTed Kremenek const Expr *Ex; 42282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 4239c378f705405d37f49795d5e915989de774fe11fTed Kremenek AllocaRegion(const Expr *ex, unsigned cnt, const MemRegion *superRegion) 42482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek : SubRegion(superRegion, AllocaRegionKind), Cnt(cnt), Ex(ex) {} 4251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 42682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekpublic: 4271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4289c378f705405d37f49795d5e915989de774fe11fTed Kremenek const Expr *getExpr() const { return Ex; } 4299852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu 4309852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu bool isBoundable() const { return true; } 4319852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu 432c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const; 43332f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 43482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 43582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 4369c378f705405d37f49795d5e915989de774fe11fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Expr *Ex, 4377ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek unsigned Cnt, const MemRegion *superRegion); 4381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4399c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 4401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 44182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek static bool classof(const MemRegion* R) { 44282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek return R->getKind() == AllocaRegionKind; 44382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek } 4441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}; 4451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 446993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// TypedRegion - An abstract class representing regions that are typed. 447993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass TypedRegion : public SubRegion { 44899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikiepublic: 44999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 450993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekprotected: 451993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek TypedRegion(const MemRegion* sReg, Kind k) : SubRegion(sReg, k) {} 4521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 453993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekpublic: 4549697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek virtual QualType getLocationType() const = 0; 4559697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek 4569697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek QualType getDesugaredLocationType(ASTContext &Context) const { 4579697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek return getLocationType().getDesugaredType(Context); 4589697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek } 4599697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek 4609697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek bool isBoundable() const { return true; } 4619697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek 4629697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek static bool classof(const MemRegion* R) { 4639697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek unsigned k = R->getKind(); 4649697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek return k >= BEG_TYPED_REGIONS && k <= END_TYPED_REGIONS; 4659697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek } 4669697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek}; 4679697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek 4689697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek/// TypedValueRegion - An abstract class representing regions having a typed value. 4699697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass TypedValueRegion : public TypedRegion { 47099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikiepublic: 47199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 4729697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekprotected: 4739697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek TypedValueRegion(const MemRegion* sReg, Kind k) : TypedRegion(sReg, k) {} 4749697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek 4759697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekpublic: 476018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu virtual QualType getValueType() const = 0; 4771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 478018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu virtual QualType getLocationType() const { 4796eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek // FIXME: We can possibly optimize this later to cache this value. 480a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek QualType T = getValueType(); 481a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek ASTContext &ctx = getContext(); 482a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek if (T->getAs<ObjCObjectType>()) 483a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek return ctx.getObjCObjectPointerType(T); 484a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek return ctx.getPointerType(getValueType()); 4856eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek } 4861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 48749f4e1cbd839da27ff4814b4ea6d85a79f786cbdJohn McCall QualType getDesugaredValueType(ASTContext &Context) const { 488018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType T = getValueType(); 4891ab55e9bb87d98bff1d42c7a0ee502c64755d9f5Douglas Gregor return T.getTypePtrOrNull() ? T.getDesugaredType(Context) : T; 49014553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek } 4911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 492993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek static bool classof(const MemRegion* R) { 4939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek unsigned k = R->getKind(); 4949697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek return k >= BEG_TYPED_VALUE_REGIONS && k <= END_TYPED_VALUE_REGIONS; 4959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 4969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 4979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 498ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 499eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass CodeTextRegion : public TypedRegion { 50099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikiepublic: 50199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 502eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekprotected: 503eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek CodeTextRegion(const MemRegion *sreg, Kind k) : TypedRegion(sreg, k) {} 504ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xupublic: 505eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek bool isBoundable() const { return false; } 506eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 507eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek static bool classof(const MemRegion* R) { 508eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek Kind k = R->getKind(); 509eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return k >= FunctionTextRegionKind && k <= BlockTextRegionKind; 510eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek } 511eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek}; 512ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 513eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek/// FunctionTextRegion - A region that represents code texts of function. 514eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass FunctionTextRegion : public CodeTextRegion { 515eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek const FunctionDecl *FD; 516eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekpublic: 5179c378f705405d37f49795d5e915989de774fe11fTed Kremenek FunctionTextRegion(const FunctionDecl *fd, const MemRegion* sreg) 518eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek : CodeTextRegion(sreg, FunctionTextRegionKind), FD(fd) {} 519eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 520018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getLocationType() const { 521018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu return getContext().getPointerType(FD->getType()); 522ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu } 523eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 524abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek const FunctionDecl *getDecl() const { 525abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek return FD; 52672e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek } 527eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 5289c378f705405d37f49795d5e915989de774fe11fTed Kremenek virtual void dumpToStream(raw_ostream &os) const; 529eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 530ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const; 531eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 532abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const FunctionDecl *FD, 533abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek const MemRegion*); 534eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 535ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu static bool classof(const MemRegion* R) { 536eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return R->getKind() == FunctionTextRegionKind; 537eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek } 538eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek}; 539eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 540eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 541eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek/// BlockTextRegion - A region that represents code texts of blocks (closures). 5420a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// Blocks are represented with two kinds of regions. BlockTextRegions 5430a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// represent the "code", while BlockDataRegions represent instances of blocks, 5440a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// which correspond to "code+data". The distinction is important, because 5450a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// like a closure a block captures the values of externally referenced 5460a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// variables. 547eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass BlockTextRegion : public CodeTextRegion { 54867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 54967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 550eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek const BlockDecl *BD; 5511d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContext *AC; 552eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek CanQualType locTy; 55367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 55467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BlockTextRegion(const BlockDecl *bd, CanQualType lTy, 5551d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContext *ac, const MemRegion* sreg) 55667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : CodeTextRegion(sreg, BlockTextRegionKind), BD(bd), AC(ac), locTy(lTy) {} 55767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 55867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic: 559018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getLocationType() const { 560eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return locTy; 561eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek } 562eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 563eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek const BlockDecl *getDecl() const { 564eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return BD; 565eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek } 56667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 5671d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContext *getAnalysisDeclContext() const { return AC; } 568eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 5699c378f705405d37f49795d5e915989de774fe11fTed Kremenek virtual void dumpToStream(raw_ostream &os) const; 570eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 571eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 572eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 573eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const BlockDecl *BD, 5741d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek CanQualType, const AnalysisDeclContext*, 57567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const MemRegion*); 576eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 577eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek static bool classof(const MemRegion* R) { 578eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek return R->getKind() == BlockTextRegionKind; 579ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu } 580ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu}; 5810a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 5820a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// BlockDataRegion - A region that represents a block instance. 5830a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// Blocks are represented with two kinds of regions. BlockTextRegions 5840a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// represent the "code", while BlockDataRegions represent instances of blocks, 5850a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// which correspond to "code+data". The distinction is important, because 5860a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// like a closure a block captures the values of externally referenced 5870a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// variables. 5880a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenekclass BlockDataRegion : public SubRegion { 58967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek friend class MemRegionManager; 5900a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek const BlockTextRegion *BC; 59167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *LC; // Can be null */ 5924240096011a187807058f887eb81df750ffa17feTed Kremenek void *ReferencedVars; 59385d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek void *OriginalVars; 59467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 59567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BlockDataRegion(const BlockTextRegion *bc, const LocationContext *lc, 5960a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek const MemRegion *sreg) 59785d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek : SubRegion(sreg, BlockDataRegionKind), BC(bc), LC(lc), 59885d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek ReferencedVars(0), OriginalVars(0) {} 5990a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 60085d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenekpublic: 6010a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek const BlockTextRegion *getCodeRegion() const { return BC; } 6024240096011a187807058f887eb81df750ffa17feTed Kremenek 603d02e83a548359df978f40cc1a52ffd78b7ef371bTed Kremenek const BlockDecl *getDecl() const { return BC->getDecl(); } 604d02e83a548359df978f40cc1a52ffd78b7ef371bTed Kremenek 60581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek class referenced_vars_iterator { 60681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek const MemRegion * const *R; 60785d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek const MemRegion * const *OriginalR; 60881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek public: 60985d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek explicit referenced_vars_iterator(const MemRegion * const *r, 61085d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek const MemRegion * const *originalR) 61185d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek : R(r), OriginalR(originalR) {} 61281cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek 61381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek operator const MemRegion * const *() const { 61481cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return R; 61581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 61685d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek 61785d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek const MemRegion *getCapturedRegion() const { 61885d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek return *R; 61985d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek } 62085d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek const MemRegion *getOriginalRegion() const { 62185d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek return *OriginalR; 62285d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek } 62385d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek 62481cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek const VarRegion* operator*() const { 62581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return cast<VarRegion>(*R); 62681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 62781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek 62881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek bool operator==(const referenced_vars_iterator &I) const { 62981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return I.R == R; 63081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 63181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek bool operator!=(const referenced_vars_iterator &I) const { 63281cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return I.R != R; 63381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 6349c378f705405d37f49795d5e915989de774fe11fTed Kremenek referenced_vars_iterator &operator++() { 63581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek ++R; 63685d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek ++OriginalR; 63781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return *this; 63881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek } 63981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek }; 64081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek 6414240096011a187807058f887eb81df750ffa17feTed Kremenek referenced_vars_iterator referenced_vars_begin() const; 6424240096011a187807058f887eb81df750ffa17feTed Kremenek referenced_vars_iterator referenced_vars_end() const; 6430a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 6449c378f705405d37f49795d5e915989de774fe11fTed Kremenek virtual void dumpToStream(raw_ostream &os) const; 6450a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 6460a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 6470a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 64867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID&, const BlockTextRegion *, 64967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *, const MemRegion *); 6500a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 6510a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek static bool classof(const MemRegion* R) { 6520a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek return R->getKind() == BlockDataRegionKind; 6530a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek } 6544240096011a187807058f887eb81df750ffa17feTed Kremenekprivate: 6554240096011a187807058f887eb81df750ffa17feTed Kremenek void LazyInitializeReferencedVars(); 6560a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek}; 657ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 658026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// SymbolicRegion - A special, "non-concrete" region. Unlike other region 659026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// clases, SymbolicRegion represents a region that serves as an alias for 660026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// either a real region, a NULL pointer, etc. It essentially is used to 661026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// map the concept of symbolic values into the domain of regions. Symbolic 662026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// regions do not need to be typed. 663e8e86482da4c1872673bbb9c237649229d19793bTed Kremenekclass SymbolicRegion : public SubRegion { 664026c66395b88a09437319139a43b090093f7e1ddZhongxing Xuprotected: 665026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu const SymbolRef sym; 666026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 667026c66395b88a09437319139a43b090093f7e1ddZhongxing Xupublic: 6681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SymbolicRegion(const SymbolRef s, const MemRegion* sreg) 669e8e86482da4c1872673bbb9c237649229d19793bTed Kremenek : SubRegion(sreg, SymbolicRegionKind), sym(s) {} 6701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 671026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu SymbolRef getSymbol() const { 672026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu return sym; 673026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu } 674026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 6759852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu bool isBoundable() const { return true; } 6769852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu 677c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const; 67832f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 679026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const; 680026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 681250101353b711a409b075f1bc11070dddec7100bTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, 682250101353b711a409b075f1bc11070dddec7100bTed Kremenek SymbolRef sym, 683250101353b711a409b075f1bc11070dddec7100bTed Kremenek const MemRegion* superRegion); 6841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6859c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 6861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 687026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu static bool classof(const MemRegion* R) { 688026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu return R->getKind() == SymbolicRegionKind; 689026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu } 6901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}; 691026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 692e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu/// StringRegion - Region associated with a StringLiteral. 6939697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass StringRegion : public TypedValueRegion { 694e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu friend class MemRegionManager; 695e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const StringLiteral* Str; 696e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuprotected: 697e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 698250101353b711a409b075f1bc11070dddec7100bTed Kremenek StringRegion(const StringLiteral* str, const MemRegion* sreg) 6999697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sreg, StringRegionKind), Str(str) {} 700e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 701e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID& ID, 702e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const StringLiteral* Str, 703e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const MemRegion* superRegion); 704e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 705e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xupublic: 7066613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu 7076613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu const StringLiteral* getStringLiteral() const { return Str; } 7081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 709018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 710ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu return Str->getType(); 711ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu } 712e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 713c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const; 71432f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 7150a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu bool isBoundable() const { return false; } 7160a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu 717e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const { 718e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu ProfileRegion(ID, Str, superRegion); 719e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 720e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 7219c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 722cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu 723e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static bool classof(const MemRegion* R) { 724e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu return R->getKind() == StringRegionKind; 725e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 726e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu}; 7274c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7284c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek/// The region associated with an ObjCStringLiteral. 7294c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekclass ObjCStringRegion : public TypedValueRegion { 7304c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek friend class MemRegionManager; 7314c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek const ObjCStringLiteral* Str; 7324c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekprotected: 7334c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7344c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek ObjCStringRegion(const ObjCStringLiteral* str, const MemRegion* sreg) 7354c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek : TypedValueRegion(sreg, ObjCStringRegionKind), Str(str) {} 7364c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7374c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, 7384c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek const ObjCStringLiteral* Str, 7394c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek const MemRegion* superRegion); 7404c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7414c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekpublic: 7424c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7434c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek const ObjCStringLiteral* getObjCStringLiteral() const { return Str; } 7444c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7454c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek QualType getValueType() const { 7464c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek return Str->getType(); 7474c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek } 7484c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7494c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek bool isBoundable() const { return false; } 7504c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7514c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek void Profile(llvm::FoldingSetNodeID& ID) const { 7524c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek ProfileRegion(ID, Str, superRegion); 7534c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek } 7544c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7554c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek void dumpToStream(raw_ostream &os) const; 7564c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7574c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek static bool classof(const MemRegion* R) { 7584c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek return R->getKind() == ObjCStringRegionKind; 7594c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek } 7604c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek}; 761e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 762329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// CompoundLiteralRegion - A memory region representing a compound literal. 763329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// Compound literals are essentially temporaries that are stack allocated 764329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// or in the global constant pool. 7659697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CompoundLiteralRegion : public TypedValueRegion { 766329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekprivate: 767329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek friend class MemRegionManager; 7689c378f705405d37f49795d5e915989de774fe11fTed Kremenek const CompoundLiteralExpr *CL; 769329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 7709c378f705405d37f49795d5e915989de774fe11fTed Kremenek CompoundLiteralRegion(const CompoundLiteralExpr *cl, const MemRegion* sReg) 7719697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sReg, CompoundLiteralRegionKind), CL(cl) {} 7721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 773329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, 7749c378f705405d37f49795d5e915989de774fe11fTed Kremenek const CompoundLiteralExpr *CL, 775329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek const MemRegion* superRegion); 776329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekpublic: 777018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 778018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu return CL->getType(); 77977cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu } 7800a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu 7819a08fee80a34938b8c11c7166e009a89ced4c2b4Zhongxing Xu bool isBoundable() const { return !CL->isFileScope(); } 7829a08fee80a34938b8c11c7166e009a89ced4c2b4Zhongxing Xu 783329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 7841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7859c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 786329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 7879c378f705405d37f49795d5e915989de774fe11fTed Kremenek const CompoundLiteralExpr *getLiteralExpr() const { return CL; } 7881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 789329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek static bool classof(const MemRegion* R) { 790329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek return R->getKind() == CompoundLiteralRegionKind; 791329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek } 792329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek}; 793178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 7949697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass DeclRegion : public TypedValueRegion { 7959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 7969c378f705405d37f49795d5e915989de774fe11fTed Kremenek const Decl *D; 7979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 7989c378f705405d37f49795d5e915989de774fe11fTed Kremenek DeclRegion(const Decl *d, const MemRegion* sReg, Kind k) 7999697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sReg, k), D(d) {} 8009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 8019c378f705405d37f49795d5e915989de774fe11fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl *D, 8029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion, Kind k); 8031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 804bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xupublic: 8059c378f705405d37f49795d5e915989de774fe11fTed Kremenek const Decl *getDecl() const { return D; } 8069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 8071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 808c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const; 80932f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 810e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu static bool classof(const MemRegion* R) { 811e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu unsigned k = R->getKind(); 81267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return k >= BEG_DECL_REGIONS && k <= END_DECL_REGIONS; 813e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu } 8149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 8151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass VarRegion : public DeclRegion { 8179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 818d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek 819d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek // Constructors and private methods. 8209c378f705405d37f49795d5e915989de774fe11fTed Kremenek VarRegion(const VarDecl *vd, const MemRegion* sReg) 82167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek : DeclRegion(vd, sReg, VarRegionKind) {} 8229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 8239c378f705405d37f49795d5e915989de774fe11fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const VarDecl *VD, 824d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek const MemRegion *superRegion) { 8259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, VD, superRegion, VarRegionKind); 8269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 8271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 828d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 8291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic: 831d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek const VarDecl *getDecl() const { return cast<VarDecl>(D); } 8321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8335348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek const StackFrameContext *getStackFrame() const; 8345348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek 835018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 8366eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek // FIXME: We can cache this if needed. 837018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu return getDecl()->getType(); 8381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 8391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8409c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 8411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8429e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 8439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == VarRegionKind; 8441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 8453d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks 8463d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks void dumpPretty(raw_ostream &os) const; 8479e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 848de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 849de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek/// CXXThisRegion - Represents the region for the implicit 'this' parameter 850de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek/// in a call to a C++ method. This region doesn't represent the object 851de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek/// referred to by 'this', but rather 'this' itself. 8529697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CXXThisRegion : public TypedValueRegion { 853de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek friend class MemRegionManager; 854de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek CXXThisRegion(const PointerType *thisPointerTy, 855de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const MemRegion *sReg) 8569697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sReg, CXXThisRegionKind), ThisPointerTy(thisPointerTy) {} 857de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 858de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID &ID, 859de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const PointerType *PT, 860de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const MemRegion *sReg); 861de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 862de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek void Profile(llvm::FoldingSetNodeID &ID) const; 863de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 864de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekpublic: 865018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 866de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek return QualType(ThisPointerTy, 0); 867de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek } 8687caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 8699c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 870de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 871de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek static bool classof(const MemRegion* R) { 872de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek return R->getKind() == CXXThisRegionKind; 873de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek } 874de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 875de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekprivate: 876de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const PointerType *ThisPointerTy; 877de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek}; 8789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 8799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass FieldRegion : public DeclRegion { 8809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 8819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 8829c378f705405d37f49795d5e915989de774fe11fTed Kremenek FieldRegion(const FieldDecl *fd, const MemRegion* sReg) 8839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(fd, sReg, FieldRegionKind) {} 8849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 8854bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenekpublic: 8869c378f705405d37f49795d5e915989de774fe11fTed Kremenek const FieldDecl *getDecl() const { return cast<FieldDecl>(D); } 8871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 888018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 8896eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek // FIXME: We can cache this if needed. 890018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu return getDecl()->getType(); 8911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 8924bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek 893c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const; 89432f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 8959c378f705405d37f49795d5e915989de774fe11fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const FieldDecl *FD, 8966304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek const MemRegion* superRegion) { 8979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, FD, superRegion, FieldRegionKind); 8989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 8991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 9019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == FieldRegionKind; 9029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 9033d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks 9043d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks void dumpToStream(raw_ostream &os) const; 9053d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks void dumpPretty(raw_ostream &os) const; 9069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 9071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass ObjCIvarRegion : public DeclRegion { 9091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 9111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 912c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer ObjCIvarRegion(const ObjCIvarDecl *ivd, const MemRegion* sReg); 9139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 9149c378f705405d37f49795d5e915989de774fe11fTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const ObjCIvarDecl *ivd, 915c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer const MemRegion* superRegion); 9161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 918c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer const ObjCIvarDecl *getDecl() const; 919c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer QualType getValueType() const; 9201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9219c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 9221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 9249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == ObjCIvarRegionKind; 9259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 9269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 9277caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu//===----------------------------------------------------------------------===// 928fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner// Auxiliary data classes for use with MemRegions. 9297caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu//===----------------------------------------------------------------------===// 9307caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 9317caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuclass ElementRegion; 9327caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 9337caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuclass RegionRawOffset { 9347caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuprivate: 9357caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu friend class ElementRegion; 9367caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 9377caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu const MemRegion *Region; 9389ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck CharUnits Offset; 9397caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 9409ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck RegionRawOffset(const MemRegion* reg, CharUnits offset = CharUnits::Zero()) 9417caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu : Region(reg), Offset(offset) {} 9427caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 9437caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xupublic: 9447caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu // FIXME: Eventually support symbolic offsets. 9459ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck CharUnits getOffset() const { return Offset; } 9467caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu const MemRegion *getRegion() const { return Region; } 9477caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 9489c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 9497caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu void dump() const; 9507caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu}; 951511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 9521437425a62dbf7bdb0a855d3ed3b05ed2019ec1eAnna Zaks/// \brief ElementRegin is used to represent both array elements and casts. 9539697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass ElementRegion : public TypedValueRegion { 954511191ce8920160525611be2be754c32a0724c3eZhongxing Xu friend class MemRegionManager; 955511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 956f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek QualType ElementType; 95702282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek NonLoc Index; 958511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 95902282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek ElementRegion(QualType elementType, NonLoc Idx, const MemRegion* sReg) 9609697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sReg, ElementRegionKind), 961f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek ElementType(elementType), Index(Idx) { 9623d8173c1c68f451c7492f92023d829c626845925Chris Lattner assert((!isa<nonloc::ConcreteInt>(&Idx) || 9633d8173c1c68f451c7492f92023d829c626845925Chris Lattner cast<nonloc::ConcreteInt>(&Idx)->getValue().isSigned()) && 96443b28d07019bc78447ecbbb721526de4ffd83f20Chris Lattner "The index must be signed"); 9650395b5d4987fe5baa818015e9d294c128619e4ecZhongxing Xu } 9661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 967f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, QualType elementType, 968f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek SVal Idx, const MemRegion* superRegion); 969511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 970511191ce8920160525611be2be754c32a0724c3eZhongxing Xupublic: 971511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 97202282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek NonLoc getIndex() const { return Index; } 9736e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu 974018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 975f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek return ElementType; 976f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek } 9771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 978f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek QualType getElementType() const { 979f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek return ElementType; 980abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek } 9817caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu /// Compute the offset within the array. The array might also be a subobject. 9827caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu RegionRawOffset getAsArrayOffset() const; 9831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9849c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 985b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 986511191ce8920160525611be2be754c32a0724c3eZhongxing Xu void Profile(llvm::FoldingSetNodeID& ID) const; 987511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 988511191ce8920160525611be2be754c32a0724c3eZhongxing Xu static bool classof(const MemRegion* R) { 989511191ce8920160525611be2be754c32a0724c3eZhongxing Xu return R->getKind() == ElementRegionKind; 990511191ce8920160525611be2be754c32a0724c3eZhongxing Xu } 991511191ce8920160525611be2be754c32a0724c3eZhongxing Xu}; 99219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 993bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu// C++ temporary object associated with an expression. 9949697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CXXTempObjectRegion : public TypedValueRegion { 995bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu friend class MemRegionManager; 996bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 997bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu Expr const *Ex; 998bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 99902fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu CXXTempObjectRegion(Expr const *E, MemRegion const *sReg) 10009697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sReg, CXXTempObjectRegionKind), Ex(E) {} 1001bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 1002bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID &ID, 1003bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu Expr const *E, const MemRegion *sReg); 1004bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 1005bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xupublic: 1006782f63ecd124f9384f988dc7e0cf4ae1540c15f6Jeffrey Yasskin const Expr *getExpr() const { return Ex; } 1007782f63ecd124f9384f988dc7e0cf4ae1540c15f6Jeffrey Yasskin 1008018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType getValueType() const { 1009bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu return Ex->getType(); 1010bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu } 1011bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 10129c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 1013e1aeb13251a4858724d2b7ad1925d25076f23d08Zhongxing Xu 1014bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu void Profile(llvm::FoldingSetNodeID &ID) const; 1015bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 1016bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu static bool classof(const MemRegion* R) { 101702fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu return R->getKind() == CXXTempObjectRegionKind; 1018bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu } 1019bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu}; 1020bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 10214fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu// CXXBaseObjectRegion represents a base object within a C++ object. It is 10224fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu// identified by the base class declaration and the region of its parent object. 10239697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CXXBaseObjectRegion : public TypedValueRegion { 10244fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu friend class MemRegionManager; 10254fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 10264fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu const CXXRecordDecl *decl; 10274fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 10284fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu CXXBaseObjectRegion(const CXXRecordDecl *d, const MemRegion *sReg) 10299697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek : TypedValueRegion(sReg, CXXBaseObjectRegionKind), decl(d) {} 10304fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 10314fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu static void ProfileRegion(llvm::FoldingSetNodeID &ID, 10324fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu const CXXRecordDecl *decl, const MemRegion *sReg); 10334fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 10344fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xupublic: 1035d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu const CXXRecordDecl *getDecl() const { return decl; } 1036d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu 10374fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu QualType getValueType() const; 10384fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 10399c378f705405d37f49795d5e915989de774fe11fTed Kremenek void dumpToStream(raw_ostream &os) const; 10404fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 10414fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu void Profile(llvm::FoldingSetNodeID &ID) const; 10424fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 10434fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu static bool classof(const MemRegion *region) { 10444fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu return region->getKind() == CXXBaseObjectRegionKind; 10454fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu } 10464fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu}; 10474fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 1048ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenektemplate<typename RegionTy> 1049ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenekconst RegionTy* MemRegion::getAs() const { 1050f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek if (const RegionTy* RT = dyn_cast<RegionTy>(this)) 1051f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek return RT; 10521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1053f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek return NULL; 1054ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek} 1055511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 10569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 10579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager - Factory object for creating regions. 10589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 10599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 10609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager { 1061a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek ASTContext &C; 10629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek llvm::BumpPtrAllocator& A; 10639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek llvm::FoldingSet<MemRegion> Regions; 10641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1065eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalInternalSpaceRegion *InternalGlobals; 1066eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalSystemSpaceRegion *SystemGlobals; 1067eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks GlobalImmutableSpaceRegion *ImmutableGlobals; 1068eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 10692b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek 1070c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu llvm::DenseMap<const StackFrameContext *, StackLocalsSpaceRegion *> 1071c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu StackLocalsSpaceRegions; 1072c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu llvm::DenseMap<const StackFrameContext *, StackArgumentsSpaceRegion *> 1073c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu StackArgumentsSpaceRegions; 1074dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek llvm::DenseMap<const CodeTextRegion *, StaticGlobalSpaceRegion *> 1075dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek StaticsGlobalSpaceRegions; 10762b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek 107767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek HeapSpaceRegion *heap; 10782b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek UnknownSpaceRegion *unknown; 1079d05552a21377f493c882298c59e8829040b01d34Ted Kremenek MemSpaceRegion *code; 1080dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 10819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 1082a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek MemRegionManager(ASTContext &c, llvm::BumpPtrAllocator& a) 1083eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks : C(c), A(a), InternalGlobals(0), SystemGlobals(0), ImmutableGlobals(0), 1084eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks heap(0), unknown(0), code(0) {} 10851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 10864240096011a187807058f887eb81df750ffa17feTed Kremenek ~MemRegionManager(); 10871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1088a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek ASTContext &getContext() { return C; } 10894240096011a187807058f887eb81df750ffa17feTed Kremenek 10904240096011a187807058f887eb81df750ffa17feTed Kremenek llvm::BumpPtrAllocator &getAllocator() { return A; } 10911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 109267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// getStackLocalsRegion - Retrieve the memory region associated with the 109367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// specified stack frame. 109467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackLocalsSpaceRegion * 109567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek getStackLocalsRegion(const StackFrameContext *STC); 1096d05552a21377f493c882298c59e8829040b01d34Ted Kremenek 1097d05552a21377f493c882298c59e8829040b01d34Ted Kremenek /// getStackArgumentsRegion - Retrieve the memory region associated with 109867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// function/method arguments of the specified stack frame. 109967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackArgumentsSpaceRegion * 110067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek getStackArgumentsRegion(const StackFrameContext *STC); 11011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 11029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getGlobalsRegion - Retrieve the memory region associated with 1103dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek /// global variables. 1104eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks const GlobalsSpaceRegion *getGlobalsRegion( 1105eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks MemRegion::Kind K = MemRegion::GlobalInternalSpaceRegionKind, 1106eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks const CodeTextRegion *R = 0); 11071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 11089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getHeapRegion - Retrieve the memory region associated with the 11099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// generic "heap". 111067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const HeapSpaceRegion *getHeapRegion(); 1111178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 1112178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu /// getUnknownRegion - Retrieve the memory region associated with unknown 1113178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu /// memory space. 1114b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemSpaceRegion *getUnknownRegion(); 1115c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu 1116b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemSpaceRegion *getCodeRegion(); 1117ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 11187090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek /// getAllocaRegion - Retrieve a region associated with a call to alloca(). 11199c378f705405d37f49795d5e915989de774fe11fTed Kremenek const AllocaRegion *getAllocaRegion(const Expr *Ex, unsigned Cnt, 112067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *LC); 11211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1122329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek /// getCompoundLiteralRegion - Retrieve the region associated with a 1123329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek /// given CompoundLiteral. 1124b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const CompoundLiteralRegion* 11259c378f705405d37f49795d5e915989de774fe11fTed Kremenek getCompoundLiteralRegion(const CompoundLiteralExpr *CL, 112667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *LC); 1127de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 1128fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner /// getCXXThisRegion - Retrieve the [artificial] region associated with the 1129de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek /// parameter 'this'. 1130de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const CXXThisRegion *getCXXThisRegion(QualType thisPointerTy, 1131de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const LocationContext *LC); 11321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1133e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks /// \brief Retrieve or create a "symbolic" memory region. 1134e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks const SymbolicRegion* getSymbolicRegion(SymbolRef Sym); 1135e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks 1136e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks /// \brief Return a unique symbolic region belonging to heap memory space. 1137e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks const SymbolicRegion *getSymbolicHeapRegion(SymbolRef sym); 1138e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 11394c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek const StringRegion *getStringRegion(const StringLiteral* Str); 11404c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 11414c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek const ObjCStringRegion *getObjCStringRegion(const ObjCStringLiteral *Str); 1142e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 11439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getVarRegion - Retrieve or create the memory region associated with 1144d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek /// a specified VarDecl and LocationContext. 1145b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const VarRegion* getVarRegion(const VarDecl *D, const LocationContext *LC); 11461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 114767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// getVarRegion - Retrieve or create the memory region associated with 114867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// a specified VarDecl and super region. 114967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const VarRegion* getVarRegion(const VarDecl *D, const MemRegion *superR); 115067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 1151f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek /// getElementRegion - Retrieve the memory region associated with the 1152f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek /// associated element type, index, and super region. 115302282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek const ElementRegion *getElementRegion(QualType elementType, NonLoc Idx, 1154856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu const MemRegion *superRegion, 1155856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu ASTContext &Ctx); 11561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1157b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const ElementRegion *getElementRegionWithSuper(const ElementRegion *ER, 1158856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu const MemRegion *superRegion) { 1159a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek return getElementRegion(ER->getElementType(), ER->getIndex(), 1160a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek superRegion, ER->getContext()); 1161a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek } 1162511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 11639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getFieldRegion - Retrieve or create the memory region associated with 11649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a specified FieldDecl. 'superRegion' corresponds to the containing 11659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// memory region (which typically represents the memory representing 11669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a structure or class). 11679c378f705405d37f49795d5e915989de774fe11fTed Kremenek const FieldRegion *getFieldRegion(const FieldDecl *fd, 1168b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemRegion* superRegion); 11691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1170b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const FieldRegion *getFieldRegionWithSuper(const FieldRegion *FR, 1171b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemRegion *superRegion) { 1172a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek return getFieldRegion(FR->getDecl(), superRegion); 1173a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek } 11741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 11759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getObjCIvarRegion - Retrieve or create the memory region associated with 11769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a specified Objective-c instance variable. 'superRegion' corresponds 11779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// to the containing region (which typically represents the Objective-C 11789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// object). 11799c378f705405d37f49795d5e915989de774fe11fTed Kremenek const ObjCIvarRegion *getObjCIvarRegion(const ObjCIvarDecl *ivd, 1180b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemRegion* superRegion); 11811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 118202fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu const CXXTempObjectRegion *getCXXTempObjectRegion(Expr const *Ex, 118302fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu LocationContext const *LC); 1184bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 11854fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu const CXXBaseObjectRegion *getCXXBaseObjectRegion(const CXXRecordDecl *decl, 11864fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu const MemRegion *superRegion); 11874fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 1188d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu /// Create a CXXBaseObjectRegion with the same CXXRecordDecl but a different 1189d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu /// super region. 1190d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu const CXXBaseObjectRegion * 1191d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu getCXXBaseObjectRegionWithSuper(const CXXBaseObjectRegion *baseReg, 1192d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu const MemRegion *superRegion) { 1193d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu return getCXXBaseObjectRegion(baseReg->getDecl(), superRegion); 1194d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu } 1195d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu 1196b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const FunctionTextRegion *getFunctionTextRegion(const FunctionDecl *FD); 1197b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const BlockTextRegion *getBlockTextRegion(const BlockDecl *BD, 119867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek CanQualType locTy, 11991d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContext *AC); 120067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 120167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// getBlockDataRegion - Get the memory region associated with an instance 120267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// of a block. Unlike many other MemRegions, the LocationContext* 120367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// argument is allowed to be NULL for cases where we have no known 120467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /// context. 1205b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const BlockDataRegion *getBlockDataRegion(const BlockTextRegion *bc, 120667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *lc = NULL); 12071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1208bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenekprivate: 1209250101353b711a409b075f1bc11070dddec7100bTed Kremenek template <typename RegionTy, typename A1> 1210250101353b711a409b075f1bc11070dddec7100bTed Kremenek RegionTy* getRegion(const A1 a1); 12111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 12126304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek template <typename RegionTy, typename A1> 1213eeea45611d45238c34474c183cee96d47ae79e24Ted Kremenek RegionTy* getSubRegion(const A1 a1, const MemRegion* superRegion); 12141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 12157ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek template <typename RegionTy, typename A1, typename A2> 12167ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek RegionTy* getRegion(const A1 a1, const A2 a2); 1217dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu 12180a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek template <typename RegionTy, typename A1, typename A2> 12190a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek RegionTy* getSubRegion(const A1 a1, const A2 a2, 12200a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek const MemRegion* superRegion); 12210a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 122267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek template <typename RegionTy, typename A1, typename A2, typename A3> 122367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek RegionTy* getSubRegion(const A1 a1, const A2 a2, const A3 a3, 122467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const MemRegion* superRegion); 122567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 122667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek template <typename REG> 122767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const REG* LazyAllocate(REG*& region); 122867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 122967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek template <typename REG, typename ARG> 123067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const REG* LazyAllocate(REG*& region, ARG a); 1231ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek}; 12321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1233250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 1234a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek// Out-of-line member definitions. 1235250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 1236250101353b711a409b075f1bc11070dddec7100bTed Kremenek 12379c378f705405d37f49795d5e915989de774fe11fTed Kremenekinline ASTContext &MemRegion::getContext() const { 1238a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek return getMemRegionManager()->getContext(); 1239a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek} 1240eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 12415a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis} // end GR namespace 12425a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis 1243be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end clang namespace 12449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1245250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 1246250101353b711a409b075f1bc11070dddec7100bTed Kremenek// Pretty-printing regions. 1247250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 1248250101353b711a409b075f1bc11070dddec7100bTed Kremenek 1249be91224894e1501133e224934285ba6440bf5b59Ted Kremeneknamespace llvm { 12509c378f705405d37f49795d5e915989de774fe11fTed Kremenekstatic inline raw_ostream &operator<<(raw_ostream &os, 12519ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremenek const clang::ento::MemRegion* R) { 12528800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek R->dumpToStream(os); 12538800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek return os; 1254be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} 1255be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end llvm namespace 12569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 12579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#endif 1258