MemRegion.cpp revision 99ba9e3bd70671f3441fb974895f226a83ce0e66
19e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//== MemRegion.cpp - 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 169b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenek#include "clang/StaticAnalyzer/Core/PathSensitive/MemRegion.h" 179b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenek#include "clang/StaticAnalyzer/Core/PathSensitive/SValBuilder.h" 185e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramer#include "clang/Analysis/AnalysisContext.h" 195e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramer#include "clang/Analysis/Support/BumpVector.h" 20199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck#include "clang/AST/CharUnits.h" 217caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu#include "clang/AST/RecordLayout.h" 221309f9a3b225ea846e5822691c39a77423125505Ted Kremenek#include "llvm/Support/raw_ostream.h" 239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekusing namespace clang; 259ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremenekusing namespace ento; 269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 27250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 28bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek// MemRegion Construction. 29bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek//===----------------------------------------------------------------------===// 30bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek 31bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenektemplate<typename RegionTy> struct MemRegionManagerTrait; 32bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek 33bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenektemplate <typename RegionTy, typename A1> 34bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted KremenekRegionTy* MemRegionManager::getRegion(const A1 a1) { 35dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 36bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek const typename MemRegionManagerTrait<RegionTy>::SuperRegionTy *superRegion = 37bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek MemRegionManagerTrait<RegionTy>::getSuperRegion(*this, a1); 38dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 39bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek llvm::FoldingSetNodeID ID; 40bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek RegionTy::ProfileRegion(ID, a1, superRegion); 419c378f705405d37f49795d5e915989de774fe11fTed Kremenek void *InsertPos; 42bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID, 43bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek InsertPos)); 44dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 45bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek if (!R) { 46bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek R = (RegionTy*) A.Allocate<RegionTy>(); 47bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek new (R) RegionTy(a1, superRegion); 48bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek Regions.InsertNode(R, InsertPos); 49bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek } 50dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 51bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek return R; 52bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek} 53bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek 54bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenektemplate <typename RegionTy, typename A1> 55bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted KremenekRegionTy* MemRegionManager::getSubRegion(const A1 a1, 56bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek const MemRegion *superRegion) { 57bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek llvm::FoldingSetNodeID ID; 58bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek RegionTy::ProfileRegion(ID, a1, superRegion); 599c378f705405d37f49795d5e915989de774fe11fTed Kremenek void *InsertPos; 60bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID, 61bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek InsertPos)); 62dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 63bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek if (!R) { 64bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek R = (RegionTy*) A.Allocate<RegionTy>(); 65bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek new (R) RegionTy(a1, superRegion); 66bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek Regions.InsertNode(R, InsertPos); 67bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek } 68dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 69bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek return R; 70bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek} 71bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek 72bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenektemplate <typename RegionTy, typename A1, typename A2> 73bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted KremenekRegionTy* MemRegionManager::getRegion(const A1 a1, const A2 a2) { 74dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 75bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek const typename MemRegionManagerTrait<RegionTy>::SuperRegionTy *superRegion = 76bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek MemRegionManagerTrait<RegionTy>::getSuperRegion(*this, a1, a2); 77dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 78bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek llvm::FoldingSetNodeID ID; 79bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek RegionTy::ProfileRegion(ID, a1, a2, superRegion); 809c378f705405d37f49795d5e915989de774fe11fTed Kremenek void *InsertPos; 81bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID, 82bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek InsertPos)); 83dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 84bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek if (!R) { 85bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek R = (RegionTy*) A.Allocate<RegionTy>(); 86bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek new (R) RegionTy(a1, a2, superRegion); 87bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek Regions.InsertNode(R, InsertPos); 88bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek } 89dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 90bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek return R; 91bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek} 92bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek 93bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenektemplate <typename RegionTy, typename A1, typename A2> 94bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted KremenekRegionTy* MemRegionManager::getSubRegion(const A1 a1, const A2 a2, 95bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek const MemRegion *superRegion) { 96dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 97bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek llvm::FoldingSetNodeID ID; 98bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek RegionTy::ProfileRegion(ID, a1, a2, superRegion); 999c378f705405d37f49795d5e915989de774fe11fTed Kremenek void *InsertPos; 100bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID, 101bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek InsertPos)); 102dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 103bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek if (!R) { 104bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek R = (RegionTy*) A.Allocate<RegionTy>(); 105bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek new (R) RegionTy(a1, a2, superRegion); 106bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek Regions.InsertNode(R, InsertPos); 107bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek } 108dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 109bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek return R; 110bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek} 111bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek 11267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenektemplate <typename RegionTy, typename A1, typename A2, typename A3> 11367d1287035767f4f6c8ca0c2bb755990012a44caTed KremenekRegionTy* MemRegionManager::getSubRegion(const A1 a1, const A2 a2, const A3 a3, 11467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const MemRegion *superRegion) { 115dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 11667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek llvm::FoldingSetNodeID ID; 11767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek RegionTy::ProfileRegion(ID, a1, a2, a3, superRegion); 1189c378f705405d37f49795d5e915989de774fe11fTed Kremenek void *InsertPos; 11967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID, 12067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek InsertPos)); 121dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 12267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek if (!R) { 12367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek R = (RegionTy*) A.Allocate<RegionTy>(); 12467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek new (R) RegionTy(a1, a2, a3, superRegion); 12567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek Regions.InsertNode(R, InsertPos); 126bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek } 127dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 12867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return R; 12967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek} 130bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek 131bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek//===----------------------------------------------------------------------===// 1324240096011a187807058f887eb81df750ffa17feTed Kremenek// Object destruction. 133250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 1349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed KremenekMemRegion::~MemRegion() {} 1369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1374240096011a187807058f887eb81df750ffa17feTed KremenekMemRegionManager::~MemRegionManager() { 1384240096011a187807058f887eb81df750ffa17feTed Kremenek // All regions and their data are BumpPtrAllocated. No need to call 1394240096011a187807058f887eb81df750ffa17feTed Kremenek // their destructors. 1404240096011a187807058f887eb81df750ffa17feTed Kremenek} 1414240096011a187807058f887eb81df750ffa17feTed Kremenek 1424240096011a187807058f887eb81df750ffa17feTed Kremenek//===----------------------------------------------------------------------===// 1434240096011a187807058f887eb81df750ffa17feTed Kremenek// Basic methods. 1444240096011a187807058f887eb81df750ffa17feTed Kremenek//===----------------------------------------------------------------------===// 1454240096011a187807058f887eb81df750ffa17feTed Kremenek 1467e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xubool SubRegion::isSubRegionOf(const MemRegion* R) const { 1477e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu const MemRegion* r = getSuperRegion(); 1487e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu while (r != 0) { 1497e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu if (r == R) 1507e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu return true; 1517e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu if (const SubRegion* sr = dyn_cast<SubRegion>(r)) 1527e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu r = sr->getSuperRegion(); 1537e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu else 1547e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu break; 1557e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu } 1567e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu return false; 1577e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu} 1587e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu 159a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted KremenekMemRegionManager* SubRegion::getMemRegionManager() const { 160a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek const SubRegion* r = this; 161a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek do { 162a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek const MemRegion *superRegion = r->getSuperRegion(); 163a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek if (const SubRegion *sr = dyn_cast<SubRegion>(superRegion)) { 164a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek r = sr; 165a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek continue; 166a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek } 167a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek return superRegion->getMemRegionManager(); 168a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek } while (1); 169a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek} 170a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 1715348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenekconst StackFrameContext *VarRegion::getStackFrame() const { 1725348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek const StackSpaceRegion *SSR = dyn_cast<StackSpaceRegion>(getMemorySpace()); 1735348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek return SSR ? SSR->getStackFrame() : NULL; 1745348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek} 1755348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek 1765348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek//===----------------------------------------------------------------------===// 17732f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose// Region extents. 17832f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose//===----------------------------------------------------------------------===// 17932f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 180c8413fd03f73084a5c93028f8b4db619fc388087Ted KremenekDefinedOrUnknownSVal DeclRegion::getExtent(SValBuilder &svalBuilder) const { 1819c378f705405d37f49795d5e915989de774fe11fTed Kremenek ASTContext &Ctx = svalBuilder.getContext(); 18249f4e1cbd839da27ff4814b4ea6d85a79f786cbdJohn McCall QualType T = getDesugaredValueType(Ctx); 18332f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 18452e04c537633377fb14cfa4fa3c95e3e510fc942Jordy Rose if (isa<VariableArrayType>(T)) 185c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek return nonloc::SymbolVal(svalBuilder.getSymbolManager().getExtentSymbol(this)); 18652e04c537633377fb14cfa4fa3c95e3e510fc942Jordy Rose if (isa<IncompleteArrayType>(T)) 18732f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose return UnknownVal(); 18832f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 18999c330d0149abeb7f5e52a30ad329f2588c01671Ted Kremenek CharUnits size = Ctx.getTypeSizeInChars(T); 19099c330d0149abeb7f5e52a30ad329f2588c01671Ted Kremenek QualType sizeTy = svalBuilder.getArrayIndexType(); 19199c330d0149abeb7f5e52a30ad329f2588c01671Ted Kremenek return svalBuilder.makeIntVal(size.getQuantity(), sizeTy); 19232f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose} 19332f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 194c8413fd03f73084a5c93028f8b4db619fc388087Ted KremenekDefinedOrUnknownSVal FieldRegion::getExtent(SValBuilder &svalBuilder) const { 195c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek DefinedOrUnknownSVal Extent = DeclRegion::getExtent(svalBuilder); 19632f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 19732f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose // A zero-length array at the end of a struct often stands for dynamically- 19832f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose // allocated extra memory. 19932f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose if (Extent.isZeroConstant()) { 20049f4e1cbd839da27ff4814b4ea6d85a79f786cbdJohn McCall QualType T = getDesugaredValueType(svalBuilder.getContext()); 20132f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 20232f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose if (isa<ConstantArrayType>(T)) 20332f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose return UnknownVal(); 20432f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose } 20532f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 20632f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose return Extent; 20732f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose} 20832f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 209c8413fd03f73084a5c93028f8b4db619fc388087Ted KremenekDefinedOrUnknownSVal AllocaRegion::getExtent(SValBuilder &svalBuilder) const { 210c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek return nonloc::SymbolVal(svalBuilder.getSymbolManager().getExtentSymbol(this)); 21132f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose} 21232f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 213c8413fd03f73084a5c93028f8b4db619fc388087Ted KremenekDefinedOrUnknownSVal SymbolicRegion::getExtent(SValBuilder &svalBuilder) const { 214c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek return nonloc::SymbolVal(svalBuilder.getSymbolManager().getExtentSymbol(this)); 21532f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose} 21632f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 217c8413fd03f73084a5c93028f8b4db619fc388087Ted KremenekDefinedOrUnknownSVal StringRegion::getExtent(SValBuilder &svalBuilder) const { 21899c330d0149abeb7f5e52a30ad329f2588c01671Ted Kremenek return svalBuilder.makeIntVal(getStringLiteral()->getByteLength()+1, 21999c330d0149abeb7f5e52a30ad329f2588c01671Ted Kremenek svalBuilder.getArrayIndexType()); 22032f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose} 22132f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 2224fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing XuQualType CXXBaseObjectRegion::getValueType() const { 2234fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu return QualType(decl->getTypeForDecl(), 0); 2244fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu} 2254fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 22632f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose//===----------------------------------------------------------------------===// 2275348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek// FoldingSet profiling. 2285348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek//===----------------------------------------------------------------------===// 2295348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek 2309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekvoid MemSpaceRegion::Profile(llvm::FoldingSetNodeID& ID) const { 2319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek ID.AddInteger((unsigned)getKind()); 2329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} 2339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 23467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekvoid StackSpaceRegion::Profile(llvm::FoldingSetNodeID &ID) const { 23567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek ID.AddInteger((unsigned)getKind()); 23667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek ID.AddPointer(getStackFrame()); 23767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek} 23867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 239dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekvoid StaticGlobalSpaceRegion::Profile(llvm::FoldingSetNodeID &ID) const { 240dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek ID.AddInteger((unsigned)getKind()); 241dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek ID.AddPointer(getCodeRegion()); 242dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek} 243dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 2441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid StringRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, 2451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const StringLiteral* Str, 246e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const MemRegion* superRegion) { 247e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu ID.AddInteger((unsigned) StringRegionKind); 248e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu ID.AddPointer(Str); 249e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu ID.AddPointer(superRegion); 250e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu} 251e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 2527090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenekvoid AllocaRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, 2539c378f705405d37f49795d5e915989de774fe11fTed Kremenek const Expr *Ex, unsigned cnt, 2547ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek const MemRegion *) { 2557090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek ID.AddInteger((unsigned) AllocaRegionKind); 2567090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek ID.AddPointer(Ex); 2577090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek ID.AddInteger(cnt); 2587090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek} 2597090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek 2607090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenekvoid AllocaRegion::Profile(llvm::FoldingSetNodeID& ID) const { 2617ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek ProfileRegion(ID, Ex, Cnt, superRegion); 2627090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek} 2637090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek 264329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekvoid CompoundLiteralRegion::Profile(llvm::FoldingSetNodeID& ID) const { 265329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek CompoundLiteralRegion::ProfileRegion(ID, CL, superRegion); 266329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek} 267329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 268329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekvoid CompoundLiteralRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, 2699c378f705405d37f49795d5e915989de774fe11fTed Kremenek const CompoundLiteralExpr *CL, 270329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek const MemRegion* superRegion) { 271329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek ID.AddInteger((unsigned) CompoundLiteralRegionKind); 272329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek ID.AddPointer(CL); 273329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek ID.AddPointer(superRegion); 274329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek} 275329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 276de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekvoid CXXThisRegion::ProfileRegion(llvm::FoldingSetNodeID &ID, 277de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const PointerType *PT, 278de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const MemRegion *sRegion) { 279de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek ID.AddInteger((unsigned) CXXThisRegionKind); 280de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek ID.AddPointer(PT); 281de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek ID.AddPointer(sRegion); 282de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek} 283de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 284de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekvoid CXXThisRegion::Profile(llvm::FoldingSetNodeID &ID) const { 285de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek CXXThisRegion::ProfileRegion(ID, ThisPointerTy, superRegion); 286de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek} 287dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 2889c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid DeclRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl *D, 2899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion, Kind k) { 2909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek ID.AddInteger((unsigned) k); 2919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek ID.AddPointer(D); 2929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek ID.AddPointer(superRegion); 2939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} 2949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekvoid DeclRegion::Profile(llvm::FoldingSetNodeID& ID) const { 2969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, D, superRegion, getKind()); 2979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} 2989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 299d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenekvoid VarRegion::Profile(llvm::FoldingSetNodeID &ID) const { 30067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek VarRegion::ProfileRegion(ID, getDecl(), superRegion); 301d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek} 302d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek 303250101353b711a409b075f1bc11070dddec7100bTed Kremenekvoid SymbolicRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, SymbolRef sym, 304250101353b711a409b075f1bc11070dddec7100bTed Kremenek const MemRegion *sreg) { 305993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek ID.AddInteger((unsigned) MemRegion::SymbolicRegionKind); 3066d0e2d2f3c1b6531f303aac7e48aa1eb05900f2aTed Kremenek ID.Add(sym); 307250101353b711a409b075f1bc11070dddec7100bTed Kremenek ID.AddPointer(sreg); 308993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek} 309993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 310993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekvoid SymbolicRegion::Profile(llvm::FoldingSetNodeID& ID) const { 311250101353b711a409b075f1bc11070dddec7100bTed Kremenek SymbolicRegion::ProfileRegion(ID, sym, getSuperRegion()); 312993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek} 313993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 314f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenekvoid ElementRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, 3151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType ElementType, SVal Idx, 316511191ce8920160525611be2be754c32a0724c3eZhongxing Xu const MemRegion* superRegion) { 317511191ce8920160525611be2be754c32a0724c3eZhongxing Xu ID.AddInteger(MemRegion::ElementRegionKind); 318f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek ID.Add(ElementType); 319511191ce8920160525611be2be754c32a0724c3eZhongxing Xu ID.AddPointer(superRegion); 320511191ce8920160525611be2be754c32a0724c3eZhongxing Xu Idx.Profile(ID); 321511191ce8920160525611be2be754c32a0724c3eZhongxing Xu} 322511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 323511191ce8920160525611be2be754c32a0724c3eZhongxing Xuvoid ElementRegion::Profile(llvm::FoldingSetNodeID& ID) const { 324f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek ElementRegion::ProfileRegion(ID, ElementType, Index, superRegion); 325511191ce8920160525611be2be754c32a0724c3eZhongxing Xu} 32627b57063d83b00474d7563fb5d608544e2364862Zhongxing Xu 327eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekvoid FunctionTextRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, 328eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek const FunctionDecl *FD, 329eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek const MemRegion*) { 330eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek ID.AddInteger(MemRegion::FunctionTextRegionKind); 331abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek ID.AddPointer(FD); 332ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu} 333ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 334eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekvoid FunctionTextRegion::Profile(llvm::FoldingSetNodeID& ID) const { 335eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek FunctionTextRegion::ProfileRegion(ID, FD, superRegion); 336eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek} 337eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 338eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekvoid BlockTextRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, 33967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const BlockDecl *BD, CanQualType, 3401d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek const AnalysisDeclContext *AC, 34167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const MemRegion*) { 342eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek ID.AddInteger(MemRegion::BlockTextRegionKind); 343eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek ID.AddPointer(BD); 344eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek} 345eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 346eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekvoid BlockTextRegion::Profile(llvm::FoldingSetNodeID& ID) const { 34767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BlockTextRegion::ProfileRegion(ID, BD, locTy, AC, superRegion); 348ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu} 349ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 3500a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenekvoid BlockDataRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, 3510a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek const BlockTextRegion *BC, 3520a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek const LocationContext *LC, 35367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const MemRegion *sReg) { 3540a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek ID.AddInteger(MemRegion::BlockDataRegionKind); 3550a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek ID.AddPointer(BC); 3560a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek ID.AddPointer(LC); 35767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek ID.AddPointer(sReg); 3580a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek} 3590a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 3600a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenekvoid BlockDataRegion::Profile(llvm::FoldingSetNodeID& ID) const { 36167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BlockDataRegion::ProfileRegion(ID, BC, LC, getSuperRegion()); 3620a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek} 3630a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 36402fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xuvoid CXXTempObjectRegion::ProfileRegion(llvm::FoldingSetNodeID &ID, 36502fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu Expr const *Ex, 36602fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu const MemRegion *sReg) { 367bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu ID.AddPointer(Ex); 368bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu ID.AddPointer(sReg); 369bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu} 370bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 37102fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xuvoid CXXTempObjectRegion::Profile(llvm::FoldingSetNodeID &ID) const { 372bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu ProfileRegion(ID, Ex, getSuperRegion()); 373bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu} 374bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 3754fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xuvoid CXXBaseObjectRegion::ProfileRegion(llvm::FoldingSetNodeID &ID, 3764fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu const CXXRecordDecl *decl, 3774fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu const MemRegion *sReg) { 3784fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu ID.AddPointer(decl); 3794fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu ID.AddPointer(sReg); 3804fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu} 3814fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 3824fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xuvoid CXXBaseObjectRegion::Profile(llvm::FoldingSetNodeID &ID) const { 3834fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu ProfileRegion(ID, decl, superRegion); 3844fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu} 3854fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 386026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu//===----------------------------------------------------------------------===// 38799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie// Region anchors. 38899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===// 38999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 39099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid GlobalsSpaceRegion::anchor() { } 39199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid HeapSpaceRegion::anchor() { } 39299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid UnknownSpaceRegion::anchor() { } 39399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid StackLocalsSpaceRegion::anchor() { } 39499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid StackArgumentsSpaceRegion::anchor() { } 39599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid TypedRegion::anchor() { } 39699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid TypedValueRegion::anchor() { } 39799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid CodeTextRegion::anchor() { } 39899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid SubRegion::anchor() { } 39999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 40099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===// 4019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// Region pretty-printing. 4029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 4039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4048800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenekvoid MemRegion::dump() const { 4058800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek dumpToStream(llvm::errs()); 4067f39d29cb69e7488f994870800d548008e50e1cbTed Kremenek} 4077f39d29cb69e7488f994870800d548008e50e1cbTed Kremenek 4089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekstd::string MemRegion::getString() const { 4099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek std::string s; 4109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek llvm::raw_string_ostream os(s); 4118800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek dumpToStream(os); 4129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return os.str(); 4139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} 4149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4159c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid MemRegion::dumpToStream(raw_ostream &os) const { 4169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek os << "<Unknown Region>"; 4179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} 4189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4199c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid AllocaRegion::dumpToStream(raw_ostream &os) const { 4207090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek os << "alloca{" << (void*) Ex << ',' << Cnt << '}'; 4217090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek} 4227090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek 4239c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid FunctionTextRegion::dumpToStream(raw_ostream &os) const { 424abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek os << "code{" << getDecl()->getDeclName().getAsString() << '}'; 42572e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek} 42672e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek 4279c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid BlockTextRegion::dumpToStream(raw_ostream &os) const { 4280a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek os << "block_code{" << (void*) this << '}'; 429eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek} 430eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 4319c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid BlockDataRegion::dumpToStream(raw_ostream &os) const { 4320a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek os << "block_data{" << BC << '}'; 4330a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek} 4340a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 4359c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid CompoundLiteralRegion::dumpToStream(raw_ostream &os) const { 4365639a3ec15bdbf0b93376bbbae3adaf724f092a7Ted Kremenek // FIXME: More elaborate pretty-printing. 4375639a3ec15bdbf0b93376bbbae3adaf724f092a7Ted Kremenek os << "{ " << (void*) CL << " }"; 4389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} 4399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4405f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid CXXTempObjectRegion::dumpToStream(raw_ostream &os) const { 441782f63ecd124f9384f988dc7e0cf4ae1540c15f6Jeffrey Yasskin os << "temp_object{" << getValueType().getAsString() << ',' 442782f63ecd124f9384f988dc7e0cf4ae1540c15f6Jeffrey Yasskin << (void*) Ex << '}'; 443e1aeb13251a4858724d2b7ad1925d25076f23d08Zhongxing Xu} 444e1aeb13251a4858724d2b7ad1925d25076f23d08Zhongxing Xu 4455f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid CXXBaseObjectRegion::dumpToStream(raw_ostream &os) const { 4464fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu os << "base " << decl->getName(); 4474fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu} 4484fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 4495f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid CXXThisRegion::dumpToStream(raw_ostream &os) const { 450de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek os << "this"; 451de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek} 452de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 4539c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid ElementRegion::dumpToStream(raw_ostream &os) const { 45419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek os << "element{" << superRegion << ',' 45519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek << Index << ',' << getElementType().getAsString() << '}'; 456993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek} 457993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 4589c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid FieldRegion::dumpToStream(raw_ostream &os) const { 459b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer os << superRegion << "->" << *getDecl(); 4604bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek} 4614bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek 4625f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid NonStaticGlobalSpaceRegion::dumpToStream(raw_ostream &os) const { 463fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek os << "NonStaticGlobalSpaceRegion"; 464fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek} 465fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek 4669c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid ObjCIvarRegion::dumpToStream(raw_ostream &os) const { 467b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer os << "ivar{" << superRegion << ',' << *getDecl() << '}'; 468bcfe03a0beb61082fa2f40887216d8dbca19a024Ted Kremenek} 469bcfe03a0beb61082fa2f40887216d8dbca19a024Ted Kremenek 4709c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid StringRegion::dumpToStream(raw_ostream &os) const { 471b27ed3d731c8885bcb473efc734b817a1216b4faTed Kremenek Str->printPretty(os, 0, PrintingPolicy(getContext().getLangOptions())); 472b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu} 473b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 4749c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid SymbolicRegion::dumpToStream(raw_ostream &os) const { 475aef5d2205a4425a4d3e1b0e28d46ed80763651dfTed Kremenek os << "SymRegion{" << sym << '}'; 476329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek} 477329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 4789c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid VarRegion::dumpToStream(raw_ostream &os) const { 479b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer os << *cast<VarDecl>(D); 480cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu} 481cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu 48219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenekvoid RegionRawOffset::dump() const { 48319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek dumpToStream(llvm::errs()); 48419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek} 48519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 4869c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid RegionRawOffset::dumpToStream(raw_ostream &os) const { 4879ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck os << "raw_offset{" << getRegion() << ',' << getOffset().getQuantity() << '}'; 48819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek} 48919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 4905f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid StaticGlobalSpaceRegion::dumpToStream(raw_ostream &os) const { 491fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek os << "StaticGlobalsMemSpace{" << CR << '}'; 492fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek} 493fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek 4949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 4959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager methods. 4969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 49719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 49867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenektemplate <typename REG> 49967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst REG *MemRegionManager::LazyAllocate(REG*& region) { 5001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!region) { 50167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek region = (REG*) A.Allocate<REG>(); 50267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek new (region) REG(this); 5039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 504a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 5059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return region; 5069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} 5079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 50867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenektemplate <typename REG, typename ARG> 50967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst REG *MemRegionManager::LazyAllocate(REG*& region, ARG a) { 51067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek if (!region) { 51167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek region = (REG*) A.Allocate<REG>(); 51267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek new (region) REG(this, a); 51367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 514dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 51567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return region; 51667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek} 51767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 51867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst StackLocalsSpaceRegion* 5192b87ae45e129b941d0a4d221c9d4842385a119bdTed KremenekMemRegionManager::getStackLocalsRegion(const StackFrameContext *STC) { 5202b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek assert(STC); 521c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu StackLocalsSpaceRegion *&R = StackLocalsSpaceRegions[STC]; 522c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu 523c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu if (R) 524c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu return R; 525c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu 526c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu R = A.Allocate<StackLocalsSpaceRegion>(); 527c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu new (R) StackLocalsSpaceRegion(this, STC); 528c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu return R; 5299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} 5309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 53167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst StackArgumentsSpaceRegion * 53267d1287035767f4f6c8ca0c2bb755990012a44caTed KremenekMemRegionManager::getStackArgumentsRegion(const StackFrameContext *STC) { 5332b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek assert(STC); 534c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu StackArgumentsSpaceRegion *&R = StackArgumentsSpaceRegions[STC]; 535c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu 536c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu if (R) 537c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu return R; 538c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu 539c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu R = A.Allocate<StackArgumentsSpaceRegion>(); 540c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu new (R) StackArgumentsSpaceRegion(this, STC); 541c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu return R; 542d05552a21377f493c882298c59e8829040b01d34Ted Kremenek} 543d05552a21377f493c882298c59e8829040b01d34Ted Kremenek 544dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekconst GlobalsSpaceRegion 545dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek*MemRegionManager::getGlobalsRegion(const CodeTextRegion *CR) { 546dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek if (!CR) 547dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek return LazyAllocate(globals); 548dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 549dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek StaticGlobalSpaceRegion *&R = StaticsGlobalSpaceRegions[CR]; 550dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek if (R) 551dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek return R; 552dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 553dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek R = A.Allocate<StaticGlobalSpaceRegion>(); 554dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek new (R) StaticGlobalSpaceRegion(this, CR); 555dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek return R; 5569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} 5579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 55867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst HeapSpaceRegion *MemRegionManager::getHeapRegion() { 5599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return LazyAllocate(heap); 5609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} 5619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 562b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst MemSpaceRegion *MemRegionManager::getUnknownRegion() { 563178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu return LazyAllocate(unknown); 564178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu} 565178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 566b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst MemSpaceRegion *MemRegionManager::getCodeRegion() { 567ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu return LazyAllocate(code); 568ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu} 569ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 570250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 571250101353b711a409b075f1bc11070dddec7100bTed Kremenek// Constructing regions. 572250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 573e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 574dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekconst StringRegion* MemRegionManager::getStringRegion(const StringLiteral* Str){ 57567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return getSubRegion<StringRegion>(Str, getGlobalsRegion()); 576e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu} 577e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 578b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst VarRegion* MemRegionManager::getVarRegion(const VarDecl *D, 579b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const LocationContext *LC) { 58067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const MemRegion *sReg = 0; 5811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 582dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek if (D->hasGlobalStorage() && !D->isStaticLocal()) 583dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek sReg = getGlobalsRegion(); 584dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek else { 58567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek // FIXME: Once we implement scope handling, we will need to properly lookup 58667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek // 'D' to the proper LocationContext. 5872b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek const DeclContext *DC = D->getDeclContext(); 5882b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek const StackFrameContext *STC = LC->getStackFrameForDeclContext(DC); 5892b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek 5902b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek if (!STC) 5912b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek sReg = getUnknownRegion(); 5922b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek else { 593dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek if (D->hasLocalStorage()) { 594dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek sReg = isa<ParmVarDecl>(D) || isa<ImplicitParamDecl>(D) 595dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek ? static_cast<const MemRegion*>(getStackArgumentsRegion(STC)) 596dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek : static_cast<const MemRegion*>(getStackLocalsRegion(STC)); 597dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek } 598dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek else { 599dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek assert(D->isStaticLocal()); 600dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek const Decl *D = STC->getDecl(); 601dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) 602dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek sReg = getGlobalsRegion(getFunctionTextRegion(FD)); 603dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek else if (const BlockDecl *BD = dyn_cast<BlockDecl>(D)) { 604dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek const BlockTextRegion *BTR = 605dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek getBlockTextRegion(BD, 606dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek C.getCanonicalType(BD->getSignatureAsWritten()->getType()), 6071d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek STC->getAnalysisDeclContext()); 608dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek sReg = getGlobalsRegion(BTR); 609dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek } 610dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek else { 611dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek // FIXME: For ObjC-methods, we need a new CodeTextRegion. For now 612dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek // just use the main global memspace. 613dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek sReg = getGlobalsRegion(); 614dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek } 615dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek } 6162b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek } 61767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 618dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 61967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return getSubRegion<VarRegion>(D, sReg); 62067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek} 6211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 62267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst VarRegion *MemRegionManager::getVarRegion(const VarDecl *D, 62367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const MemRegion *superR) { 62467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return getSubRegion<VarRegion>(D, superR); 6259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} 6269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 627b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst BlockDataRegion * 628b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted KremenekMemRegionManager::getBlockDataRegion(const BlockTextRegion *BC, 629b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const LocationContext *LC) { 63067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const MemRegion *sReg = 0; 631dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 632dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek if (LC) { 63367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek // FIXME: Once we implement scope handling, we want the parent region 634dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek // to be the scope. 63567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackFrameContext *STC = LC->getCurrentStackFrame(); 63667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek assert(STC); 63767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek sReg = getStackLocalsRegion(STC); 63867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 63967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek else { 64067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek // We allow 'LC' to be NULL for cases where want BlockDataRegions 64167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek // without context-sensitivity. 64267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek sReg = getUnknownRegion(); 64367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 64467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 64567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return getSubRegion<BlockDataRegion>(BC, LC, sReg); 6460a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek} 6470a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 648b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst CompoundLiteralRegion* 6499c378f705405d37f49795d5e915989de774fe11fTed KremenekMemRegionManager::getCompoundLiteralRegion(const CompoundLiteralExpr *CL, 65067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *LC) { 651dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 65267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const MemRegion *sReg = 0; 653dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 65467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek if (CL->isFileScope()) 65567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek sReg = getGlobalsRegion(); 65667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek else { 65767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackFrameContext *STC = LC->getCurrentStackFrame(); 65867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek assert(STC); 65967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek sReg = getStackLocalsRegion(STC); 66067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 661dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 66267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return getSubRegion<CompoundLiteralRegion>(CL, sReg); 663329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek} 664329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 665b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst ElementRegion* 66602282acd7a42d06a3178e3102d34a585bd82dd9fTed KremenekMemRegionManager::getElementRegion(QualType elementType, NonLoc Idx, 667465373946b5ae84f7c3d890cc25cb23fd88dd650Ted Kremenek const MemRegion* superRegion, 6689c378f705405d37f49795d5e915989de774fe11fTed Kremenek ASTContext &Ctx){ 669143b2fc6fd3945c250b333383749010c2c8e3a4cZhongxing Xu 67032f901092daa4a53c7e012408c1f59d73ba29ff5Ted Kremenek QualType T = Ctx.getCanonicalType(elementType).getUnqualifiedType(); 671abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek 672511191ce8920160525611be2be754c32a0724c3eZhongxing Xu llvm::FoldingSetNodeID ID; 673143b2fc6fd3945c250b333383749010c2c8e3a4cZhongxing Xu ElementRegion::ProfileRegion(ID, T, Idx, superRegion); 674511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 6759c378f705405d37f49795d5e915989de774fe11fTed Kremenek void *InsertPos; 676511191ce8920160525611be2be754c32a0724c3eZhongxing Xu MemRegion* data = Regions.FindNodeOrInsertPos(ID, InsertPos); 677511191ce8920160525611be2be754c32a0724c3eZhongxing Xu ElementRegion* R = cast_or_null<ElementRegion>(data); 678511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 679511191ce8920160525611be2be754c32a0724c3eZhongxing Xu if (!R) { 680511191ce8920160525611be2be754c32a0724c3eZhongxing Xu R = (ElementRegion*) A.Allocate<ElementRegion>(); 681143b2fc6fd3945c250b333383749010c2c8e3a4cZhongxing Xu new (R) ElementRegion(T, Idx, superRegion); 682511191ce8920160525611be2be754c32a0724c3eZhongxing Xu Regions.InsertNode(R, InsertPos); 683511191ce8920160525611be2be754c32a0724c3eZhongxing Xu } 684511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 685511191ce8920160525611be2be754c32a0724c3eZhongxing Xu return R; 686511191ce8920160525611be2be754c32a0724c3eZhongxing Xu} 687511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 688b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst FunctionTextRegion * 689eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed KremenekMemRegionManager::getFunctionTextRegion(const FunctionDecl *FD) { 69067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return getSubRegion<FunctionTextRegion>(FD, getCodeRegion()); 691ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu} 692ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 693b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst BlockTextRegion * 69467d1287035767f4f6c8ca0c2bb755990012a44caTed KremenekMemRegionManager::getBlockTextRegion(const BlockDecl *BD, CanQualType locTy, 6951d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContext *AC) { 69667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return getSubRegion<BlockTextRegion>(BD, locTy, AC, getCodeRegion()); 697eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek} 698eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 699eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 700993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// getSymbolicRegion - Retrieve or create a "symbolic" memory region. 701b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst SymbolicRegion *MemRegionManager::getSymbolicRegion(SymbolRef sym) { 70267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return getSubRegion<SymbolicRegion>(sym, getUnknownRegion()); 703993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek} 704993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 705de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekconst FieldRegion* 7069c378f705405d37f49795d5e915989de774fe11fTed KremenekMemRegionManager::getFieldRegion(const FieldDecl *d, 707b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemRegion* superRegion){ 708eeea45611d45238c34474c183cee96d47ae79e24Ted Kremenek return getSubRegion<FieldRegion>(d, superRegion); 7099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} 7109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 711b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst ObjCIvarRegion* 7129c378f705405d37f49795d5e915989de774fe11fTed KremenekMemRegionManager::getObjCIvarRegion(const ObjCIvarDecl *d, 713993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek const MemRegion* superRegion) { 714eeea45611d45238c34474c183cee96d47ae79e24Ted Kremenek return getSubRegion<ObjCIvarRegion>(d, superRegion); 715a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek} 716a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 71702fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xuconst CXXTempObjectRegion* 71802fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing XuMemRegionManager::getCXXTempObjectRegion(Expr const *E, 71902fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu LocationContext const *LC) { 720bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu const StackFrameContext *SFC = LC->getCurrentStackFrame(); 721bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu assert(SFC); 72202fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu return getSubRegion<CXXTempObjectRegion>(E, getStackLocalsRegion(SFC)); 723bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu} 724bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 7254fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xuconst CXXBaseObjectRegion * 7264fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing XuMemRegionManager::getCXXBaseObjectRegion(const CXXRecordDecl *decl, 7274fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu const MemRegion *superRegion) { 7284fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu return getSubRegion<CXXBaseObjectRegion>(decl, superRegion); 7294fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu} 7304fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 731de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekconst CXXThisRegion* 732de0d26310191215a6d1d189dc419f87af18ce6beTed KremenekMemRegionManager::getCXXThisRegion(QualType thisPointerTy, 733de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const LocationContext *LC) { 734de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const StackFrameContext *STC = LC->getCurrentStackFrame(); 735de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek assert(STC); 736de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const PointerType *PT = thisPointerTy->getAs<PointerType>(); 737de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek assert(PT); 738de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek return getSubRegion<CXXThisRegion>(PT, getStackArgumentsRegion(STC)); 739de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek} 740de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 741b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst AllocaRegion* 7429c378f705405d37f49795d5e915989de774fe11fTed KremenekMemRegionManager::getAllocaRegion(const Expr *E, unsigned cnt, 74367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *LC) { 74467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackFrameContext *STC = LC->getCurrentStackFrame(); 74567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek assert(STC); 74667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return getSubRegion<AllocaRegion>(E, cnt, getStackLocalsRegion(STC)); 7477090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek} 7487090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek 749bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenekconst MemSpaceRegion *MemRegion::getMemorySpace() const { 750bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek const MemRegion *R = this; 751bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek const SubRegion* SR = dyn_cast<SubRegion>(this); 7521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 753993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek while (SR) { 754bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek R = SR->getSuperRegion(); 755bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek SR = dyn_cast<SubRegion>(R); 7569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 7571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 758bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek return dyn_cast<MemSpaceRegion>(R); 7599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} 7601670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek 761bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenekbool MemRegion::hasStackStorage() const { 76267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return isa<StackSpaceRegion>(getMemorySpace()); 763bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek} 764dd198f04897df87c52fef66398035cbf67fdc33dZhongxing Xu 765de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekbool MemRegion::hasStackNonParametersStorage() const { 766de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek return isa<StackLocalsSpaceRegion>(getMemorySpace()); 7671508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek} 7681508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek 769de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekbool MemRegion::hasStackParametersStorage() const { 77067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return isa<StackArgumentsSpaceRegion>(getMemorySpace()); 771dc147262b1ea0636cf8e7152f19303042dffdbedTed Kremenek} 772dc147262b1ea0636cf8e7152f19303042dffdbedTed Kremenek 7731508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenekbool MemRegion::hasGlobalsOrParametersStorage() const { 77467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const MemSpaceRegion *MS = getMemorySpace(); 77567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return isa<StackArgumentsSpaceRegion>(MS) || 77667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek isa<GlobalsSpaceRegion>(MS); 7771508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek} 7781670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek 779adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu// getBaseRegion strips away all elements and fields, and get the base region 780adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu// of them. 781adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xuconst MemRegion *MemRegion::getBaseRegion() const { 782adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu const MemRegion *R = this; 783adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu while (true) { 78468b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek switch (R->getKind()) { 78568b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek case MemRegion::ElementRegionKind: 78668b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek case MemRegion::FieldRegionKind: 78768b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek case MemRegion::ObjCIvarRegionKind: 788e17da65c5773e0285b22e33d1431b13fbcd8942cZhongxing Xu case MemRegion::CXXBaseObjectRegionKind: 78968b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek R = cast<SubRegion>(R)->getSuperRegion(); 79068b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek continue; 79168b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek default: 79268b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek break; 793adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu } 794adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu break; 795adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu } 796adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu return R; 797adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu} 798adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu 7991670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek//===----------------------------------------------------------------------===// 8001670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek// View handling. 8011670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek//===----------------------------------------------------------------------===// 8021670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek 803479529e679957fbb92b56e116e3c86734429331eZhongxing Xuconst MemRegion *MemRegion::StripCasts() const { 8040e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek const MemRegion *R = this; 8050e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek while (true) { 8061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (const ElementRegion *ER = dyn_cast<ElementRegion>(R)) { 8070e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek // FIXME: generalize. Essentially we want to strip away ElementRegions 8080e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek // that were layered on a symbolic region because of casts. We only 8090e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek // want to strip away ElementRegions, however, where the index is 0. 8100e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek SVal index = ER->getIndex(); 8110e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek if (nonloc::ConcreteInt *CI = dyn_cast<nonloc::ConcreteInt>(&index)) { 81219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek if (CI->getValue().getSExtValue() == 0) { 8130e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek R = ER->getSuperRegion(); 8140e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek continue; 8150e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek } 8160e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek } 8170e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek } 8180e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek break; 8190e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek } 8200e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek return R; 8210e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek} 82219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 82319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// FIXME: Merge with the implementation of the same method in Store.cpp 82419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenekstatic bool IsCompleteType(ASTContext &Ctx, QualType Ty) { 82519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek if (const RecordType *RT = Ty->getAs<RecordType>()) { 82619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek const RecordDecl *D = RT->getDecl(); 827952b017601f9c82b51119c3a1600f1312a833db9Douglas Gregor if (!D->getDefinition()) 82819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek return false; 82919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek } 83019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 83119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek return true; 83219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek} 83319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 8347caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing XuRegionRawOffset ElementRegion::getAsArrayOffset() const { 835199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck CharUnits offset = CharUnits::Zero(); 83619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek const ElementRegion *ER = this; 83719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek const MemRegion *superR = NULL; 83819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek ASTContext &C = getContext(); 8391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 84019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek // FIXME: Handle multi-dimensional arrays. 84119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 84219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek while (ER) { 84319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek superR = ER->getSuperRegion(); 8441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 84519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek // FIXME: generalize to symbolic offsets. 84619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek SVal index = ER->getIndex(); 84719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek if (nonloc::ConcreteInt *CI = dyn_cast<nonloc::ConcreteInt>(&index)) { 84819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek // Update the offset. 84919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek int64_t i = CI->getValue().getSExtValue(); 8501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 85119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek if (i != 0) { 85219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek QualType elemType = ER->getElementType(); 8531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 85419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek // If we are pointing to an incomplete type, go no further. 85519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek if (!IsCompleteType(C, elemType)) { 85619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek superR = ER; 85719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek break; 85819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek } 8591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 860199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck CharUnits size = C.getTypeSizeInChars(elemType); 86119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek offset += (i * size); 86219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek } 86319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 86419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek // Go to the next ElementRegion (if any). 86519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek ER = dyn_cast<ElementRegion>(superR); 86619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek continue; 86719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek } 8681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 86919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek return NULL; 87019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek } 8711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 87219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek assert(superR && "super region cannot be NULL"); 8739ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck return RegionRawOffset(superR, offset); 87419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek} 87519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 876e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing XuRegionOffset MemRegion::getAsOffset() const { 877e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu const MemRegion *R = this; 878e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu int64_t Offset = 0; 879e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu 880e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu while (1) { 881e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu switch (R->getKind()) { 882e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu default: 883e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu return RegionOffset(0); 884e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu case SymbolicRegionKind: 885e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu case AllocaRegionKind: 886e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu case CompoundLiteralRegionKind: 887e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu case CXXThisRegionKind: 888e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu case StringRegionKind: 889e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu case VarRegionKind: 89002fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu case CXXTempObjectRegionKind: 891e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu goto Finish; 892e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu case ElementRegionKind: { 893e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu const ElementRegion *ER = cast<ElementRegion>(R); 894018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu QualType EleTy = ER->getValueType(); 895e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu 896e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu if (!IsCompleteType(getContext(), EleTy)) 897e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu return RegionOffset(0); 898e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu 899e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu SVal Index = ER->getIndex(); 900e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu if (const nonloc::ConcreteInt *CI=dyn_cast<nonloc::ConcreteInt>(&Index)) { 901e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu int64_t i = CI->getValue().getSExtValue(); 902e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu CharUnits Size = getContext().getTypeSizeInChars(EleTy); 903e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu Offset += i * Size.getQuantity() * 8; 904e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu } else { 905e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu // We cannot compute offset for non-concrete index. 906e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu return RegionOffset(0); 907e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu } 908e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu R = ER->getSuperRegion(); 9097caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu break; 910e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu } 911e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu case FieldRegionKind: { 912e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu const FieldRegion *FR = cast<FieldRegion>(R); 913e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu const RecordDecl *RD = FR->getDecl()->getParent(); 9145e1cdac63c3d9c9b32fa41fa0b2d242a58a20d49John McCall if (!RD->isCompleteDefinition()) 915e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu // We cannot compute offset for incomplete type. 916e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu return RegionOffset(0); 917e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu // Get the field number. 918e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu unsigned idx = 0; 919e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu for (RecordDecl::field_iterator FI = RD->field_begin(), 920e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu FE = RD->field_end(); FI != FE; ++FI, ++idx) 921e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu if (FR->getDecl() == *FI) 922e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu break; 9237caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 924e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu const ASTRecordLayout &Layout = getContext().getASTRecordLayout(RD); 925e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu // This is offset in bits. 926e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu Offset += Layout.getFieldOffset(idx); 927e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu R = FR->getSuperRegion(); 928e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu break; 929e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu } 930e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu } 931e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu } 9327caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 933e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu Finish: 934e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu return RegionOffset(R, Offset); 9357caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu} 9367caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 9374240096011a187807058f887eb81df750ffa17feTed Kremenek//===----------------------------------------------------------------------===// 9384240096011a187807058f887eb81df750ffa17feTed Kremenek// BlockDataRegion 9394240096011a187807058f887eb81df750ffa17feTed Kremenek//===----------------------------------------------------------------------===// 9404240096011a187807058f887eb81df750ffa17feTed Kremenek 9414240096011a187807058f887eb81df750ffa17feTed Kremenekvoid BlockDataRegion::LazyInitializeReferencedVars() { 9424240096011a187807058f887eb81df750ffa17feTed Kremenek if (ReferencedVars) 9434240096011a187807058f887eb81df750ffa17feTed Kremenek return; 9444240096011a187807058f887eb81df750ffa17feTed Kremenek 9451d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContext *AC = getCodeRegion()->getAnalysisDeclContext(); 9461d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContext::referenced_decls_iterator I, E; 9474240096011a187807058f887eb81df750ffa17feTed Kremenek llvm::tie(I, E) = AC->getReferencedBlockVars(BC->getDecl()); 948dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 9494240096011a187807058f887eb81df750ffa17feTed Kremenek if (I == E) { 9504240096011a187807058f887eb81df750ffa17feTed Kremenek ReferencedVars = (void*) 0x1; 9514240096011a187807058f887eb81df750ffa17feTed Kremenek return; 9524240096011a187807058f887eb81df750ffa17feTed Kremenek } 953dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 9544240096011a187807058f887eb81df750ffa17feTed Kremenek MemRegionManager &MemMgr = *getMemRegionManager(); 9554240096011a187807058f887eb81df750ffa17feTed Kremenek llvm::BumpPtrAllocator &A = MemMgr.getAllocator(); 9564240096011a187807058f887eb81df750ffa17feTed Kremenek BumpVectorContext BC(A); 957dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 9584240096011a187807058f887eb81df750ffa17feTed Kremenek typedef BumpVector<const MemRegion*> VarVec; 9594240096011a187807058f887eb81df750ffa17feTed Kremenek VarVec *BV = (VarVec*) A.Allocate<VarVec>(); 96002b1df62ff6fa9526619ee0db78e2af4186e490dTed Kremenek new (BV) VarVec(BC, E - I); 961dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 96267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek for ( ; I != E; ++I) { 96367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const VarDecl *VD = *I; 96467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const VarRegion *VR = 0; 965dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 96685248734f404fbb9b2f88ecd5296761a8578def6Ted Kremenek if (!VD->getAttr<BlocksAttr>() && VD->hasLocalStorage()) 96767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek VR = MemMgr.getVarRegion(VD, this); 96867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek else { 96967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek if (LC) 97067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek VR = MemMgr.getVarRegion(VD, LC); 97167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek else { 97267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek VR = MemMgr.getVarRegion(VD, MemMgr.getUnknownRegion()); 97367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 97467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 975dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 97667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek assert(VR); 97767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BV->push_back(VR, BC); 97867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 979dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 9804240096011a187807058f887eb81df750ffa17feTed Kremenek ReferencedVars = BV; 9814240096011a187807058f887eb81df750ffa17feTed Kremenek} 9824240096011a187807058f887eb81df750ffa17feTed Kremenek 9834240096011a187807058f887eb81df750ffa17feTed KremenekBlockDataRegion::referenced_vars_iterator 9844240096011a187807058f887eb81df750ffa17feTed KremenekBlockDataRegion::referenced_vars_begin() const { 9854240096011a187807058f887eb81df750ffa17feTed Kremenek const_cast<BlockDataRegion*>(this)->LazyInitializeReferencedVars(); 9864240096011a187807058f887eb81df750ffa17feTed Kremenek 9874240096011a187807058f887eb81df750ffa17feTed Kremenek BumpVector<const MemRegion*> *Vec = 9884240096011a187807058f887eb81df750ffa17feTed Kremenek static_cast<BumpVector<const MemRegion*>*>(ReferencedVars); 989dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 99081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return BlockDataRegion::referenced_vars_iterator(Vec == (void*) 0x1 ? 99181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek NULL : Vec->begin()); 9924240096011a187807058f887eb81df750ffa17feTed Kremenek} 9934240096011a187807058f887eb81df750ffa17feTed Kremenek 9944240096011a187807058f887eb81df750ffa17feTed KremenekBlockDataRegion::referenced_vars_iterator 9954240096011a187807058f887eb81df750ffa17feTed KremenekBlockDataRegion::referenced_vars_end() const { 9964240096011a187807058f887eb81df750ffa17feTed Kremenek const_cast<BlockDataRegion*>(this)->LazyInitializeReferencedVars(); 9974240096011a187807058f887eb81df750ffa17feTed Kremenek 9984240096011a187807058f887eb81df750ffa17feTed Kremenek BumpVector<const MemRegion*> *Vec = 9994240096011a187807058f887eb81df750ffa17feTed Kremenek static_cast<BumpVector<const MemRegion*>*>(ReferencedVars); 1000dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 100181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek return BlockDataRegion::referenced_vars_iterator(Vec == (void*) 0x1 ? 100281cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek NULL : Vec->end()); 10034240096011a187807058f887eb81df750ffa17feTed Kremenek} 1004