[analyzer] If realloc fails on an escaped region, that region doesn't leak.
authorJordan Rose <jordan_rose@apple.com>
Thu, 15 Aug 2013 17:22:06 +0000 (17:22 +0000)
committerJordan Rose <jordan_rose@apple.com>
Thu, 15 Aug 2013 17:22:06 +0000 (17:22 +0000)
When a region is realloc()ed, MallocChecker records whether it was known
to be allocated or not. If it is, and the reallocation fails, the original
region has to be freed. Previously, when an allocated region escaped,
MallocChecker completely stopped tracking it, so a failed reallocation
still (correctly) wouldn't require freeing the original region. Recently,
however, MallocChecker started tracking escaped symbols, so that if it were
freed we could check that the deallocator matched the allocator. This
broke the reallocation model for whether or not a symbol was allocated.

Now, MallocChecker will actually check if a symbol is owned, and only
require freeing after a failed reallocation if it was owned before.

PR16730

llvm-svn: 188468

clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp
clang/test/Analysis/malloc.c

index c357a66ea2ca1611f4659e1ba3edbe49f6132c03..2d55adcc363a4c6d4163b04ba9c500cb9416e15d 100644 (file)
@@ -1060,7 +1060,7 @@ ProgramStateRef MallocChecker::FreeMemAux(CheckerContext &C,
     }
   }
 
-  ReleasedAllocated = (RsBase != 0);
+  ReleasedAllocated = (RsBase != 0) && RsBase->isAllocated();
 
   // Clean out the info on previous call to free return info.
   State = State->remove<FreeReturnValue>(SymBase);
index 76f59fda19956b6fa7a23134164fee54656e8501..83946c83a889dbe3bc9282c326c1b7bcb9c4976e 100644 (file)
@@ -1207,6 +1207,16 @@ void freeMemory() {
   }
 }
 
+// PR16730
+void testReallocEscaped(void **memory) {
+  *memory = malloc(47);
+  char *new_memory = realloc(*memory, 47);
+  if (new_memory != 0) {
+    *memory = new_memory;
+  }
+}
+
+
 // ----------------------------------------------------------------------------
 // False negatives.