From: Ted Kremenek Date: Wed, 5 Aug 2009 05:31:02 +0000 (+0000) Subject: Fix a bug in RegionStoreSubRegionManager::add() where multiple subregions wouldn... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4ed459851eef142f2059af7ae487484e8a14fc67;p=clang Fix a bug in RegionStoreSubRegionManager::add() where multiple subregions wouldn't correctly get registered in the SubRegion map. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@78162 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/RegionStore.cpp b/lib/Analysis/RegionStore.cpp index c47aaa20e0..70201759e1 100644 --- a/lib/Analysis/RegionStore.cpp +++ b/lib/Analysis/RegionStore.cpp @@ -121,8 +121,10 @@ class VISIBILITY_HIDDEN RegionStoreSubRegionMap : public SubRegionMap { public: void add(const MemRegion* Parent, const MemRegion* SubRegion) { Map::iterator I = M.find(Parent); - M.insert(std::make_pair(Parent, - F.Add(I == M.end() ? F.GetEmptySet() : I->second, SubRegion))); + if (I == M.end()) + M.insert(std::make_pair(Parent, F.Add(F.GetEmptySet(), SubRegion))); + else + I->second = F.Add(I->second, SubRegion); } ~RegionStoreSubRegionMap() {} diff --git a/test/Analysis/misc-ps.m b/test/Analysis/misc-ps.m index 9f48db55d1..1ca209dbf8 100644 --- a/test/Analysis/misc-ps.m +++ b/test/Analysis/misc-ps.m @@ -522,3 +522,14 @@ void test_pass_val() { test_pass_val_aux(s); } +// This is a reduced test case of a false positive that previously appeared +// in RegionStoreManager. Previously the array access resulted in dereferencing +// an undefined value. +int test_array_compound(int *q, int *r, int *z) { + int *array[] = { q, r, z }; + int j = 0; + for (unsigned i = 0; i < 3 ; ++i) + if (*array[i]) ++j; // no-warning + return j; +} +