diff options
author | Zhongxing Xu <xuzhongxing@gmail.com> | 2011-01-13 12:30:12 +0000 |
---|---|---|
committer | Zhongxing Xu <xuzhongxing@gmail.com> | 2011-01-13 12:30:12 +0000 |
commit | d074441e027471a914cbb909a7aad1d43224950f (patch) | |
tree | 00b080ed9a0662effebaaa7d09294534403900cf /lib/StaticAnalyzer/RegionStore.cpp | |
parent | bda1efd0daf6fca9f515c6ce38d1ed71a3cca5b7 (diff) |
Support inlining base initializers. We still haven't got it completely right,
since the bindings are purged after they are set up. Need to investigate
RemoveDeadBindings algorithm.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@123374 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/StaticAnalyzer/RegionStore.cpp')
-rw-r--r-- | lib/StaticAnalyzer/RegionStore.cpp | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/lib/StaticAnalyzer/RegionStore.cpp b/lib/StaticAnalyzer/RegionStore.cpp index e47a77e6fc..58cec30313 100644 --- a/lib/StaticAnalyzer/RegionStore.cpp +++ b/lib/StaticAnalyzer/RegionStore.cpp @@ -822,7 +822,8 @@ SVal RegionStoreManager::evalDerivedToBase(SVal derived, QualType baseType) { return derived; const MemRegion *baseReg = - MRMgr.getCXXBaseObjectRegion(baseDecl, derivedRegVal->getRegion()); + MRMgr.getCXXBaseObjectRegion(baseDecl, derivedRegVal->getRegion()); + return loc::MemRegionVal(baseReg); } //===----------------------------------------------------------------------===// @@ -1105,6 +1106,17 @@ RegionStoreManager::GetLazyBinding(RegionBindings B, const MemRegion *R) { return std::make_pair(X.first, MRMgr.getFieldRegionWithSuper(FR, X.second)); } + // C++ base object region is another kind of region that we should blast + // through to look for lazy compound value. It is like a field region. + else if (const CXXBaseObjectRegion *baseReg = + dyn_cast<CXXBaseObjectRegion>(R)) { + const std::pair<Store, const MemRegion *> &X = + GetLazyBinding(B, baseReg->getSuperRegion()); + + if (X.second) + return std::make_pair(X.first, + MRMgr.getCXXBaseObjectRegionWithSuper(baseReg, X.second)); + } // The NULL MemRegion indicates an non-existent lazy binding. A NULL Store is // possible for a valid lazy binding. return std::make_pair((Store) 0, (const MemRegion *) 0); @@ -1572,7 +1584,6 @@ Store RegionStoreManager::BindStruct(Store store, const TypedRegion* R, Store RegionStoreManager::KillStruct(Store store, const TypedRegion* R, SVal DefaultVal) { - BindingKey key = BindingKey::Make(R, BindingKey::Default); // The BindingKey may be "invalid" if we cannot handle the region binding @@ -1582,7 +1593,7 @@ Store RegionStoreManager::KillStruct(Store store, const TypedRegion* R, // the case of nested symbolic indices, we need to march up the region // hierarchy untile we reach a region whose binding we can reason about. const SubRegion *subReg = R; - + while (!key.isValid()) { if (const SubRegion *tmp = dyn_cast<SubRegion>(subReg->getSuperRegion())) { subReg = tmp; |