aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZhongxing Xu <xuzhongxing@gmail.com>2010-05-29 06:23:24 +0000
committerZhongxing Xu <xuzhongxing@gmail.com>2010-05-29 06:23:24 +0000
commitbdfa85fd5351d24bc42ce21a97d2fb8486df22b1 (patch)
tree424f3cf03a288c887f625d16abf4199b3108bf0a
parent616d4362f01a8f819f9351372c3c4368777d4480 (diff)
Fix PR7218. Patch by Jordy Rose.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@105097 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Checker/RegionStore.cpp20
-rw-r--r--test/Analysis/PR7218.c6
2 files changed, 23 insertions, 3 deletions
diff --git a/lib/Checker/RegionStore.cpp b/lib/Checker/RegionStore.cpp
index c4072fd803..c25d2095b1 100644
--- a/lib/Checker/RegionStore.cpp
+++ b/lib/Checker/RegionStore.cpp
@@ -213,6 +213,11 @@ public:
RegionStoreSubRegionMap *getRegionStoreSubRegionMap(Store store);
+ /// canHaveDirectBinding - Disallow direct bindings for certain types,
+ /// like arrays. This lets us distinguish between x and x[0], which was
+ /// causing PR7218 "Assigning to buf[0] makes buf[1] valid".
+ bool canHaveDirectBinding (const MemRegion *R);
+
Optional<SVal> getBinding(RegionBindings B, const MemRegion *R);
Optional<SVal> getDirectBinding(RegionBindings B, const MemRegion *R);
/// getDefaultBinding - Returns an SVal* representing an optional default
@@ -944,11 +949,20 @@ SVal RegionStoreManager::EvalBinOp(BinaryOperator::Opcode Op, Loc L, NonLoc R,
//===----------------------------------------------------------------------===//
// Loading values from regions.
//===----------------------------------------------------------------------===//
+bool RegionStoreManager::canHaveDirectBinding (const MemRegion *R) {
+ // Arrays can't have direct binding -- must bind to elements
+ if (const TypedRegion *TR = dyn_cast<TypedRegion>(R))
+ if (TR->getValueType(getContext())->isArrayType())
+ return false;
+
+ return true;
+}
Optional<SVal> RegionStoreManager::getDirectBinding(RegionBindings B,
- const MemRegion *R) {
- if (const SVal *V = Lookup(B, R, BindingKey::Direct))
- return *V;
+ const MemRegion *R) {
+ if (canHaveDirectBinding(R))
+ if (const SVal *V = Lookup(B, R, BindingKey::Direct))
+ return *V;
return Optional<SVal>();
}
diff --git a/test/Analysis/PR7218.c b/test/Analysis/PR7218.c
new file mode 100644
index 0000000000..635e56f053
--- /dev/null
+++ b/test/Analysis/PR7218.c
@@ -0,0 +1,6 @@
+// RUN: %clang_cc1 -analyze -analyzer-check-objc-mem -analyzer-store region -verify %s
+char PR7218(char a) {
+ char buf[2];
+ buf[0] = a;
+ return buf[1]; // expected-warning {{Undefined or garbage value returned to caller}}
+}