aboutsummaryrefslogtreecommitdiffhomepage
path: root/lib/Core/Memory.cpp
diff options
context:
space:
mode:
authorDan Liew <delcypher@gmail.com>2015-12-18 12:48:18 +0000
committerDan Liew <delcypher@gmail.com>2015-12-18 12:48:18 +0000
commit535be01be5ab33a0e7106e2d5511bba2797d1ed0 (patch)
tree026a4f1b16c1996755954f7824e0d10f8ed0ef8e /lib/Core/Memory.cpp
parent7e75fa79b2e76251c2cd417a7eae8a7620b014ae (diff)
parent53ff7a002a8213a5d5e778bef2a895998d9890e1 (diff)
downloadklee-535be01be5ab33a0e7106e2d5511bba2797d1ed0.tar.gz
Merge pull request #315 from delcypher/array_leak
Try to fix leaking Array objects detected by ASan.
Diffstat (limited to 'lib/Core/Memory.cpp')
-rw-r--r--lib/Core/Memory.cpp21
1 files changed, 11 insertions, 10 deletions
diff --git a/lib/Core/Memory.cpp b/lib/Core/Memory.cpp
index 12ca7104..72f0a1fb 100644
--- a/lib/Core/Memory.cpp
+++ b/lib/Core/Memory.cpp
@@ -14,6 +14,7 @@
#include "klee/Solver.h"
#include "klee/util/BitArray.h"
#include "klee/Internal/Support/ErrorHandling.h"
+#include "klee/util/ArrayCache.h"
#include "ObjectHolder.h"
#include "MemoryManager.h"
@@ -110,9 +111,9 @@ ObjectState::ObjectState(const MemoryObject *mo)
readOnly(false) {
mo->refCount++;
if (!UseConstantArrays) {
- // FIXME: Leaked.
static unsigned id = 0;
- const Array *array = Array::CreateArray("tmp_arr" + llvm::utostr(++id), size);
+ const Array *array =
+ getArrayCache()->CreateArray("tmp_arr" + llvm::utostr(++id), size);
updates = UpdateList(array, 0);
}
memset(concreteStore, 0, size);
@@ -176,6 +177,11 @@ ObjectState::~ObjectState() {
}
}
+ArrayCache *ObjectState::getArrayCache() const {
+ assert(object && "object was NULL");
+ return object->parent->getArrayCache();
+}
+
/***/
const UpdateList &ObjectState::getUpdates() const {
@@ -215,15 +221,10 @@ const UpdateList &ObjectState::getUpdates() const {
Contents[Index->getZExtValue()] = Value;
}
- // FIXME: We should unique these, there is no good reason to create multiple
- // ones.
-
- // Start a new update list.
- // FIXME: Leaked.
static unsigned id = 0;
- const Array *array = Array::CreateArray("const_arr" + llvm::utostr(++id), size,
- &Contents[0],
- &Contents[0] + Contents.size());
+ const Array *array = getArrayCache()->CreateArray(
+ "const_arr" + llvm::utostr(++id), size, &Contents[0],
+ &Contents[0] + Contents.size());
updates = UpdateList(array, 0);
// Apply the remaining (non-constant) writes.