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" 172fa67efeaf66a9332c30a026dc1c21bef6c33a6cBenjamin Kramer#include "clang/AST/Attr.h" 18199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck#include "clang/AST/CharUnits.h" 19c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer#include "clang/AST/DeclObjC.h" 207caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu#include "clang/AST/RecordLayout.h" 2155fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Analysis/AnalysisContext.h" 2255fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Analysis/Support/BumpVector.h" 23eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks#include "clang/Basic/SourceManager.h" 2455fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/StaticAnalyzer/Core/PathSensitive/SValBuilder.h" 251309f9a3b225ea846e5822691c39a77423125505Ted Kremenek#include "llvm/Support/raw_ostream.h" 269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekusing namespace clang; 289ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremenekusing namespace ento; 299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 30250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 31bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek// MemRegion Construction. 32bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek//===----------------------------------------------------------------------===// 33bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek 34bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenektemplate<typename RegionTy> struct MemRegionManagerTrait; 35bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek 36bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenektemplate <typename RegionTy, typename A1> 37bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted KremenekRegionTy* MemRegionManager::getRegion(const A1 a1) { 38dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 39bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek const typename MemRegionManagerTrait<RegionTy>::SuperRegionTy *superRegion = 40bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek MemRegionManagerTrait<RegionTy>::getSuperRegion(*this, a1); 41dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 42bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek llvm::FoldingSetNodeID ID; 43bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek RegionTy::ProfileRegion(ID, a1, superRegion); 449c378f705405d37f49795d5e915989de774fe11fTed Kremenek void *InsertPos; 45bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID, 46bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek InsertPos)); 47dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 48bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek if (!R) { 49bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek R = (RegionTy*) A.Allocate<RegionTy>(); 50bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek new (R) RegionTy(a1, superRegion); 51bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek Regions.InsertNode(R, InsertPos); 52bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek } 53dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 54bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek return R; 55bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek} 56bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek 57bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenektemplate <typename RegionTy, typename A1> 58bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted KremenekRegionTy* MemRegionManager::getSubRegion(const A1 a1, 59bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek const MemRegion *superRegion) { 60bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek llvm::FoldingSetNodeID ID; 61bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek RegionTy::ProfileRegion(ID, a1, superRegion); 629c378f705405d37f49795d5e915989de774fe11fTed Kremenek void *InsertPos; 63bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID, 64bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek InsertPos)); 65dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 66bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek if (!R) { 67bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek R = (RegionTy*) A.Allocate<RegionTy>(); 68bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek new (R) RegionTy(a1, superRegion); 69bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek Regions.InsertNode(R, InsertPos); 70bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek } 71dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 72bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek return R; 73bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek} 74bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek 75bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenektemplate <typename RegionTy, typename A1, typename A2> 76bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted KremenekRegionTy* MemRegionManager::getRegion(const A1 a1, const A2 a2) { 77dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 78bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek const typename MemRegionManagerTrait<RegionTy>::SuperRegionTy *superRegion = 79bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek MemRegionManagerTrait<RegionTy>::getSuperRegion(*this, a1, a2); 80dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 81bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek llvm::FoldingSetNodeID ID; 82bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek RegionTy::ProfileRegion(ID, a1, a2, superRegion); 839c378f705405d37f49795d5e915989de774fe11fTed Kremenek void *InsertPos; 84bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID, 85bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek InsertPos)); 86dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 87bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek if (!R) { 88bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek R = (RegionTy*) A.Allocate<RegionTy>(); 89bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek new (R) RegionTy(a1, a2, superRegion); 90bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek Regions.InsertNode(R, InsertPos); 91bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek } 92dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 93bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek return R; 94bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek} 95bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek 96bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenektemplate <typename RegionTy, typename A1, typename A2> 97bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted KremenekRegionTy* MemRegionManager::getSubRegion(const A1 a1, const A2 a2, 98bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek const MemRegion *superRegion) { 99dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 100bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek llvm::FoldingSetNodeID ID; 101bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek RegionTy::ProfileRegion(ID, a1, a2, superRegion); 1029c378f705405d37f49795d5e915989de774fe11fTed Kremenek void *InsertPos; 103bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID, 104bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek InsertPos)); 105dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 106bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek if (!R) { 107bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek R = (RegionTy*) A.Allocate<RegionTy>(); 108bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek new (R) RegionTy(a1, a2, superRegion); 109bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek Regions.InsertNode(R, InsertPos); 110bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek } 111dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 112bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek return R; 113bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek} 114bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek 11567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenektemplate <typename RegionTy, typename A1, typename A2, typename A3> 11667d1287035767f4f6c8ca0c2bb755990012a44caTed KremenekRegionTy* MemRegionManager::getSubRegion(const A1 a1, const A2 a2, const A3 a3, 11767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const MemRegion *superRegion) { 118dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 11967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek llvm::FoldingSetNodeID ID; 12067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek RegionTy::ProfileRegion(ID, a1, a2, a3, superRegion); 1219c378f705405d37f49795d5e915989de774fe11fTed Kremenek void *InsertPos; 12267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID, 12367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek InsertPos)); 124dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 12567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek if (!R) { 12667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek R = (RegionTy*) A.Allocate<RegionTy>(); 12767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek new (R) RegionTy(a1, a2, a3, superRegion); 12867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek Regions.InsertNode(R, InsertPos); 129bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek } 130dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 13167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return R; 13267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek} 133bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek 134bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek//===----------------------------------------------------------------------===// 1354240096011a187807058f887eb81df750ffa17feTed Kremenek// Object destruction. 136250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 1379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed KremenekMemRegion::~MemRegion() {} 1399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1404240096011a187807058f887eb81df750ffa17feTed KremenekMemRegionManager::~MemRegionManager() { 1414240096011a187807058f887eb81df750ffa17feTed Kremenek // All regions and their data are BumpPtrAllocated. No need to call 1424240096011a187807058f887eb81df750ffa17feTed Kremenek // their destructors. 1434240096011a187807058f887eb81df750ffa17feTed Kremenek} 1444240096011a187807058f887eb81df750ffa17feTed Kremenek 1454240096011a187807058f887eb81df750ffa17feTed Kremenek//===----------------------------------------------------------------------===// 1464240096011a187807058f887eb81df750ffa17feTed Kremenek// Basic methods. 1474240096011a187807058f887eb81df750ffa17feTed Kremenek//===----------------------------------------------------------------------===// 1484240096011a187807058f887eb81df750ffa17feTed Kremenek 1497e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xubool SubRegion::isSubRegionOf(const MemRegion* R) const { 1507e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu const MemRegion* r = getSuperRegion(); 1517e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu while (r != 0) { 1527e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu if (r == R) 1537e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu return true; 1547e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu if (const SubRegion* sr = dyn_cast<SubRegion>(r)) 1557e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu r = sr->getSuperRegion(); 1567e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu else 1577e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu break; 1587e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu } 1597e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu return false; 1607e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu} 1617e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu 162a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted KremenekMemRegionManager* SubRegion::getMemRegionManager() const { 163a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek const SubRegion* r = this; 164a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek do { 165a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek const MemRegion *superRegion = r->getSuperRegion(); 166a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek if (const SubRegion *sr = dyn_cast<SubRegion>(superRegion)) { 167a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek r = sr; 168a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek continue; 169a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek } 170a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek return superRegion->getMemRegionManager(); 171a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek } while (1); 172a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek} 173a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 1745348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenekconst StackFrameContext *VarRegion::getStackFrame() const { 1755348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek const StackSpaceRegion *SSR = dyn_cast<StackSpaceRegion>(getMemorySpace()); 1765348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek return SSR ? SSR->getStackFrame() : NULL; 1775348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek} 1785348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek 1795348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek//===----------------------------------------------------------------------===// 18032f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose// Region extents. 18132f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose//===----------------------------------------------------------------------===// 18232f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 183e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan RoseDefinedOrUnknownSVal TypedValueRegion::getExtent(SValBuilder &svalBuilder) const { 1849c378f705405d37f49795d5e915989de774fe11fTed Kremenek ASTContext &Ctx = svalBuilder.getContext(); 18549f4e1cbd839da27ff4814b4ea6d85a79f786cbdJohn McCall QualType T = getDesugaredValueType(Ctx); 18632f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 18752e04c537633377fb14cfa4fa3c95e3e510fc942Jordy Rose if (isa<VariableArrayType>(T)) 188c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek return nonloc::SymbolVal(svalBuilder.getSymbolManager().getExtentSymbol(this)); 1891acb394679b6e644044a0f6c358229759009b1a6Jordan Rose if (T->isIncompleteType()) 19032f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose return UnknownVal(); 19132f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 19299c330d0149abeb7f5e52a30ad329f2588c01671Ted Kremenek CharUnits size = Ctx.getTypeSizeInChars(T); 19399c330d0149abeb7f5e52a30ad329f2588c01671Ted Kremenek QualType sizeTy = svalBuilder.getArrayIndexType(); 19499c330d0149abeb7f5e52a30ad329f2588c01671Ted Kremenek return svalBuilder.makeIntVal(size.getQuantity(), sizeTy); 19532f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose} 19632f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 197c8413fd03f73084a5c93028f8b4db619fc388087Ted KremenekDefinedOrUnknownSVal FieldRegion::getExtent(SValBuilder &svalBuilder) const { 198d764e20189dbb42b38ada383a0a159f6adc0d56cJordan Rose // Force callers to deal with bitfields explicitly. 199d764e20189dbb42b38ada383a0a159f6adc0d56cJordan Rose if (getDecl()->isBitField()) 200d764e20189dbb42b38ada383a0a159f6adc0d56cJordan Rose return UnknownVal(); 201d764e20189dbb42b38ada383a0a159f6adc0d56cJordan Rose 202c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek DefinedOrUnknownSVal Extent = DeclRegion::getExtent(svalBuilder); 20332f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 20432f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose // A zero-length array at the end of a struct often stands for dynamically- 20532f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose // allocated extra memory. 20632f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose if (Extent.isZeroConstant()) { 20749f4e1cbd839da27ff4814b4ea6d85a79f786cbdJohn McCall QualType T = getDesugaredValueType(svalBuilder.getContext()); 20832f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 20932f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose if (isa<ConstantArrayType>(T)) 21032f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose return UnknownVal(); 21132f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose } 21232f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 21332f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose return Extent; 21432f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose} 21532f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 216c8413fd03f73084a5c93028f8b4db619fc388087Ted KremenekDefinedOrUnknownSVal AllocaRegion::getExtent(SValBuilder &svalBuilder) const { 217c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek return nonloc::SymbolVal(svalBuilder.getSymbolManager().getExtentSymbol(this)); 21832f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose} 21932f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 220c8413fd03f73084a5c93028f8b4db619fc388087Ted KremenekDefinedOrUnknownSVal SymbolicRegion::getExtent(SValBuilder &svalBuilder) const { 221c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek return nonloc::SymbolVal(svalBuilder.getSymbolManager().getExtentSymbol(this)); 22232f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose} 22332f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 224c8413fd03f73084a5c93028f8b4db619fc388087Ted KremenekDefinedOrUnknownSVal StringRegion::getExtent(SValBuilder &svalBuilder) const { 22599c330d0149abeb7f5e52a30ad329f2588c01671Ted Kremenek return svalBuilder.makeIntVal(getStringLiteral()->getByteLength()+1, 22699c330d0149abeb7f5e52a30ad329f2588c01671Ted Kremenek svalBuilder.getArrayIndexType()); 22732f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose} 22832f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 229c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin KramerObjCIvarRegion::ObjCIvarRegion(const ObjCIvarDecl *ivd, const MemRegion* sReg) 230c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer : DeclRegion(ivd, sReg, ObjCIvarRegionKind) {} 231c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer 232c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramerconst ObjCIvarDecl *ObjCIvarRegion::getDecl() const { 233c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer return cast<ObjCIvarDecl>(D); 234c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer} 235c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer 236c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin KramerQualType ObjCIvarRegion::getValueType() const { 237c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer return getDecl()->getType(); 238c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer} 239c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer 2404fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing XuQualType CXXBaseObjectRegion::getValueType() const { 2414411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose return QualType(getDecl()->getTypeForDecl(), 0); 2424fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu} 2434fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 24432f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose//===----------------------------------------------------------------------===// 2455348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek// FoldingSet profiling. 2465348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek//===----------------------------------------------------------------------===// 2475348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek 2489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekvoid MemSpaceRegion::Profile(llvm::FoldingSetNodeID& ID) const { 2499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek ID.AddInteger((unsigned)getKind()); 2509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} 2519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 25267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekvoid StackSpaceRegion::Profile(llvm::FoldingSetNodeID &ID) const { 25367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek ID.AddInteger((unsigned)getKind()); 25467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek ID.AddPointer(getStackFrame()); 25567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek} 25667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 257dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekvoid StaticGlobalSpaceRegion::Profile(llvm::FoldingSetNodeID &ID) const { 258dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek ID.AddInteger((unsigned)getKind()); 259dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek ID.AddPointer(getCodeRegion()); 260dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek} 261dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 2621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid StringRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, 2631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const StringLiteral* Str, 264e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const MemRegion* superRegion) { 265e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu ID.AddInteger((unsigned) StringRegionKind); 266e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu ID.AddPointer(Str); 267e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu ID.AddPointer(superRegion); 268e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu} 269e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 2704c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekvoid ObjCStringRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, 2714c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek const ObjCStringLiteral* Str, 2724c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek const MemRegion* superRegion) { 2734c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek ID.AddInteger((unsigned) ObjCStringRegionKind); 2744c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek ID.AddPointer(Str); 2754c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek ID.AddPointer(superRegion); 2764c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek} 2774c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 2787090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenekvoid AllocaRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, 2799c378f705405d37f49795d5e915989de774fe11fTed Kremenek const Expr *Ex, unsigned cnt, 280dac6cd533d90fa1f75e66f83f7d5ebc12e34bfb7Anna Zaks const MemRegion *superRegion) { 2817090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek ID.AddInteger((unsigned) AllocaRegionKind); 2827090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek ID.AddPointer(Ex); 2837090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek ID.AddInteger(cnt); 284dac6cd533d90fa1f75e66f83f7d5ebc12e34bfb7Anna Zaks ID.AddPointer(superRegion); 2857090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek} 2867090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek 2877090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenekvoid AllocaRegion::Profile(llvm::FoldingSetNodeID& ID) const { 2887ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek ProfileRegion(ID, Ex, Cnt, superRegion); 2897090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek} 2907090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek 291329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekvoid CompoundLiteralRegion::Profile(llvm::FoldingSetNodeID& ID) const { 292329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek CompoundLiteralRegion::ProfileRegion(ID, CL, superRegion); 293329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek} 294329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 295329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekvoid CompoundLiteralRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, 2969c378f705405d37f49795d5e915989de774fe11fTed Kremenek const CompoundLiteralExpr *CL, 297329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek const MemRegion* superRegion) { 298329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek ID.AddInteger((unsigned) CompoundLiteralRegionKind); 299329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek ID.AddPointer(CL); 300329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek ID.AddPointer(superRegion); 301329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek} 302329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 303de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekvoid CXXThisRegion::ProfileRegion(llvm::FoldingSetNodeID &ID, 304de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const PointerType *PT, 305de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const MemRegion *sRegion) { 306de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek ID.AddInteger((unsigned) CXXThisRegionKind); 307de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek ID.AddPointer(PT); 308de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek ID.AddPointer(sRegion); 309de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek} 310de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 311de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekvoid CXXThisRegion::Profile(llvm::FoldingSetNodeID &ID) const { 312de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek CXXThisRegion::ProfileRegion(ID, ThisPointerTy, superRegion); 313de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek} 314dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 315c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramervoid ObjCIvarRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, 316c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer const ObjCIvarDecl *ivd, 317c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer const MemRegion* superRegion) { 318c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCIvarRegionKind); 319c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer} 320c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer 3219c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid DeclRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl *D, 3229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion, Kind k) { 3239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek ID.AddInteger((unsigned) k); 3249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek ID.AddPointer(D); 3259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek ID.AddPointer(superRegion); 3269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} 3279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekvoid DeclRegion::Profile(llvm::FoldingSetNodeID& ID) const { 3299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, D, superRegion, getKind()); 3309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} 3319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 332d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenekvoid VarRegion::Profile(llvm::FoldingSetNodeID &ID) const { 33367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek VarRegion::ProfileRegion(ID, getDecl(), superRegion); 334d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek} 335d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek 336250101353b711a409b075f1bc11070dddec7100bTed Kremenekvoid SymbolicRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, SymbolRef sym, 337250101353b711a409b075f1bc11070dddec7100bTed Kremenek const MemRegion *sreg) { 338993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek ID.AddInteger((unsigned) MemRegion::SymbolicRegionKind); 3396d0e2d2f3c1b6531f303aac7e48aa1eb05900f2aTed Kremenek ID.Add(sym); 340250101353b711a409b075f1bc11070dddec7100bTed Kremenek ID.AddPointer(sreg); 341993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek} 342993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 343993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekvoid SymbolicRegion::Profile(llvm::FoldingSetNodeID& ID) const { 344250101353b711a409b075f1bc11070dddec7100bTed Kremenek SymbolicRegion::ProfileRegion(ID, sym, getSuperRegion()); 345993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek} 346993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 347f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenekvoid ElementRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, 3481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType ElementType, SVal Idx, 349511191ce8920160525611be2be754c32a0724c3eZhongxing Xu const MemRegion* superRegion) { 350511191ce8920160525611be2be754c32a0724c3eZhongxing Xu ID.AddInteger(MemRegion::ElementRegionKind); 351f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek ID.Add(ElementType); 352511191ce8920160525611be2be754c32a0724c3eZhongxing Xu ID.AddPointer(superRegion); 353511191ce8920160525611be2be754c32a0724c3eZhongxing Xu Idx.Profile(ID); 354511191ce8920160525611be2be754c32a0724c3eZhongxing Xu} 355511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 356511191ce8920160525611be2be754c32a0724c3eZhongxing Xuvoid ElementRegion::Profile(llvm::FoldingSetNodeID& ID) const { 357f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek ElementRegion::ProfileRegion(ID, ElementType, Index, superRegion); 358511191ce8920160525611be2be754c32a0724c3eZhongxing Xu} 35927b57063d83b00474d7563fb5d608544e2364862Zhongxing Xu 360eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekvoid FunctionTextRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, 3615fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks const NamedDecl *FD, 362eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek const MemRegion*) { 363eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek ID.AddInteger(MemRegion::FunctionTextRegionKind); 364abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek ID.AddPointer(FD); 365ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu} 366ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 367eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekvoid FunctionTextRegion::Profile(llvm::FoldingSetNodeID& ID) const { 368eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek FunctionTextRegion::ProfileRegion(ID, FD, superRegion); 369eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek} 370eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 371eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekvoid BlockTextRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, 37267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const BlockDecl *BD, CanQualType, 3731d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek const AnalysisDeclContext *AC, 37467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const MemRegion*) { 375eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek ID.AddInteger(MemRegion::BlockTextRegionKind); 376eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek ID.AddPointer(BD); 377eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek} 378eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 379eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekvoid BlockTextRegion::Profile(llvm::FoldingSetNodeID& ID) const { 38067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BlockTextRegion::ProfileRegion(ID, BD, locTy, AC, superRegion); 381ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu} 382ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 3830a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenekvoid BlockDataRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, 3840a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek const BlockTextRegion *BC, 3850a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek const LocationContext *LC, 38667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const MemRegion *sReg) { 3870a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek ID.AddInteger(MemRegion::BlockDataRegionKind); 3880a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek ID.AddPointer(BC); 3890a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek ID.AddPointer(LC); 39067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek ID.AddPointer(sReg); 3910a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek} 3920a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 3930a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenekvoid BlockDataRegion::Profile(llvm::FoldingSetNodeID& ID) const { 39467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BlockDataRegion::ProfileRegion(ID, BC, LC, getSuperRegion()); 3950a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek} 3960a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 39702fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xuvoid CXXTempObjectRegion::ProfileRegion(llvm::FoldingSetNodeID &ID, 39802fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu Expr const *Ex, 39902fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu const MemRegion *sReg) { 400bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu ID.AddPointer(Ex); 401bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu ID.AddPointer(sReg); 402bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu} 403bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 40402fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xuvoid CXXTempObjectRegion::Profile(llvm::FoldingSetNodeID &ID) const { 405bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu ProfileRegion(ID, Ex, getSuperRegion()); 406bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu} 407bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 4084fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xuvoid CXXBaseObjectRegion::ProfileRegion(llvm::FoldingSetNodeID &ID, 4094411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose const CXXRecordDecl *RD, 4104411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose bool IsVirtual, 4114411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose const MemRegion *SReg) { 4124411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose ID.AddPointer(RD); 4134411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose ID.AddBoolean(IsVirtual); 4144411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose ID.AddPointer(SReg); 4154fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu} 4164fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 4174fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xuvoid CXXBaseObjectRegion::Profile(llvm::FoldingSetNodeID &ID) const { 4184411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose ProfileRegion(ID, getDecl(), isVirtual(), superRegion); 4194fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu} 4204fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 421026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu//===----------------------------------------------------------------------===// 42299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie// Region anchors. 42399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===// 42499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 42599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid GlobalsSpaceRegion::anchor() { } 42699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid HeapSpaceRegion::anchor() { } 42799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid UnknownSpaceRegion::anchor() { } 42899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid StackLocalsSpaceRegion::anchor() { } 42999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid StackArgumentsSpaceRegion::anchor() { } 43099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid TypedRegion::anchor() { } 43199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid TypedValueRegion::anchor() { } 43299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid CodeTextRegion::anchor() { } 43399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid SubRegion::anchor() { } 43499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 43599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===// 4369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// Region pretty-printing. 4379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 4389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4398800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenekvoid MemRegion::dump() const { 4408800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek dumpToStream(llvm::errs()); 4417f39d29cb69e7488f994870800d548008e50e1cbTed Kremenek} 4427f39d29cb69e7488f994870800d548008e50e1cbTed Kremenek 4439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekstd::string MemRegion::getString() const { 4449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek std::string s; 4459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek llvm::raw_string_ostream os(s); 4468800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek dumpToStream(os); 4479e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return os.str(); 4489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} 4499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4509c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid MemRegion::dumpToStream(raw_ostream &os) const { 4519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek os << "<Unknown Region>"; 4529e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} 4539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4549c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid AllocaRegion::dumpToStream(raw_ostream &os) const { 45531ba6135375433b617a8587ea6cc836a014ebd86Roman Divacky os << "alloca{" << (const void*) Ex << ',' << Cnt << '}'; 4567090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek} 4577090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek 4589c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid FunctionTextRegion::dumpToStream(raw_ostream &os) const { 459abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek os << "code{" << getDecl()->getDeclName().getAsString() << '}'; 46072e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek} 46172e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek 4629c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid BlockTextRegion::dumpToStream(raw_ostream &os) const { 46331ba6135375433b617a8587ea6cc836a014ebd86Roman Divacky os << "block_code{" << (const void*) this << '}'; 464eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek} 465eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 4669c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid BlockDataRegion::dumpToStream(raw_ostream &os) const { 4670a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek os << "block_data{" << BC << '}'; 4680a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek} 4690a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 4709c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid CompoundLiteralRegion::dumpToStream(raw_ostream &os) const { 4715639a3ec15bdbf0b93376bbbae3adaf724f092a7Ted Kremenek // FIXME: More elaborate pretty-printing. 47231ba6135375433b617a8587ea6cc836a014ebd86Roman Divacky os << "{ " << (const void*) CL << " }"; 4739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} 4749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4755f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid CXXTempObjectRegion::dumpToStream(raw_ostream &os) const { 476782f63ecd124f9384f988dc7e0cf4ae1540c15f6Jeffrey Yasskin os << "temp_object{" << getValueType().getAsString() << ',' 47731ba6135375433b617a8587ea6cc836a014ebd86Roman Divacky << (const void*) Ex << '}'; 478e1aeb13251a4858724d2b7ad1925d25076f23d08Zhongxing Xu} 479e1aeb13251a4858724d2b7ad1925d25076f23d08Zhongxing Xu 4805f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid CXXBaseObjectRegion::dumpToStream(raw_ostream &os) const { 4814411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose os << "base{" << superRegion << ',' << getDecl()->getName() << '}'; 4824fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu} 4834fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 4845f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid CXXThisRegion::dumpToStream(raw_ostream &os) const { 485de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek os << "this"; 486de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek} 487de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 4889c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid ElementRegion::dumpToStream(raw_ostream &os) const { 48919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek os << "element{" << superRegion << ',' 49019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek << Index << ',' << getElementType().getAsString() << '}'; 491993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek} 492993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 4939c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid FieldRegion::dumpToStream(raw_ostream &os) const { 494b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer os << superRegion << "->" << *getDecl(); 4954bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek} 4964bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek 4979c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid ObjCIvarRegion::dumpToStream(raw_ostream &os) const { 498b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer os << "ivar{" << superRegion << ',' << *getDecl() << '}'; 499bcfe03a0beb61082fa2f40887216d8dbca19a024Ted Kremenek} 500bcfe03a0beb61082fa2f40887216d8dbca19a024Ted Kremenek 5019c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid StringRegion::dumpToStream(raw_ostream &os) const { 5024e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie Str->printPretty(os, 0, PrintingPolicy(getContext().getLangOpts())); 503b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu} 504b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 5054c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekvoid ObjCStringRegion::dumpToStream(raw_ostream &os) const { 5064e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie Str->printPretty(os, 0, PrintingPolicy(getContext().getLangOpts())); 5074c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek} 5084c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 5099c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid SymbolicRegion::dumpToStream(raw_ostream &os) const { 510aef5d2205a4425a4d3e1b0e28d46ed80763651dfTed Kremenek os << "SymRegion{" << sym << '}'; 511329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek} 512329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 5139c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid VarRegion::dumpToStream(raw_ostream &os) const { 514b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer os << *cast<VarDecl>(D); 515cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu} 516cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu 51719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenekvoid RegionRawOffset::dump() const { 51819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek dumpToStream(llvm::errs()); 51919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek} 52019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 5219c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid RegionRawOffset::dumpToStream(raw_ostream &os) const { 5229ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck os << "raw_offset{" << getRegion() << ',' << getOffset().getQuantity() << '}'; 52319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek} 52419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 5255f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid StaticGlobalSpaceRegion::dumpToStream(raw_ostream &os) const { 526fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek os << "StaticGlobalsMemSpace{" << CR << '}'; 527fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek} 528fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek 529eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksvoid GlobalInternalSpaceRegion::dumpToStream(raw_ostream &os) const { 530eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks os << "GlobalInternalSpaceRegion"; 531eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks} 532eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 533eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksvoid GlobalSystemSpaceRegion::dumpToStream(raw_ostream &os) const { 534eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks os << "GlobalSystemSpaceRegion"; 535eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks} 536eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 537eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksvoid GlobalImmutableSpaceRegion::dumpToStream(raw_ostream &os) const { 538eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks os << "GlobalImmutableSpaceRegion"; 539eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks} 540eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 54136397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rosevoid HeapSpaceRegion::dumpToStream(raw_ostream &os) const { 54236397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose os << "HeapSpaceRegion"; 54336397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose} 54436397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 54536397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rosevoid UnknownSpaceRegion::dumpToStream(raw_ostream &os) const { 54636397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose os << "UnknownSpaceRegion"; 54736397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose} 54836397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 54936397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rosevoid StackArgumentsSpaceRegion::dumpToStream(raw_ostream &os) const { 55036397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose os << "StackArgumentsSpaceRegion"; 55136397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose} 55236397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 55336397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rosevoid StackLocalsSpaceRegion::dumpToStream(raw_ostream &os) const { 55436397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose os << "StackLocalsSpaceRegion"; 55536397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose} 55636397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 557919e8a1c6698bfa6848571d366430126bced727dJordan Rosebool MemRegion::canPrintPretty() const { 558716859df842e5a56e816d820d8326ead152dd9e4Anna Zaks return canPrintPrettyAsExpr(); 559919e8a1c6698bfa6848571d366430126bced727dJordan Rose} 560919e8a1c6698bfa6848571d366430126bced727dJordan Rose 56179d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaksbool MemRegion::canPrintPrettyAsExpr() const { 562716859df842e5a56e816d820d8326ead152dd9e4Anna Zaks return false; 56379d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks} 56479d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks 565919e8a1c6698bfa6848571d366430126bced727dJordan Rosevoid MemRegion::printPretty(raw_ostream &os) const { 5669e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks assert(canPrintPretty() && "This region cannot be printed pretty."); 5679e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks os << "'"; 56879d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks printPrettyAsExpr(os); 5699e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks os << "'"; 5709e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks return; 5719e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks} 5729e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks 57379d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaksvoid MemRegion::printPrettyAsExpr(raw_ostream &os) const { 57479d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks llvm_unreachable("This region cannot be printed pretty."); 5753d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks return; 5763d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks} 5773d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks 578716859df842e5a56e816d820d8326ead152dd9e4Anna Zaksbool VarRegion::canPrintPrettyAsExpr() const { 579919e8a1c6698bfa6848571d366430126bced727dJordan Rose return true; 580919e8a1c6698bfa6848571d366430126bced727dJordan Rose} 581919e8a1c6698bfa6848571d366430126bced727dJordan Rose 58279d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaksvoid VarRegion::printPrettyAsExpr(raw_ostream &os) const { 5833d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks os << getDecl()->getName(); 5843d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks} 5853d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks 586716859df842e5a56e816d820d8326ead152dd9e4Anna Zaksbool ObjCIvarRegion::canPrintPrettyAsExpr() const { 58743b82b823a6113fdbee54243b280db9c55ef72cbTed Kremenek return true; 58843b82b823a6113fdbee54243b280db9c55ef72cbTed Kremenek} 58943b82b823a6113fdbee54243b280db9c55ef72cbTed Kremenek 59079d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaksvoid ObjCIvarRegion::printPrettyAsExpr(raw_ostream &os) const { 59143b82b823a6113fdbee54243b280db9c55ef72cbTed Kremenek os << getDecl()->getName(); 59243b82b823a6113fdbee54243b280db9c55ef72cbTed Kremenek} 59343b82b823a6113fdbee54243b280db9c55ef72cbTed Kremenek 594919e8a1c6698bfa6848571d366430126bced727dJordan Rosebool FieldRegion::canPrintPretty() const { 5959e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks return true; 5969e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks} 5979e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks 59879d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaksbool FieldRegion::canPrintPrettyAsExpr() const { 59979d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks return superRegion->canPrintPrettyAsExpr(); 60079d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks} 60179d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks 60279d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaksvoid FieldRegion::printPrettyAsExpr(raw_ostream &os) const { 60379d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks assert(canPrintPrettyAsExpr()); 60479d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks superRegion->printPrettyAsExpr(os); 60579d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks os << "." << getDecl()->getName(); 606919e8a1c6698bfa6848571d366430126bced727dJordan Rose} 607919e8a1c6698bfa6848571d366430126bced727dJordan Rose 608919e8a1c6698bfa6848571d366430126bced727dJordan Rosevoid FieldRegion::printPretty(raw_ostream &os) const { 60979d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks if (canPrintPrettyAsExpr()) { 6109e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks os << "\'"; 61179d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks printPrettyAsExpr(os); 6129e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks os << "'"; 6139e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks } else { 61479d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks os << "field " << "\'" << getDecl()->getName() << "'"; 6159e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks } 6169e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks return; 6173d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks} 6183d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks 61907d8470effc0b0364801adddb6ff92bd22334402Anna Zaksbool CXXBaseObjectRegion::canPrintPrettyAsExpr() const { 62079d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks return superRegion->canPrintPrettyAsExpr(); 62179d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks} 62279d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks 62307d8470effc0b0364801adddb6ff92bd22334402Anna Zaksvoid CXXBaseObjectRegion::printPrettyAsExpr(raw_ostream &os) const { 62407d8470effc0b0364801adddb6ff92bd22334402Anna Zaks superRegion->printPrettyAsExpr(os); 62507d8470effc0b0364801adddb6ff92bd22334402Anna Zaks} 62607d8470effc0b0364801adddb6ff92bd22334402Anna Zaks 6279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 6289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager methods. 6299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 63019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 63167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenektemplate <typename REG> 63267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst REG *MemRegionManager::LazyAllocate(REG*& region) { 6331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!region) { 63467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek region = (REG*) A.Allocate<REG>(); 63567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek new (region) REG(this); 6369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 637a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 6389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return region; 6399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} 6409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 64167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenektemplate <typename REG, typename ARG> 64267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst REG *MemRegionManager::LazyAllocate(REG*& region, ARG a) { 64367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek if (!region) { 64467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek region = (REG*) A.Allocate<REG>(); 64567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek new (region) REG(this, a); 64667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 647dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 64867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return region; 64967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek} 65067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 65167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst StackLocalsSpaceRegion* 6522b87ae45e129b941d0a4d221c9d4842385a119bdTed KremenekMemRegionManager::getStackLocalsRegion(const StackFrameContext *STC) { 6532b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek assert(STC); 654c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu StackLocalsSpaceRegion *&R = StackLocalsSpaceRegions[STC]; 655c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu 656c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu if (R) 657c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu return R; 658c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu 659c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu R = A.Allocate<StackLocalsSpaceRegion>(); 660c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu new (R) StackLocalsSpaceRegion(this, STC); 661c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu return R; 6629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} 6639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 66467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst StackArgumentsSpaceRegion * 66567d1287035767f4f6c8ca0c2bb755990012a44caTed KremenekMemRegionManager::getStackArgumentsRegion(const StackFrameContext *STC) { 6662b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek assert(STC); 667c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu StackArgumentsSpaceRegion *&R = StackArgumentsSpaceRegions[STC]; 668c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu 669c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu if (R) 670c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu return R; 671c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu 672c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu R = A.Allocate<StackArgumentsSpaceRegion>(); 673c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu new (R) StackArgumentsSpaceRegion(this, STC); 674c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu return R; 675d05552a21377f493c882298c59e8829040b01d34Ted Kremenek} 676d05552a21377f493c882298c59e8829040b01d34Ted Kremenek 677dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekconst GlobalsSpaceRegion 678eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks*MemRegionManager::getGlobalsRegion(MemRegion::Kind K, 679eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks const CodeTextRegion *CR) { 680eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks if (!CR) { 681eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks if (K == MemRegion::GlobalSystemSpaceRegionKind) 682eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks return LazyAllocate(SystemGlobals); 683eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks if (K == MemRegion::GlobalImmutableSpaceRegionKind) 684eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks return LazyAllocate(ImmutableGlobals); 685eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks assert(K == MemRegion::GlobalInternalSpaceRegionKind); 686eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks return LazyAllocate(InternalGlobals); 687eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks } 688dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 689eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks assert(K == MemRegion::StaticGlobalSpaceRegionKind); 690dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek StaticGlobalSpaceRegion *&R = StaticsGlobalSpaceRegions[CR]; 691dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek if (R) 692dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek return R; 693dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 694dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek R = A.Allocate<StaticGlobalSpaceRegion>(); 695dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek new (R) StaticGlobalSpaceRegion(this, CR); 696dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek return R; 6979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} 6989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 69967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst HeapSpaceRegion *MemRegionManager::getHeapRegion() { 7009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return LazyAllocate(heap); 7019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} 7029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 703b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst MemSpaceRegion *MemRegionManager::getUnknownRegion() { 704178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu return LazyAllocate(unknown); 705178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu} 706178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 707b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst MemSpaceRegion *MemRegionManager::getCodeRegion() { 708ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu return LazyAllocate(code); 709ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu} 710ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 711250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 712250101353b711a409b075f1bc11070dddec7100bTed Kremenek// Constructing regions. 713250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 714dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekconst StringRegion* MemRegionManager::getStringRegion(const StringLiteral* Str){ 71567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return getSubRegion<StringRegion>(Str, getGlobalsRegion()); 716e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu} 717e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 7184c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekconst ObjCStringRegion * 7194c62b557e269a27515dfca1f754ae936c8fdb824Ted KremenekMemRegionManager::getObjCStringRegion(const ObjCStringLiteral* Str){ 7204c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek return getSubRegion<ObjCStringRegion>(Str, getGlobalsRegion()); 7214c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek} 7224c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 7237fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek/// Look through a chain of LocationContexts to either find the 7247fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek/// StackFrameContext that matches a DeclContext, or find a VarRegion 7257fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek/// for a variable captured by a block. 7267fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenekstatic llvm::PointerUnion<const StackFrameContext *, const VarRegion *> 7277fa9b4f258636d89342eda28f21a986c8ac353b1Ted KremenekgetStackOrCaptureRegionForDeclContext(const LocationContext *LC, 7287fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek const DeclContext *DC, 7297fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek const VarDecl *VD) { 7307fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek while (LC) { 7317fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek if (const StackFrameContext *SFC = dyn_cast<StackFrameContext>(LC)) { 7327fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek if (cast<DeclContext>(SFC->getDecl()) == DC) 7337fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek return SFC; 7347fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek } 7357fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek if (const BlockInvocationContext *BC = 7367fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek dyn_cast<BlockInvocationContext>(LC)) { 7377fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek const BlockDataRegion *BR = 7387fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek static_cast<const BlockDataRegion*>(BC->getContextData()); 7397fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek // FIXME: This can be made more efficient. 7407fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek for (BlockDataRegion::referenced_vars_iterator 7417fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek I = BR->referenced_vars_begin(), 7427fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek E = BR->referenced_vars_end(); I != E; ++I) { 7437fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek if (const VarRegion *VR = dyn_cast<VarRegion>(I.getOriginalRegion())) 7447fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek if (VR->getDecl() == VD) 7457fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek return cast<VarRegion>(I.getCapturedRegion()); 7467fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek } 7477fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek } 7487fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek 7497fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek LC = LC->getParent(); 7507fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek } 7517fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek return (const StackFrameContext*)0; 7527fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek} 7537fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek 754b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst VarRegion* MemRegionManager::getVarRegion(const VarDecl *D, 755b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const LocationContext *LC) { 75667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const MemRegion *sReg = 0; 7571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 758eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks if (D->hasGlobalStorage() && !D->isStaticLocal()) { 759eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 760eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks // First handle the globals defined in system headers. 761eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks if (C.getSourceManager().isInSystemHeader(D->getLocation())) { 762eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks // Whitelist the system globals which often DO GET modified, assume the 763eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks // rest are immutable. 764eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks if (D->getName().find("errno") != StringRef::npos) 765eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks sReg = getGlobalsRegion(MemRegion::GlobalSystemSpaceRegionKind); 766eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks else 767eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks sReg = getGlobalsRegion(MemRegion::GlobalImmutableSpaceRegionKind); 768eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 769eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks // Treat other globals as GlobalInternal unless they are constants. 770eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks } else { 771eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks QualType GQT = D->getType(); 772eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks const Type *GT = GQT.getTypePtrOrNull(); 773eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks // TODO: We could walk the complex types here and see if everything is 774eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks // constified. 775eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks if (GT && GQT.isConstQualified() && GT->isArithmeticType()) 776eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks sReg = getGlobalsRegion(MemRegion::GlobalImmutableSpaceRegionKind); 777eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks else 778eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks sReg = getGlobalsRegion(); 779eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks } 780eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 781eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks // Finally handle static locals. 782eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks } else { 78367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek // FIXME: Once we implement scope handling, we will need to properly lookup 78467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek // 'D' to the proper LocationContext. 7852b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek const DeclContext *DC = D->getDeclContext(); 7867fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek llvm::PointerUnion<const StackFrameContext *, const VarRegion *> V = 7877fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek getStackOrCaptureRegionForDeclContext(LC, DC, D); 7887fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek 7897fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek if (V.is<const VarRegion*>()) 7907fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek return V.get<const VarRegion*>(); 7917fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek 7927fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek const StackFrameContext *STC = V.get<const StackFrameContext*>(); 7932b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek 7942b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek if (!STC) 7952b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek sReg = getUnknownRegion(); 7962b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek else { 797dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek if (D->hasLocalStorage()) { 798dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek sReg = isa<ParmVarDecl>(D) || isa<ImplicitParamDecl>(D) 799dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek ? static_cast<const MemRegion*>(getStackArgumentsRegion(STC)) 800dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek : static_cast<const MemRegion*>(getStackLocalsRegion(STC)); 801dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek } 802dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek else { 803dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek assert(D->isStaticLocal()); 8045fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks const Decl *STCD = STC->getDecl(); 8055fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks if (isa<FunctionDecl>(STCD) || isa<ObjCMethodDecl>(STCD)) 806eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks sReg = getGlobalsRegion(MemRegion::StaticGlobalSpaceRegionKind, 8075fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks getFunctionTextRegion(cast<NamedDecl>(STCD))); 8085fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks else if (const BlockDecl *BD = dyn_cast<BlockDecl>(STCD)) { 809eb41640fb417e25eb3218c2662a0dd512cdab04aJordan Rose // FIXME: The fallback type here is totally bogus -- though it should 810eb41640fb417e25eb3218c2662a0dd512cdab04aJordan Rose // never be queried, it will prevent uniquing with the real 811eb41640fb417e25eb3218c2662a0dd512cdab04aJordan Rose // BlockTextRegion. Ideally we'd fix the AST so that we always had a 812eb41640fb417e25eb3218c2662a0dd512cdab04aJordan Rose // signature. 813eb41640fb417e25eb3218c2662a0dd512cdab04aJordan Rose QualType T; 814eb41640fb417e25eb3218c2662a0dd512cdab04aJordan Rose if (const TypeSourceInfo *TSI = BD->getSignatureAsWritten()) 815eb41640fb417e25eb3218c2662a0dd512cdab04aJordan Rose T = TSI->getType(); 816eb41640fb417e25eb3218c2662a0dd512cdab04aJordan Rose else 817eb41640fb417e25eb3218c2662a0dd512cdab04aJordan Rose T = getContext().getFunctionNoProtoType(getContext().VoidTy); 818eb41640fb417e25eb3218c2662a0dd512cdab04aJordan Rose 819dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek const BlockTextRegion *BTR = 820eb41640fb417e25eb3218c2662a0dd512cdab04aJordan Rose getBlockTextRegion(BD, C.getCanonicalType(T), 821eb41640fb417e25eb3218c2662a0dd512cdab04aJordan Rose STC->getAnalysisDeclContext()); 822eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks sReg = getGlobalsRegion(MemRegion::StaticGlobalSpaceRegionKind, 823eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks BTR); 824dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek } 825dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek else { 826dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek sReg = getGlobalsRegion(); 827dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek } 828dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek } 8292b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek } 83067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 831dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 83267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return getSubRegion<VarRegion>(D, sReg); 83367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek} 8341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 83567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst VarRegion *MemRegionManager::getVarRegion(const VarDecl *D, 83667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const MemRegion *superR) { 83767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return getSubRegion<VarRegion>(D, superR); 8389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} 8399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 840b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst BlockDataRegion * 841b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted KremenekMemRegionManager::getBlockDataRegion(const BlockTextRegion *BC, 842b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const LocationContext *LC) { 84367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const MemRegion *sReg = 0; 84499c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek const BlockDecl *BD = BC->getDecl(); 84599c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek if (!BD->hasCaptures()) { 84699c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek // This handles 'static' blocks. 84799c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek sReg = getGlobalsRegion(MemRegion::GlobalImmutableSpaceRegionKind); 84867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 84967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek else { 85099c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek if (LC) { 85199c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek // FIXME: Once we implement scope handling, we want the parent region 85299c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek // to be the scope. 85399c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek const StackFrameContext *STC = LC->getCurrentStackFrame(); 85499c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek assert(STC); 85599c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek sReg = getStackLocalsRegion(STC); 85699c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek } 85799c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek else { 85899c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek // We allow 'LC' to be NULL for cases where want BlockDataRegions 85999c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek // without context-sensitivity. 86099c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek sReg = getUnknownRegion(); 86199c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek } 86267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 86367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 86467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return getSubRegion<BlockDataRegion>(BC, LC, sReg); 8650a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek} 8660a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 86776b5dd48c9dbf2ed3e5830060ea55b81b7d1cca0Pavel Labathconst CXXTempObjectRegion * 86876b5dd48c9dbf2ed3e5830060ea55b81b7d1cca0Pavel LabathMemRegionManager::getCXXStaticTempObjectRegion(const Expr *Ex) { 86976b5dd48c9dbf2ed3e5830060ea55b81b7d1cca0Pavel Labath return getSubRegion<CXXTempObjectRegion>( 87076b5dd48c9dbf2ed3e5830060ea55b81b7d1cca0Pavel Labath Ex, getGlobalsRegion(MemRegion::GlobalInternalSpaceRegionKind, NULL)); 87176b5dd48c9dbf2ed3e5830060ea55b81b7d1cca0Pavel Labath} 87276b5dd48c9dbf2ed3e5830060ea55b81b7d1cca0Pavel Labath 873b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst CompoundLiteralRegion* 8749c378f705405d37f49795d5e915989de774fe11fTed KremenekMemRegionManager::getCompoundLiteralRegion(const CompoundLiteralExpr *CL, 87567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *LC) { 876dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 87767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const MemRegion *sReg = 0; 878dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 87967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek if (CL->isFileScope()) 88067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek sReg = getGlobalsRegion(); 88167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek else { 88267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackFrameContext *STC = LC->getCurrentStackFrame(); 88367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek assert(STC); 88467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek sReg = getStackLocalsRegion(STC); 88567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 886dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 88767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return getSubRegion<CompoundLiteralRegion>(CL, sReg); 888329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek} 889329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 890b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst ElementRegion* 89102282acd7a42d06a3178e3102d34a585bd82dd9fTed KremenekMemRegionManager::getElementRegion(QualType elementType, NonLoc Idx, 892465373946b5ae84f7c3d890cc25cb23fd88dd650Ted Kremenek const MemRegion* superRegion, 8939c378f705405d37f49795d5e915989de774fe11fTed Kremenek ASTContext &Ctx){ 894143b2fc6fd3945c250b333383749010c2c8e3a4cZhongxing Xu 89532f901092daa4a53c7e012408c1f59d73ba29ff5Ted Kremenek QualType T = Ctx.getCanonicalType(elementType).getUnqualifiedType(); 896abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek 897511191ce8920160525611be2be754c32a0724c3eZhongxing Xu llvm::FoldingSetNodeID ID; 898143b2fc6fd3945c250b333383749010c2c8e3a4cZhongxing Xu ElementRegion::ProfileRegion(ID, T, Idx, superRegion); 899511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 9009c378f705405d37f49795d5e915989de774fe11fTed Kremenek void *InsertPos; 901511191ce8920160525611be2be754c32a0724c3eZhongxing Xu MemRegion* data = Regions.FindNodeOrInsertPos(ID, InsertPos); 902511191ce8920160525611be2be754c32a0724c3eZhongxing Xu ElementRegion* R = cast_or_null<ElementRegion>(data); 903511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 904511191ce8920160525611be2be754c32a0724c3eZhongxing Xu if (!R) { 905511191ce8920160525611be2be754c32a0724c3eZhongxing Xu R = (ElementRegion*) A.Allocate<ElementRegion>(); 906143b2fc6fd3945c250b333383749010c2c8e3a4cZhongxing Xu new (R) ElementRegion(T, Idx, superRegion); 907511191ce8920160525611be2be754c32a0724c3eZhongxing Xu Regions.InsertNode(R, InsertPos); 908511191ce8920160525611be2be754c32a0724c3eZhongxing Xu } 909511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 910511191ce8920160525611be2be754c32a0724c3eZhongxing Xu return R; 911511191ce8920160525611be2be754c32a0724c3eZhongxing Xu} 912511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 913b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst FunctionTextRegion * 9145fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna ZaksMemRegionManager::getFunctionTextRegion(const NamedDecl *FD) { 91567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return getSubRegion<FunctionTextRegion>(FD, getCodeRegion()); 916ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu} 917ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 918b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst BlockTextRegion * 91967d1287035767f4f6c8ca0c2bb755990012a44caTed KremenekMemRegionManager::getBlockTextRegion(const BlockDecl *BD, CanQualType locTy, 9201d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContext *AC) { 92167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return getSubRegion<BlockTextRegion>(BD, locTy, AC, getCodeRegion()); 922eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek} 923eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 924eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 925993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// getSymbolicRegion - Retrieve or create a "symbolic" memory region. 926b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst SymbolicRegion *MemRegionManager::getSymbolicRegion(SymbolRef sym) { 92767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return getSubRegion<SymbolicRegion>(sym, getUnknownRegion()); 928993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek} 929993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 930e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaksconst SymbolicRegion *MemRegionManager::getSymbolicHeapRegion(SymbolRef Sym) { 931e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks return getSubRegion<SymbolicRegion>(Sym, getHeapRegion()); 932e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks} 933e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks 934de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekconst FieldRegion* 9359c378f705405d37f49795d5e915989de774fe11fTed KremenekMemRegionManager::getFieldRegion(const FieldDecl *d, 936b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemRegion* superRegion){ 937eeea45611d45238c34474c183cee96d47ae79e24Ted Kremenek return getSubRegion<FieldRegion>(d, superRegion); 9389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} 9399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 940b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst ObjCIvarRegion* 9419c378f705405d37f49795d5e915989de774fe11fTed KremenekMemRegionManager::getObjCIvarRegion(const ObjCIvarDecl *d, 942993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek const MemRegion* superRegion) { 943eeea45611d45238c34474c183cee96d47ae79e24Ted Kremenek return getSubRegion<ObjCIvarRegion>(d, superRegion); 944a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek} 945a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 94602fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xuconst CXXTempObjectRegion* 94702fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing XuMemRegionManager::getCXXTempObjectRegion(Expr const *E, 94802fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu LocationContext const *LC) { 949bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu const StackFrameContext *SFC = LC->getCurrentStackFrame(); 950bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu assert(SFC); 95102fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu return getSubRegion<CXXTempObjectRegion>(E, getStackLocalsRegion(SFC)); 952bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu} 953bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 9544411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose/// Checks whether \p BaseClass is a valid virtual or direct non-virtual base 9554411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose/// class of the type of \p Super. 9564411b423e91da0a2c879b70c0222aeba35f72044Jordan Rosestatic bool isValidBaseClass(const CXXRecordDecl *BaseClass, 9574411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose const TypedValueRegion *Super, 9584411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose bool IsVirtual) { 959ae7396c3891748762d01431e16541b3eb9125c4dJordan Rose BaseClass = BaseClass->getCanonicalDecl(); 960ae7396c3891748762d01431e16541b3eb9125c4dJordan Rose 9614411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose const CXXRecordDecl *Class = Super->getValueType()->getAsCXXRecordDecl(); 9624411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose if (!Class) 9634411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose return true; 9644411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose 9654411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose if (IsVirtual) 9664411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose return Class->isVirtuallyDerivedFrom(BaseClass); 9674411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose 9684411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose for (CXXRecordDecl::base_class_const_iterator I = Class->bases_begin(), 9694411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose E = Class->bases_end(); 9704411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose I != E; ++I) { 9714411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose if (I->getType()->getAsCXXRecordDecl()->getCanonicalDecl() == BaseClass) 9724411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose return true; 9734411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose } 974b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose 9754411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose return false; 9764411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose} 9774411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose 9784411b423e91da0a2c879b70c0222aeba35f72044Jordan Roseconst CXXBaseObjectRegion * 9794411b423e91da0a2c879b70c0222aeba35f72044Jordan RoseMemRegionManager::getCXXBaseObjectRegion(const CXXRecordDecl *RD, 9804411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose const MemRegion *Super, 9814411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose bool IsVirtual) { 9826d35b412fc0289681f320acc389f7a83066ec9e2NAKAMURA Takumi if (isa<TypedValueRegion>(Super)) { 9836d35b412fc0289681f320acc389f7a83066ec9e2NAKAMURA Takumi assert(isValidBaseClass(RD, dyn_cast<TypedValueRegion>(Super), IsVirtual)); 984b6d0f4c8dd162b019681b60d06f7ad33500f4146Aaron Ballman (void)&isValidBaseClass; 9854411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose 9864411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose if (IsVirtual) { 9874411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose // Virtual base regions should not be layered, since the layout rules 9884411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose // are different. 9894411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose while (const CXXBaseObjectRegion *Base = 9904411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose dyn_cast<CXXBaseObjectRegion>(Super)) { 9914411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose Super = Base->getSuperRegion(); 992b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose } 9934411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose assert(Super && !isa<MemSpaceRegion>(Super)); 994b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose } 995b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose } 996b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose 9974411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose return getSubRegion<CXXBaseObjectRegion>(RD, IsVirtual, Super); 9984fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu} 9994fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 1000de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekconst CXXThisRegion* 1001de0d26310191215a6d1d189dc419f87af18ce6beTed KremenekMemRegionManager::getCXXThisRegion(QualType thisPointerTy, 1002de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const LocationContext *LC) { 1003de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const StackFrameContext *STC = LC->getCurrentStackFrame(); 1004de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek assert(STC); 1005de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const PointerType *PT = thisPointerTy->getAs<PointerType>(); 1006de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek assert(PT); 1007de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek return getSubRegion<CXXThisRegion>(PT, getStackArgumentsRegion(STC)); 1008de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek} 1009de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 1010b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst AllocaRegion* 10119c378f705405d37f49795d5e915989de774fe11fTed KremenekMemRegionManager::getAllocaRegion(const Expr *E, unsigned cnt, 101267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *LC) { 101367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackFrameContext *STC = LC->getCurrentStackFrame(); 101467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek assert(STC); 101567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return getSubRegion<AllocaRegion>(E, cnt, getStackLocalsRegion(STC)); 10167090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek} 10177090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek 1018bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenekconst MemSpaceRegion *MemRegion::getMemorySpace() const { 1019bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek const MemRegion *R = this; 1020bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek const SubRegion* SR = dyn_cast<SubRegion>(this); 10211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1022993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek while (SR) { 1023bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek R = SR->getSuperRegion(); 1024bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek SR = dyn_cast<SubRegion>(R); 10259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 10261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1027bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek return dyn_cast<MemSpaceRegion>(R); 10289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} 10291670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek 1030bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenekbool MemRegion::hasStackStorage() const { 103167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return isa<StackSpaceRegion>(getMemorySpace()); 1032bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek} 1033dd198f04897df87c52fef66398035cbf67fdc33dZhongxing Xu 1034de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekbool MemRegion::hasStackNonParametersStorage() const { 1035de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek return isa<StackLocalsSpaceRegion>(getMemorySpace()); 10361508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek} 10371508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek 1038de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekbool MemRegion::hasStackParametersStorage() const { 103967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return isa<StackArgumentsSpaceRegion>(getMemorySpace()); 1040dc147262b1ea0636cf8e7152f19303042dffdbedTed Kremenek} 1041dc147262b1ea0636cf8e7152f19303042dffdbedTed Kremenek 10421508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenekbool MemRegion::hasGlobalsOrParametersStorage() const { 104367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const MemSpaceRegion *MS = getMemorySpace(); 104467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return isa<StackArgumentsSpaceRegion>(MS) || 104567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek isa<GlobalsSpaceRegion>(MS); 10461508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek} 10471670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek 1048adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu// getBaseRegion strips away all elements and fields, and get the base region 1049adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu// of them. 1050adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xuconst MemRegion *MemRegion::getBaseRegion() const { 1051adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu const MemRegion *R = this; 1052adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu while (true) { 105368b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek switch (R->getKind()) { 105468b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek case MemRegion::ElementRegionKind: 105568b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek case MemRegion::FieldRegionKind: 105668b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek case MemRegion::ObjCIvarRegionKind: 1057e17da65c5773e0285b22e33d1431b13fbcd8942cZhongxing Xu case MemRegion::CXXBaseObjectRegionKind: 105868b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek R = cast<SubRegion>(R)->getSuperRegion(); 105968b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek continue; 106068b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek default: 106168b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek break; 1062adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu } 1063adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu break; 1064adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu } 1065adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu return R; 1066adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu} 1067adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu 10685f7c0add1ea1d8e1d2f920d77fd1a7b6160c2d93Anna Zaksbool MemRegion::isSubRegionOf(const MemRegion *R) const { 1069522fc21f3adc647817edc8017e6928a64c96899bAnna Zaks return false; 1070522fc21f3adc647817edc8017e6928a64c96899bAnna Zaks} 1071522fc21f3adc647817edc8017e6928a64c96899bAnna Zaks 10721670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek//===----------------------------------------------------------------------===// 10731670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek// View handling. 10741670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek//===----------------------------------------------------------------------===// 10751670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek 1076b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Roseconst MemRegion *MemRegion::StripCasts(bool StripBaseCasts) const { 10770e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek const MemRegion *R = this; 10780e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek while (true) { 1079c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose switch (R->getKind()) { 1080c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose case ElementRegionKind: { 1081c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose const ElementRegion *ER = cast<ElementRegion>(R); 1082c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose if (!ER->getIndex().isZeroConstant()) 1083c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose return R; 1084c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose R = ER->getSuperRegion(); 1085c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose break; 1086c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose } 1087c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose case CXXBaseObjectRegionKind: 1088b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose if (!StripBaseCasts) 1089b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose return R; 1090c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose R = cast<CXXBaseObjectRegion>(R)->getSuperRegion(); 1091c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose break; 1092c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose default: 1093c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose return R; 10940e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek } 10950e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek } 10960e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek} 109719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 10988ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaksconst SymbolicRegion *MemRegion::getSymbolicBase() const { 10998ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks const SubRegion *SubR = dyn_cast<SubRegion>(this); 11008ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks 11018ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks while (SubR) { 11028ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks if (const SymbolicRegion *SymR = dyn_cast<SymbolicRegion>(SubR)) 11038ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks return SymR; 11048ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks SubR = dyn_cast<SubRegion>(SubR->getSuperRegion()); 11058ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks } 11068ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks return 0; 11078ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks} 11088ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks 110919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// FIXME: Merge with the implementation of the same method in Store.cpp 111019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenekstatic bool IsCompleteType(ASTContext &Ctx, QualType Ty) { 111119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek if (const RecordType *RT = Ty->getAs<RecordType>()) { 111219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek const RecordDecl *D = RT->getDecl(); 1113952b017601f9c82b51119c3a1600f1312a833db9Douglas Gregor if (!D->getDefinition()) 111419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek return false; 111519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek } 111619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 111719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek return true; 111819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek} 111919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 11207caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing XuRegionRawOffset ElementRegion::getAsArrayOffset() const { 1121199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck CharUnits offset = CharUnits::Zero(); 112219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek const ElementRegion *ER = this; 112319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek const MemRegion *superR = NULL; 112419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek ASTContext &C = getContext(); 11251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 112619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek // FIXME: Handle multi-dimensional arrays. 112719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 112819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek while (ER) { 112919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek superR = ER->getSuperRegion(); 11301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 113119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek // FIXME: generalize to symbolic offsets. 113219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek SVal index = ER->getIndex(); 1133dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie if (Optional<nonloc::ConcreteInt> CI = index.getAs<nonloc::ConcreteInt>()) { 113419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek // Update the offset. 113519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek int64_t i = CI->getValue().getSExtValue(); 11361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 113719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek if (i != 0) { 113819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek QualType elemType = ER->getElementType(); 11391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 114019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek // If we are pointing to an incomplete type, go no further. 114119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek if (!IsCompleteType(C, elemType)) { 114219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek superR = ER; 114319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek break; 114419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek } 11451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1146199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck CharUnits size = C.getTypeSizeInChars(elemType); 114719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek offset += (i * size); 114819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek } 114919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 115019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek // Go to the next ElementRegion (if any). 115119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek ER = dyn_cast<ElementRegion>(superR); 115219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek continue; 115319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek } 11541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 115519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek return NULL; 115619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek } 11571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 115819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek assert(superR && "super region cannot be NULL"); 11599ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck return RegionRawOffset(superR, offset); 116019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek} 116119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 11626dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose 11636dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose/// Returns true if \p Base is an immediate base class of \p Child 11646dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rosestatic bool isImmediateBase(const CXXRecordDecl *Child, 11656dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose const CXXRecordDecl *Base) { 11666dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose // Note that we do NOT canonicalize the base class here, because 11676dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose // ASTRecordLayout doesn't either. If that leads us down the wrong path, 11686dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose // so be it; at least we won't crash. 11696dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose for (CXXRecordDecl::base_class_const_iterator I = Child->bases_begin(), 11706dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose E = Child->bases_end(); 11716dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose I != E; ++I) { 11726dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose if (I->getType()->getAsCXXRecordDecl() == Base) 11736dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose return true; 11746dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose } 11756dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose 11766dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose return false; 11776dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose} 11786dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose 1179e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing XuRegionOffset MemRegion::getAsOffset() const { 1180e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu const MemRegion *R = this; 1181824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose const MemRegion *SymbolicOffsetBase = 0; 1182e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu int64_t Offset = 0; 1183e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu 1184e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu while (1) { 1185e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu switch (R->getKind()) { 11869d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose case GenericMemSpaceRegionKind: 11879d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose case StackLocalsSpaceRegionKind: 11889d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose case StackArgumentsSpaceRegionKind: 11899d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose case HeapSpaceRegionKind: 11909d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose case UnknownSpaceRegionKind: 11919d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose case StaticGlobalSpaceRegionKind: 11929d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose case GlobalInternalSpaceRegionKind: 11939d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose case GlobalSystemSpaceRegionKind: 11949d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose case GlobalImmutableSpaceRegionKind: 11959d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose // Stores can bind directly to a region space to set a default value. 11969d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose assert(Offset == 0 && !SymbolicOffsetBase); 11979d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose goto Finish; 11989d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose 11999d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose case FunctionTextRegionKind: 12009d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose case BlockTextRegionKind: 12019d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose case BlockDataRegionKind: 12029d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose // These will never have bindings, but may end up having values requested 12039d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose // if the user does some strange casting. 12049d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose if (Offset != 0) 12059d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose SymbolicOffsetBase = R; 12069d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose goto Finish; 1207824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose 1208e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu case SymbolicRegionKind: 1209e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu case AllocaRegionKind: 1210e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu case CompoundLiteralRegionKind: 1211e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu case CXXThisRegionKind: 1212e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu case StringRegionKind: 12139d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose case ObjCStringRegionKind: 1214e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu case VarRegionKind: 121502fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu case CXXTempObjectRegionKind: 12169d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose // Usual base regions. 1217e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu goto Finish; 1218824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose 12191e934431adba0f459668a59c6059b9596fd627b4Jordan Rose case ObjCIvarRegionKind: 12201e934431adba0f459668a59c6059b9596fd627b4Jordan Rose // This is a little strange, but it's a compromise between 12211e934431adba0f459668a59c6059b9596fd627b4Jordan Rose // ObjCIvarRegions having unknown compile-time offsets (when using the 12221e934431adba0f459668a59c6059b9596fd627b4Jordan Rose // non-fragile runtime) and yet still being distinct, non-overlapping 12231e934431adba0f459668a59c6059b9596fd627b4Jordan Rose // regions. Thus we treat them as "like" base regions for the purposes 12241e934431adba0f459668a59c6059b9596fd627b4Jordan Rose // of computing offsets. 12251e934431adba0f459668a59c6059b9596fd627b4Jordan Rose goto Finish; 12261e934431adba0f459668a59c6059b9596fd627b4Jordan Rose 1227e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose case CXXBaseObjectRegionKind: { 1228e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose const CXXBaseObjectRegion *BOR = cast<CXXBaseObjectRegion>(R); 1229e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose R = BOR->getSuperRegion(); 1230e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose 1231e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose QualType Ty; 12326dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose bool RootIsSymbolic = false; 1233e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose if (const TypedValueRegion *TVR = dyn_cast<TypedValueRegion>(R)) { 1234e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose Ty = TVR->getDesugaredValueType(getContext()); 1235e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose } else if (const SymbolicRegion *SR = dyn_cast<SymbolicRegion>(R)) { 1236e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose // If our base region is symbolic, we don't know what type it really is. 1237e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose // Pretend the type of the symbol is the true dynamic type. 1238e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose // (This will at least be self-consistent for the life of the symbol.) 1239732cdf383f9030ff2b9fb28dfbdae2285ded80c6Ted Kremenek Ty = SR->getSymbol()->getType()->getPointeeType(); 12406dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose RootIsSymbolic = true; 1241e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose } 1242e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose 1243e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose const CXXRecordDecl *Child = Ty->getAsCXXRecordDecl(); 12449f6441ad92c30028032eb3df6f4a7f2ebe393a68Jordan Rose if (!Child) { 1245e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose // We cannot compute the offset of the base class. 1246824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose SymbolicOffsetBase = R; 1247e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose } 1248824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose 12496dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose if (RootIsSymbolic) { 12506dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose // Base layers on symbolic regions may not be type-correct. 12516dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose // Double-check the inheritance here, and revert to a symbolic offset 12526dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose // if it's invalid (e.g. due to a reinterpret_cast). 12536dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose if (BOR->isVirtual()) { 12546dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose if (!Child->isVirtuallyDerivedFrom(BOR->getDecl())) 12556dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose SymbolicOffsetBase = R; 12566dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose } else { 12576dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose if (!isImmediateBase(Child, BOR->getDecl())) 12586dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose SymbolicOffsetBase = R; 12596dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose } 12606dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose } 12616dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose 1262824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose // Don't bother calculating precise offsets if we already have a 1263824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose // symbolic offset somewhere in the chain. 1264824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose if (SymbolicOffsetBase) 1265824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose continue; 1266824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose 1267e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose CharUnits BaseOffset; 12684411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose const ASTRecordLayout &Layout = getContext().getASTRecordLayout(Child); 12694411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose if (BOR->isVirtual()) 12704411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose BaseOffset = Layout.getVBaseClassOffset(BOR->getDecl()); 1271e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose else 12724411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose BaseOffset = Layout.getBaseClassOffset(BOR->getDecl()); 1273e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose 1274e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose // The base offset is in chars, not in bits. 1275e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose Offset += BaseOffset.getQuantity() * getContext().getCharWidth(); 1276e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose break; 1277e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose } 1278e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu case ElementRegionKind: { 1279e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu const ElementRegion *ER = cast<ElementRegion>(R); 1280824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose R = ER->getSuperRegion(); 1281e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu 1282824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose QualType EleTy = ER->getValueType(); 1283824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose if (!IsCompleteType(getContext(), EleTy)) { 1284824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose // We cannot compute the offset of the base class. 1285824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose SymbolicOffsetBase = R; 1286824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose continue; 1287824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose } 1288e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu 1289e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu SVal Index = ER->getIndex(); 1290dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie if (Optional<nonloc::ConcreteInt> CI = 12915251abea41b446c26e3239c8dd6c7edea6fc335dDavid Blaikie Index.getAs<nonloc::ConcreteInt>()) { 1292824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose // Don't bother calculating precise offsets if we already have a 1293824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose // symbolic offset somewhere in the chain. 1294824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose if (SymbolicOffsetBase) 1295824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose continue; 1296824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose 1297e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu int64_t i = CI->getValue().getSExtValue(); 1298e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose // This type size is in bits. 1299e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose Offset += i * getContext().getTypeSize(EleTy); 1300e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu } else { 1301e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu // We cannot compute offset for non-concrete index. 1302824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose SymbolicOffsetBase = R; 1303e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu } 13047caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu break; 1305e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu } 1306e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu case FieldRegionKind: { 1307e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu const FieldRegion *FR = cast<FieldRegion>(R); 1308824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose R = FR->getSuperRegion(); 1309824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose 1310e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu const RecordDecl *RD = FR->getDecl()->getParent(); 1311786e6204e55cc01094a3e86104c82932a65fb2caJordan Rose if (RD->isUnion() || !RD->isCompleteDefinition()) { 1312e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu // We cannot compute offset for incomplete type. 1313786e6204e55cc01094a3e86104c82932a65fb2caJordan Rose // For unions, we could treat everything as offset 0, but we'd rather 1314786e6204e55cc01094a3e86104c82932a65fb2caJordan Rose // treat each field as a symbolic offset so they aren't stored on top 1315786e6204e55cc01094a3e86104c82932a65fb2caJordan Rose // of each other, since we depend on things in typed regions actually 1316786e6204e55cc01094a3e86104c82932a65fb2caJordan Rose // matching their types. 1317824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose SymbolicOffsetBase = R; 1318824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose } 1319824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose 1320824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose // Don't bother calculating precise offsets if we already have a 1321824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose // symbolic offset somewhere in the chain. 1322824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose if (SymbolicOffsetBase) 1323824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose continue; 1324824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose 1325e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu // Get the field number. 1326e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu unsigned idx = 0; 1327e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu for (RecordDecl::field_iterator FI = RD->field_begin(), 1328e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu FE = RD->field_end(); FI != FE; ++FI, ++idx) 1329581deb3da481053c4993c7600f97acf7768caac5David Blaikie if (FR->getDecl() == *FI) 1330e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu break; 13317caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 1332e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu const ASTRecordLayout &Layout = getContext().getASTRecordLayout(RD); 1333e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu // This is offset in bits. 1334e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu Offset += Layout.getFieldOffset(idx); 1335e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu break; 1336e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu } 1337e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu } 1338e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu } 13397caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 1340e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu Finish: 1341824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose if (SymbolicOffsetBase) 1342824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose return RegionOffset(SymbolicOffsetBase, RegionOffset::Symbolic); 1343e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu return RegionOffset(R, Offset); 13447caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu} 13457caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 13464240096011a187807058f887eb81df750ffa17feTed Kremenek//===----------------------------------------------------------------------===// 13474240096011a187807058f887eb81df750ffa17feTed Kremenek// BlockDataRegion 13484240096011a187807058f887eb81df750ffa17feTed Kremenek//===----------------------------------------------------------------------===// 13494240096011a187807058f887eb81df750ffa17feTed Kremenek 135024570c4c258545f8310e4bc96503a5668982cf67Ted Kremenekstd::pair<const VarRegion *, const VarRegion *> 135124570c4c258545f8310e4bc96503a5668982cf67Ted KremenekBlockDataRegion::getCaptureRegions(const VarDecl *VD) { 135224570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek MemRegionManager &MemMgr = *getMemRegionManager(); 135324570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek const VarRegion *VR = 0; 135424570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek const VarRegion *OriginalVR = 0; 135524570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek 135624570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek if (!VD->getAttr<BlocksAttr>() && VD->hasLocalStorage()) { 135724570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek VR = MemMgr.getVarRegion(VD, this); 135824570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek OriginalVR = MemMgr.getVarRegion(VD, LC); 135924570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek } 136024570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek else { 136124570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek if (LC) { 136224570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek VR = MemMgr.getVarRegion(VD, LC); 136324570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek OriginalVR = VR; 136424570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek } 136524570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek else { 136624570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek VR = MemMgr.getVarRegion(VD, MemMgr.getUnknownRegion()); 136724570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek OriginalVR = MemMgr.getVarRegion(VD, LC); 136824570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek } 136924570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek } 137024570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek return std::make_pair(VR, OriginalVR); 137124570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek} 137224570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek 13734240096011a187807058f887eb81df750ffa17feTed Kremenekvoid BlockDataRegion::LazyInitializeReferencedVars() { 13744240096011a187807058f887eb81df750ffa17feTed Kremenek if (ReferencedVars) 13754240096011a187807058f887eb81df750ffa17feTed Kremenek return; 13764240096011a187807058f887eb81df750ffa17feTed Kremenek 13771d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContext *AC = getCodeRegion()->getAnalysisDeclContext(); 13781d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContext::referenced_decls_iterator I, E; 13794240096011a187807058f887eb81df750ffa17feTed Kremenek llvm::tie(I, E) = AC->getReferencedBlockVars(BC->getDecl()); 1380dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 13814240096011a187807058f887eb81df750ffa17feTed Kremenek if (I == E) { 13824240096011a187807058f887eb81df750ffa17feTed Kremenek ReferencedVars = (void*) 0x1; 13834240096011a187807058f887eb81df750ffa17feTed Kremenek return; 13844240096011a187807058f887eb81df750ffa17feTed Kremenek } 1385dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 13864240096011a187807058f887eb81df750ffa17feTed Kremenek MemRegionManager &MemMgr = *getMemRegionManager(); 13874240096011a187807058f887eb81df750ffa17feTed Kremenek llvm::BumpPtrAllocator &A = MemMgr.getAllocator(); 13884240096011a187807058f887eb81df750ffa17feTed Kremenek BumpVectorContext BC(A); 1389dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 13904240096011a187807058f887eb81df750ffa17feTed Kremenek typedef BumpVector<const MemRegion*> VarVec; 13914240096011a187807058f887eb81df750ffa17feTed Kremenek VarVec *BV = (VarVec*) A.Allocate<VarVec>(); 139202b1df62ff6fa9526619ee0db78e2af4186e490dTed Kremenek new (BV) VarVec(BC, E - I); 139385d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek VarVec *BVOriginal = (VarVec*) A.Allocate<VarVec>(); 139485d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek new (BVOriginal) VarVec(BC, E - I); 1395dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 139667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek for ( ; I != E; ++I) { 139767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const VarRegion *VR = 0; 139885d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek const VarRegion *OriginalVR = 0; 139924570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek llvm::tie(VR, OriginalVR) = getCaptureRegions(*I); 140067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek assert(VR); 140185d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek assert(OriginalVR); 140267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BV->push_back(VR, BC); 140385d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek BVOriginal->push_back(OriginalVR, BC); 140467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 1405dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 14064240096011a187807058f887eb81df750ffa17feTed Kremenek ReferencedVars = BV; 140785d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek OriginalVars = BVOriginal; 14084240096011a187807058f887eb81df750ffa17feTed Kremenek} 14094240096011a187807058f887eb81df750ffa17feTed Kremenek 14104240096011a187807058f887eb81df750ffa17feTed KremenekBlockDataRegion::referenced_vars_iterator 14114240096011a187807058f887eb81df750ffa17feTed KremenekBlockDataRegion::referenced_vars_begin() const { 14124240096011a187807058f887eb81df750ffa17feTed Kremenek const_cast<BlockDataRegion*>(this)->LazyInitializeReferencedVars(); 14134240096011a187807058f887eb81df750ffa17feTed Kremenek 14144240096011a187807058f887eb81df750ffa17feTed Kremenek BumpVector<const MemRegion*> *Vec = 14154240096011a187807058f887eb81df750ffa17feTed Kremenek static_cast<BumpVector<const MemRegion*>*>(ReferencedVars); 1416dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 141785d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek if (Vec == (void*) 0x1) 141885d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek return BlockDataRegion::referenced_vars_iterator(0, 0); 141985d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek 142085d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek BumpVector<const MemRegion*> *VecOriginal = 142185d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek static_cast<BumpVector<const MemRegion*>*>(OriginalVars); 142285d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek 142385d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek return BlockDataRegion::referenced_vars_iterator(Vec->begin(), 142485d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek VecOriginal->begin()); 14254240096011a187807058f887eb81df750ffa17feTed Kremenek} 14264240096011a187807058f887eb81df750ffa17feTed Kremenek 14274240096011a187807058f887eb81df750ffa17feTed KremenekBlockDataRegion::referenced_vars_iterator 14284240096011a187807058f887eb81df750ffa17feTed KremenekBlockDataRegion::referenced_vars_end() const { 14294240096011a187807058f887eb81df750ffa17feTed Kremenek const_cast<BlockDataRegion*>(this)->LazyInitializeReferencedVars(); 14304240096011a187807058f887eb81df750ffa17feTed Kremenek 14314240096011a187807058f887eb81df750ffa17feTed Kremenek BumpVector<const MemRegion*> *Vec = 14324240096011a187807058f887eb81df750ffa17feTed Kremenek static_cast<BumpVector<const MemRegion*>*>(ReferencedVars); 1433dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 143485d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek if (Vec == (void*) 0x1) 143585d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek return BlockDataRegion::referenced_vars_iterator(0, 0); 143685d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek 143785d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek BumpVector<const MemRegion*> *VecOriginal = 143885d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek static_cast<BumpVector<const MemRegion*>*>(OriginalVars); 143985d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek 144085d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek return BlockDataRegion::referenced_vars_iterator(Vec->end(), 144185d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek VecOriginal->end()); 14424240096011a187807058f887eb81df750ffa17feTed Kremenek} 14435846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek 14445846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenekconst VarRegion *BlockDataRegion::getOriginalRegion(const VarRegion *R) const { 14455846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek for (referenced_vars_iterator I = referenced_vars_begin(), 14465846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek E = referenced_vars_end(); 14475846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek I != E; ++I) { 14485846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek if (I.getCapturedRegion() == R) 14495846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek return I.getOriginalRegion(); 14505846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek } 14515846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek return 0; 14525846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek} 1453