diff options
author | Cristian Cadar <cristic@cs.stanford.edu> | 2010-06-28 15:07:59 +0000 |
---|---|---|
committer | Cristian Cadar <cristic@cs.stanford.edu> | 2010-06-28 15:07:59 +0000 |
commit | e3414c0e8cc91a35cdcae09c0af8162b8f7c2f94 (patch) | |
tree | 112586608310b81d1179c003fd8a73734e2577c9 | |
parent | ff0d675fc2861e34e1f0767af6b8b73e1a854889 (diff) | |
download | klee-e3414c0e8cc91a35cdcae09c0af8162b8f7c2f94.tar.gz |
Applied Stefan Bucur's patch from
http://llvm.org/bugs/show_bug.cgi?id=6690. The patch adds specialized versions of klee_get_value for different types, fixing the previous klee_get_value function that sometimes truncated 64bit parameters to 32bit. git-svn-id: https://llvm.org/svn/llvm-project/klee/trunk@107006 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/klee/klee.h | 30 | ||||
-rw-r--r-- | lib/Core/SpecialFunctionHandler.cpp | 7 | ||||
-rw-r--r-- | runtime/POSIX/fd.c | 6 | ||||
-rw-r--r-- | runtime/POSIX/klee_init_env.c | 2 | ||||
-rw-r--r-- | runtime/Runtest/intrinsics.c | 28 | ||||
-rw-r--r-- | runtime/klee-libc/klee-choose.c | 4 | ||||
-rw-r--r-- | test/Feature/GetValue.c | 6 | ||||
-rw-r--r-- | tools/klee-replay/klee-replay.c | 11 |
8 files changed, 62 insertions, 32 deletions
diff --git a/include/klee/klee.h b/include/klee/klee.h index aa47ce22..ce92ba37 100644 --- a/include/klee/klee.h +++ b/include/klee/klee.h @@ -10,6 +10,9 @@ #ifndef __KLEE_H__ #define __KLEE_H__ +#include "stdint.h" +#include "stddef.h" + #ifdef __cplusplus extern "C" { #endif @@ -19,7 +22,7 @@ extern "C" { objects do not overlap. These memory objects will also (obviously) not correctly interact with external function calls. */ - void klee_define_fixed_object(void *addr, unsigned nbytes); + void klee_define_fixed_object(void *addr, size_t nbytes); /// klee_make_symbolic - Make the contents of the object pointer to by \arg /// addr symbolic. @@ -29,7 +32,7 @@ extern "C" { /// be the entire contents of the object. /// \arg name - An optional name, used for identifying the object in messages, /// output files, etc. - void klee_make_symbolic(void *addr, unsigned nbytes, const char *name); + void klee_make_symbolic(void *addr, size_t nbytes, const char *name); /// klee_range - Construct a symbolic value in the signed interval /// [begin,end). @@ -67,7 +70,7 @@ extern "C" { const char *suffix); /* called by checking code to get size of memory. */ - unsigned klee_get_obj_size(void *ptr); + size_t klee_get_obj_size(void *ptr); /* print the tree associated w/ a given expression. */ void klee_print_expr(const char *msg, ...); @@ -75,7 +78,7 @@ extern "C" { /* NB: this *does not* fork n times and return [0,n) in children. * It makes n be symbolic and returns: caller must compare N times. */ - unsigned klee_choose(unsigned n); + uintptr_t klee_choose(uintptr_t n); /* special klee assert macro. this assert should be used when path consistency * across platforms is desired (e.g., in tests). @@ -91,21 +94,30 @@ extern "C" { * and writing tests but can also be used to enable prints in replay * mode. */ - unsigned klee_is_symbolic(unsigned n); + unsigned klee_is_symbolic(uintptr_t n); /* The following intrinsics are primarily intended for internal use and may have peculiar semantics. */ - void klee_assume(unsigned condition); + void klee_assume(uintptr_t condition); void klee_warning(const char *message); void klee_warning_once(const char *message); - void klee_prefer_cex(void *object, unsigned condition); + void klee_prefer_cex(void *object, uintptr_t condition); void klee_mark_global(void *object); /* Return a possible constant value for the input expression. This allows programs to forcibly concretize values on their own. */ - unsigned klee_get_value(unsigned expr); +#define KLEE_GET_VALUE_PROTO(suffix, type) type klee_get_value##suffix(type expr) + + KLEE_GET_VALUE_PROTO(f, float); + KLEE_GET_VALUE_PROTO(d, double); + KLEE_GET_VALUE_PROTO(l, long); + KLEE_GET_VALUE_PROTO(ll, long long); + KLEE_GET_VALUE_PROTO(_i32, int32_t); + KLEE_GET_VALUE_PROTO(_i64, int64_t); + +#undef KLEE_GET_VALUE_PROTO /* Ensure that memory in the range [address, address+size) is accessible to the program. If some byte in the range is not @@ -114,7 +126,7 @@ extern "C" { The current implementation requires both address and size to be constants and that the range lie within a single object. */ - void klee_check_memory_access(const void *address, unsigned size); + void klee_check_memory_access(const void *address, size_t size); /* Enable/disable forking. */ void klee_set_forking(unsigned enable); diff --git a/lib/Core/SpecialFunctionHandler.cpp b/lib/Core/SpecialFunctionHandler.cpp index d3a86aac..2ef80acc 100644 --- a/lib/Core/SpecialFunctionHandler.cpp +++ b/lib/Core/SpecialFunctionHandler.cpp @@ -68,7 +68,12 @@ HandlerInfo handlerInfo[] = { add("free", handleFree, false), add("klee_assume", handleAssume, false), add("klee_check_memory_access", handleCheckMemoryAccess, false), - add("klee_get_value", handleGetValue, true), + add("klee_get_valuef", handleGetValue, true), + add("klee_get_valued", handleGetValue, true), + add("klee_get_valuel", handleGetValue, true), + add("klee_get_valuell", handleGetValue, true), + add("klee_get_value_i32", handleGetValue, true), + add("klee_get_value_i64", handleGetValue, true), add("klee_define_fixed_object", handleDefineFixedObject, false), add("klee_get_obj_size", handleGetObjSize, true), add("klee_get_errno", handleGetErrno, true), diff --git a/runtime/POSIX/fd.c b/runtime/POSIX/fd.c index d94604fa..b9a848d0 100644 --- a/runtime/POSIX/fd.c +++ b/runtime/POSIX/fd.c @@ -1251,13 +1251,13 @@ char *getcwd(char *buf, size_t size) { static void *__concretize_ptr(const void *p) { /* XXX 32-bit assumption */ - char *pc = (char*) klee_get_value((unsigned) (long) p); + char *pc = (char*) klee_get_valuel((long) p); klee_assume(pc == p); return pc; } static size_t __concretize_size(size_t s) { - size_t sc = klee_get_value(s); + size_t sc = klee_get_valuel((long)s); klee_assume(sc == s); return sc; } @@ -1276,7 +1276,7 @@ static const char *__concretize_string(const char *s) { *sc++ = '/'; } } else { - char cc = (char) klee_get_value(c); + char cc = (char) klee_get_valuel((long)c); klee_assume(cc == c); *sc++ = cc; if (!cc) break; diff --git a/runtime/POSIX/klee_init_env.c b/runtime/POSIX/klee_init_env.c index 5c1cc4fb..2a6b6f68 100644 --- a/runtime/POSIX/klee_init_env.c +++ b/runtime/POSIX/klee_init_env.c @@ -8,7 +8,9 @@ //===----------------------------------------------------------------------===// #include "klee/klee.h" +#ifndef _LARGEFILE64_SOURCE #define _LARGEFILE64_SOURCE +#endif #include "fd.h" #include <stdlib.h> diff --git a/runtime/Runtest/intrinsics.c b/runtime/Runtest/intrinsics.c index 7ec21901..2302e278 100644 --- a/runtime/Runtest/intrinsics.c +++ b/runtime/Runtest/intrinsics.c @@ -31,7 +31,7 @@ static unsigned char rand_byte(void) { return x & 0xFF; } -void klee_make_symbolic(void *array, unsigned nbytes, const char *name) { +void klee_make_symbolic(void *array, size_t nbytes, const char *name) { static int rand_init = -1; if (rand_init == -1) { @@ -52,7 +52,7 @@ void klee_make_symbolic(void *array, unsigned nbytes, const char *name) { *v = rand() % 69; } else { char *c = array; - unsigned i; + size_t i; for (i=0; i<nbytes; i++) c[i] = rand_byte(); } @@ -98,24 +98,34 @@ void klee_silent_exit(int x) { exit(x); } -unsigned klee_choose(unsigned n) { - unsigned x; +uintptr_t klee_choose(uintptr_t n) { + uintptr_t x; klee_make_symbolic(&x, sizeof x, "klee_choose"); if(x >= n) - fprintf(stderr, "ERROR: max = %d, got = %d\n", n, x); + fprintf(stderr, "ERROR: max = %ld, got = %ld\n", n, x); assert(x < n); return x; } -void klee_assume(unsigned x) { +void klee_assume(uintptr_t x) { if (!x) { fprintf(stderr, "ERROR: invalid klee_assume\n"); } } -unsigned klee_get_value(unsigned x) { - return x; -} +#define KLEE_GET_VALUE_STUB(suffix, type) \ + type klee_get_value##suffix(type x) { \ + return x; \ + } + +KLEE_GET_VALUE_STUB(f, float) +KLEE_GET_VALUE_STUB(d, double) +KLEE_GET_VALUE_STUB(l, long) +KLEE_GET_VALUE_STUB(ll, long long) +KLEE_GET_VALUE_STUB(_i32, int32_t) +KLEE_GET_VALUE_STUB(_i64, int64_t) + +#undef KLEE_GET_VALUE_STUB int klee_range(int begin, int end, const char* name) { int x; diff --git a/runtime/klee-libc/klee-choose.c b/runtime/klee-libc/klee-choose.c index 347933df..181aedaa 100644 --- a/runtime/klee-libc/klee-choose.c +++ b/runtime/klee-libc/klee-choose.c @@ -9,8 +9,8 @@ #include "klee/klee.h" -unsigned klee_choose(unsigned n) { - unsigned x; +uintptr_t klee_choose(uintptr_t n) { + uintptr_t x; klee_make_symbolic(&x, sizeof x, "klee_choose"); // NB: this will *not* work if they don't compare to n values. diff --git a/test/Feature/GetValue.c b/test/Feature/GetValue.c index 391b68e3..dfd40d69 100644 --- a/test/Feature/GetValue.c +++ b/test/Feature/GetValue.c @@ -9,9 +9,9 @@ int main() { klee_assume(x > 10); klee_assume(x < 20); - assert(!klee_is_symbolic(klee_get_value(x))); - assert(klee_get_value(x) > 10); - assert(klee_get_value(x) < 20); + assert(!klee_is_symbolic(klee_get_value_i32(x))); + assert(klee_get_value_i32(x) > 10); + assert(klee_get_value_i32(x) < 20); return 0; } diff --git a/tools/klee-replay/klee-replay.c b/tools/klee-replay/klee-replay.c index 1cbbf6d8..7c605a53 100644 --- a/tools/klee-replay/klee-replay.c +++ b/tools/klee-replay/klee-replay.c @@ -15,6 +15,7 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <stdint.h> #include <errno.h> #include <time.h> @@ -327,22 +328,22 @@ void klee_warning_once(char *name) { fprintf(stderr, "WARNING: %s\n", name); } -int klee_assume(int x) { +unsigned klee_assume(uintptr_t x) { if (!x) { fprintf(stderr, "WARNING: klee_assume(0)!\n"); } return 0; } -int klee_is_symbolic(int x) { +unsigned klee_is_symbolic(uintptr_t x) { return 0; } -void klee_prefer_cex(void *buffer, unsigned condition) { +void klee_prefer_cex(void *buffer, uintptr_t condition) { ; } -void klee_make_symbolic(void *addr, unsigned nbytes, const char *name) { +void klee_make_symbolic(void *addr, size_t nbytes, const char *name) { /* XXX remove model version code once new tests gen'd */ if (obj_index >= input->numObjects) { if (strcmp("model_version", name) == 0) { @@ -361,7 +362,7 @@ void klee_make_symbolic(void *addr, unsigned nbytes, const char *name) { } else { if (boo->numBytes != nbytes) { fprintf(stderr, "make_symbolic mismatch, different sizes: " - "%d in input file, %d in code\n", boo->numBytes, nbytes); + "%d in input file, %ld in code\n", boo->numBytes, nbytes); exit(1); } else { memcpy(addr, boo->bytes, nbytes); |