diff options
author | Cristian Cadar <c.cadar@imperial.ac.uk> | 2016-07-22 13:05:33 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-07-22 13:05:33 +0100 |
commit | 66adc6374cc9b43db2beccec9ae0a547dc411eae (patch) | |
tree | b3c2c832d3f8fb119a9384dfb6ab77cd23bd6bea | |
parent | c1037080cb61ec6d5d8af3db97a6ad5f35d7af31 (diff) | |
parent | a6b2f63dbf0dd4498409d3caaf34eaccea3019ea (diff) | |
download | klee-66adc6374cc9b43db2beccec9ae0a547dc411eae.tar.gz |
Merge pull request #425 from jirislaby/globals
Executor: do not crash on non-sized globals
-rw-r--r-- | lib/Core/Executor.cpp | 13 | ||||
-rw-r--r-- | test/Feature/NonSizedGlobals.c | 12 |
2 files changed, 21 insertions, 4 deletions
diff --git a/lib/Core/Executor.cpp b/lib/Core/Executor.cpp index 2f5bdb0c..acd02c67 100644 --- a/lib/Core/Executor.cpp +++ b/lib/Core/Executor.cpp @@ -562,7 +562,13 @@ void Executor::initializeGlobals(ExecutionState &state) { // hack where we check the object file information. LLVM_TYPE_Q Type *ty = i->getType()->getElementType(); - uint64_t size = kmodule->targetData->getTypeStoreSize(ty); + uint64_t size = 0; + if (ty->isSized()) { + size = kmodule->targetData->getTypeStoreSize(ty); + } else { + klee_warning("Type for %.*s is not sized", (int)i->getName().size(), + i->getName().data()); + } // XXX - DWD - hardcode some things until we decide how to fix. #ifndef WINDOWS @@ -576,9 +582,8 @@ void Executor::initializeGlobals(ExecutionState &state) { #endif if (size == 0) { - llvm::errs() << "Unable to find size for global variable: " - << i->getName() - << " (use will result in out of bounds access)\n"; + klee_warning("Unable to find size for global variable: %.*s (use will result in out of bounds access)", + (int)i->getName().size(), i->getName().data()); } MemoryObject *mo = memory->allocate(size, false, true, i); diff --git a/test/Feature/NonSizedGlobals.c b/test/Feature/NonSizedGlobals.c new file mode 100644 index 00000000..b98f7bf1 --- /dev/null +++ b/test/Feature/NonSizedGlobals.c @@ -0,0 +1,12 @@ +// RUN: %llvmgcc %s -emit-llvm -g -c -o %t1.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --exit-on-error %t1.bc + +struct X; +extern struct X Y; +void *ptr = &Y; + +int main() +{ + return 0; +} |