aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp2
-rw-r--r--test/Analysis/malloc.c17
2 files changed, 18 insertions, 1 deletions
diff --git a/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp b/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp
index 9cbbece98e..ad58a07c78 100644
--- a/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp
+++ b/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp
@@ -701,7 +701,7 @@ SVal SimpleSValBuilder::evalBinOpLL(ProgramStateRef state,
// on each invocation.
if (LeftBase != RightBase &&
((!isa<SymbolicRegion>(LeftBase) && !isa<SymbolicRegion>(RightBase)) ||
- isa<HeapSpaceRegion>(LeftMS)) ){
+ (isa<HeapSpaceRegion>(LeftMS) || isa<HeapSpaceRegion>(RightMS))) ){
switch (op) {
default:
return UnknownVal();
diff --git a/test/Analysis/malloc.c b/test/Analysis/malloc.c
index bdbd96e2be..7be29301fe 100644
--- a/test/Analysis/malloc.c
+++ b/test/Analysis/malloc.c
@@ -902,6 +902,23 @@ int HeapAssignment() {
return 0;
}
+int *retPtr();
+int *retPtrMightAlias(int *x);
+int cmpHeapAllocationToUnknown() {
+ int zero = 0;
+ int *yBefore = retPtr();
+ int *m = malloc(8);
+ int *yAfter = retPtrMightAlias(m);
+ if (yBefore == m) {
+ return 5/zero; // expected-warning {{This statement is never executed}}
+ }
+ if (yAfter == m) {
+ return 5/zero; // expected-warning {{This statement is never executed}}
+ }
+ free(m);
+ return 0;
+}
+
// ----------------------------------------------------------------------------
// False negatives.