diff options
-rw-r--r-- | lib/Core/SpecialFunctionHandler.cpp | 15 | ||||
-rw-r--r-- | test/regression/2016-08-06-klee-get-obj-size.c | 14 | ||||
-rw-r--r-- | tools/klee/main.cpp | 9 |
3 files changed, 30 insertions, 8 deletions
diff --git a/lib/Core/SpecialFunctionHandler.cpp b/lib/Core/SpecialFunctionHandler.cpp index b44b0e1b..0ecbdd07 100644 --- a/lib/Core/SpecialFunctionHandler.cpp +++ b/lib/Core/SpecialFunctionHandler.cpp @@ -30,6 +30,14 @@ #endif #include "llvm/ADT/Twine.h" +#if LLVM_VERSION_CODE <= LLVM_VERSION(3, 1) +#include "llvm/Target/TargetData.h" +#elif LLVM_VERSION_CODE <= LLVM_VERSION(3, 2) +#include "llvm/DataLayout.h" +#else +#include "llvm/IR/DataLayout.h" +#endif + #include <errno.h> using namespace llvm; @@ -539,8 +547,11 @@ void SpecialFunctionHandler::handleGetObjSize(ExecutionState &state, executor.resolveExact(state, arguments[0], rl, "klee_get_obj_size"); for (Executor::ExactResolutionList::iterator it = rl.begin(), ie = rl.end(); it != ie; ++it) { - executor.bindLocal(target, *it->second, - ConstantExpr::create(it->first.first->size, Expr::Int32)); + executor.bindLocal( + target, *it->second, + ConstantExpr::create(it->first.first->size, + executor.kmodule->targetData->getTypeSizeInBits( + target->inst->getType()))); } } diff --git a/test/regression/2016-08-06-klee-get-obj-size.c b/test/regression/2016-08-06-klee-get-obj-size.c new file mode 100644 index 00000000..df4114ff --- /dev/null +++ b/test/regression/2016-08-06-klee-get-obj-size.c @@ -0,0 +1,14 @@ +// RUN: %llvmgcc %s -emit-llvm -g -O0 -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out %t.bc +// RUN: test -f %t.klee-out/test000001.assert.err + + +#include <klee/klee.h> +#include <assert.h> + +int main() { + char s[5]; + assert(5 != klee_get_obj_size(s)); + return 0; +} diff --git a/tools/klee/main.cpp b/tools/klee/main.cpp index de04d92e..3e469a6e 100644 --- a/tools/klee/main.cpp +++ b/tools/klee/main.cpp @@ -40,6 +40,7 @@ #include "llvm/LLVMContext.h" #include "llvm/Support/FileSystem.h" #endif +#include "llvm/Support/Errno.h" #include "llvm/Support/FileSystem.h" #include "llvm/Bitcode/ReaderWriter.h" #include "llvm/Support/CommandLine.h" @@ -1430,10 +1431,8 @@ int main(int argc, char **argv, char **envp) { if (RunInDir != "") { int res = chdir(RunInDir.c_str()); if (res < 0) { - char info[128]; - char *str = strerror_r(errno, info, sizeof(info)); klee_error("Unable to change directory to: %s - %s", RunInDir.c_str(), - str); + sys::StrError(errno).c_str()); } } @@ -1495,10 +1494,8 @@ int main(int argc, char **argv, char **envp) { if (RunInDir != "") { int res = chdir(RunInDir.c_str()); if (res < 0) { - char info[128]; - char *str = strerror_r(errno, info, sizeof(info)); klee_error("Unable to change directory to: %s - %s", RunInDir.c_str(), - str); + sys::StrError(errno).c_str()); } } interpreter->runFunctionAsMain(mainFn, pArgc, pArgv, pEnvp); |