[analyzer] Account for the "interesting values" hash table resizing.

RegionStoreManager::getInterestingValues() returns a pointer to a
std::vector that lives inside a DenseMap, which is constructed on demand.
However, constructing one such value can lead to constructing another
value, which will invalidate the reference created earlier.

Fixed by delaying the new entry creation until the function returns.

llvm-svn: 175582
This commit is contained in:
Jordan Rose 2013-02-20 00:27:26 +00:00
parent 8bc7af1a93
commit 7bfb415387
1 changed files with 3 additions and 3 deletions
clang/lib/StaticAnalyzer/Core

View File

@ -1629,7 +1629,7 @@ RegionStoreManager::getInterestingValues(nonloc::LazyCompoundVal LCV) {
return I->second;
// If we don't have a list of values cached, start constructing it.
SValListTy &List = LazyBindingsMap[LCV.getCVData()];
SValListTy List;
const SubRegion *LazyR = LCV.getRegion();
RegionBindingsRef B = getRegionBindings(LCV.getStore());
@ -1638,7 +1638,7 @@ RegionStoreManager::getInterestingValues(nonloc::LazyCompoundVal LCV) {
// values to return.
const ClusterBindings *Cluster = B.lookup(LazyR->getBaseRegion());
if (!Cluster)
return List;
return (LazyBindingsMap[LCV.getCVData()] = llvm_move(List));
SmallVector<BindingKey, 32> Keys;
collectSubRegionKeys(Keys, svalBuilder, *Cluster, LazyR,
@ -1661,7 +1661,7 @@ RegionStoreManager::getInterestingValues(nonloc::LazyCompoundVal LCV) {
List.push_back(V);
}
return List;
return (LazyBindingsMap[LCV.getCVData()] = llvm_move(List));
}
NonLoc RegionStoreManager::createLazyBinding(RegionBindingsConstRef B,