diff options
-rw-r--r-- | lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp | 2 | ||||
-rw-r--r-- | test/Analysis/malloc.c | 17 |
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. |