]> granicus.if.org Git - clang/commitdiff
[analyzer] Account for the "interesting values" hash table resizing.
authorJordan Rose <jordan_rose@apple.com>
Wed, 20 Feb 2013 00:27:26 +0000 (00:27 +0000)
committerJordan Rose <jordan_rose@apple.com>
Wed, 20 Feb 2013 00:27:26 +0000 (00:27 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@175582 91177308-0d34-0410-b5e6-96231b3b80d8

lib/StaticAnalyzer/Core/RegionStore.cpp

index f75ab0280ba5d5d3e690cca29ab435a4fa85a7d0..4d9a313a02bceafe4ba5bc0f015cc1181a486f4b 100644 (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,