diff options
author | Anna Zaks <ganna@apple.com> | 2013-03-25 20:43:24 +0000 |
---|---|---|
committer | Anna Zaks <ganna@apple.com> | 2013-03-25 20:43:24 +0000 |
commit | f60f2fb14230f0f03dea217682df81e028a1264c (patch) | |
tree | e75e9220b03e5699c4fb94f4c1aca446d69df7d8 /clang/lib/StaticAnalyzer/Core/RegionStore.cpp | |
parent | 2d752fc2f9ee6a932bc052fa4ce12452221eaa1f (diff) | |
download | bcm5719-llvm-f60f2fb14230f0f03dea217682df81e028a1264c.tar.gz bcm5719-llvm-f60f2fb14230f0f03dea217682df81e028a1264c.zip |
[analyzer] Set concrete offset bindings to UnknownVal when processing symbolic offset binding, even if no bindings are present.
This addresses an undefined value false positive from concreteOffsetBindingIsInvalidatedBySymbolicOffsetAssignment.
Fixes PR14877; radar://12991168.
llvm-svn: 177905
Diffstat (limited to 'clang/lib/StaticAnalyzer/Core/RegionStore.cpp')
-rw-r--r-- | clang/lib/StaticAnalyzer/Core/RegionStore.cpp | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/RegionStore.cpp b/clang/lib/StaticAnalyzer/Core/RegionStore.cpp index 58d94304ba7..ae2752d00a7 100644 --- a/clang/lib/StaticAnalyzer/Core/RegionStore.cpp +++ b/clang/lib/StaticAnalyzer/Core/RegionStore.cpp @@ -833,14 +833,22 @@ RegionStoreManager::removeSubRegionBindings(RegionBindingsConstRef B, const SubRegion *Top) { BindingKey TopKey = BindingKey::Make(Top, BindingKey::Default); const MemRegion *ClusterHead = TopKey.getBaseRegion(); + const ClusterBindings *Cluster = B.lookup(ClusterHead); + if (Top == ClusterHead) { // We can remove an entire cluster's bindings all in one go. return B.remove(Top); } - const ClusterBindings *Cluster = B.lookup(ClusterHead); - if (!Cluster) + if (!Cluster) { + // If we're invalidating a region with a symbolic offset, we need to make + // sure we don't treat the base region as uninitialized anymore. + if (TopKey.hasSymbolicOffset()) { + const SubRegion *Concrete = TopKey.getConcreteOffsetRegion(); + return B.addBinding(Concrete, BindingKey::Default, UnknownVal()); + } return B; + } SmallVector<BindingPair, 32> Bindings; collectSubRegionBindings(Bindings, svalBuilder, *Cluster, Top, TopKey, |