aboutsummaryrefslogtreecommitdiffhomepage
path: root/lib
diff options
context:
space:
mode:
authorPeter Collingbourne <peter@pcc.me.uk>2011-05-25 15:37:03 +0000
committerPeter Collingbourne <peter@pcc.me.uk>2011-05-25 15:37:03 +0000
commit958e9f99e3837ea018f18799c0055d8dc8075c4d (patch)
tree174c85de58ce112bf69ce21e5f24d85a1cb71468 /lib
parent243a217c15fdbf920f91fabfae460f957b25e0ec (diff)
downloadklee-958e9f99e3837ea018f18799c0055d8dc8075c4d.tar.gz
Name symbolic arrays using the 3rd argument to klee_make_symbolic,
and make sure the name is unique. git-svn-id: https://llvm.org/svn/llvm-project/klee/trunk@132054 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/Core/Executor.cpp14
-rw-r--r--lib/Core/Executor.h3
-rw-r--r--lib/Core/SpecialFunctionHandler.cpp2
3 files changed, 13 insertions, 6 deletions
diff --git a/lib/Core/Executor.cpp b/lib/Core/Executor.cpp
index 0dbaab80..1826a4d6 100644
--- a/lib/Core/Executor.cpp
+++ b/lib/Core/Executor.cpp
@@ -3066,12 +3066,18 @@ void Executor::executeMemoryOperation(ExecutionState &state,
}
void Executor::executeMakeSymbolic(ExecutionState &state,
- const MemoryObject *mo) {
+ const MemoryObject *mo,
+ const std::string &name) {
// Create a new object state for the memory object (instead of a copy).
if (!replayOut) {
- static unsigned id = 0;
- const Array *array = new Array("arr" + llvm::utostr(++id),
- mo->size);
+ // Find a unique name for this array. First try the original name,
+ // or if that fails try adding a unique identifier.
+ unsigned id = 0;
+ std::string uniqueName = name;
+ while (!state.arrayNames.insert(uniqueName).second) {
+ uniqueName = name + "_" + llvm::utostr(++id);
+ }
+ const Array *array = new Array(uniqueName, mo->size);
bindObjectInState(state, mo, false, array);
state.addSymbolic(mo, array);
diff --git a/lib/Core/Executor.h b/lib/Core/Executor.h
index c37a2869..3a0fa139 100644
--- a/lib/Core/Executor.h
+++ b/lib/Core/Executor.h
@@ -261,7 +261,8 @@ private:
ref<Expr> value /* undef if read */,
KInstruction *target /* undef if write */);
- void executeMakeSymbolic(ExecutionState &state, const MemoryObject *mo);
+ void executeMakeSymbolic(ExecutionState &state, const MemoryObject *mo,
+ const std::string &name);
/// Create a new state where each input condition has been added as
/// a constraint and return the results. The input state is included
diff --git a/lib/Core/SpecialFunctionHandler.cpp b/lib/Core/SpecialFunctionHandler.cpp
index 1a0ca406..d01a9ef4 100644
--- a/lib/Core/SpecialFunctionHandler.cpp
+++ b/lib/Core/SpecialFunctionHandler.cpp
@@ -680,7 +680,7 @@ void SpecialFunctionHandler::handleMakeSymbolic(ExecutionState &state,
assert(success && "FIXME: Unhandled solver failure");
if (res) {
- executor.executeMakeSymbolic(*s, mo);
+ executor.executeMakeSymbolic(*s, mo, name);
} else {
executor.terminateStateOnError(*s,
"wrong size given to klee_make_symbolic[_name]",