aboutsummaryrefslogtreecommitdiffhomepage
path: root/runtime
diff options
context:
space:
mode:
authorCristian Cadar <c.cadar@imperial.ac.uk>2018-09-27 15:03:55 +0100
committerCristian Cadar <c.cadar@imperial.ac.uk>2018-09-29 10:40:00 +0100
commit40c1ab5c3d144cde0a513b708b6fb46f2ae1a0dd (patch)
tree54072ff292a0b2a018bd06ac844f471236bcc845 /runtime
parent6ed08c11c6feeabf4749573fdee2e9835d1eb6d2 (diff)
downloadklee-40c1ab5c3d144cde0a513b708b6fb46f2ae1a0dd.tar.gz
Changed code to create up to 100 properly-numbered symbolic arguments, and add a corresponding check.
Diffstat (limited to 'runtime')
-rw-r--r--runtime/POSIX/klee_init_env.c102
1 files changed, 57 insertions, 45 deletions
diff --git a/runtime/POSIX/klee_init_env.c b/runtime/POSIX/klee_init_env.c
index 511a926c..b55a90a6 100644
--- a/runtime/POSIX/klee_init_env.c
+++ b/runtime/POSIX/klee_init_env.c
@@ -82,24 +82,24 @@ static void __add_arg(int *argc, char **argv, char *arg, int argcMax) {
}
}
-void klee_init_env(int* argcPtr, char*** argvPtr) {
+void klee_init_env(int *argcPtr, char ***argvPtr) {
int argc = *argcPtr;
- char** argv = *argvPtr;
+ char **argv = *argvPtr;
int new_argc = 0, n_args;
- char* new_argv[1024];
+ char *new_argv[1024];
unsigned max_len, min_argvs, max_argvs;
unsigned sym_files = 0, sym_file_len = 0;
unsigned sym_stdin_len = 0;
int sym_stdout_flag = 0;
int save_all_writes_flag = 0;
int fd_fail = 0;
- char** final_argv;
- char sym_arg_name[5] = "arg";
+ char **final_argv;
+ char sym_arg_name[6] = "arg";
unsigned sym_arg_num = 0;
- int k=0, i;
+ int k = 0, i;
- sym_arg_name[4] = '\0';
+ sym_arg_name[5] = '\0';
// Recognize --help when it is the sole argument.
if (argc == 2 && __streq(argv[1], "--help")) {
@@ -123,56 +123,70 @@ usage: (klee_init_env) [options] [program arguments]\n\
while (k < argc) {
if (__streq(argv[k], "--sym-arg") || __streq(argv[k], "-sym-arg")) {
const char *msg = "--sym-arg expects an integer argument <max-len>";
- if (++k == argc)
- __emit_error(msg);
-
+ if (++k == argc)
+ __emit_error(msg);
+
max_len = __str_to_int(argv[k++], msg);
- sym_arg_name[3] = '0' + sym_arg_num++;
- __add_arg(&new_argc, new_argv,
- __get_sym_str(max_len, sym_arg_name),
+
+ if (sym_arg_num > 99)
+ __emit_error("No more than 100 symbolic arguments allowed.");
+
+ sym_arg_name[3] = '0' + sym_arg_num / 10;
+ sym_arg_name[4] = '0' + sym_arg_num % 10;
+ sym_arg_num++;
+ __add_arg(&new_argc, new_argv, __get_sym_str(max_len, sym_arg_name),
1024);
- }
- else if (__streq(argv[k], "--sym-args") || __streq(argv[k], "-sym-args")) {
- const char *msg =
- "--sym-args expects three integer arguments <min-argvs> <max-argvs> <max-len>";
+ } else if (__streq(argv[k], "--sym-args") ||
+ __streq(argv[k], "-sym-args")) {
+ const char *msg = "--sym-args expects three integer arguments "
+ "<min-argvs> <max-argvs> <max-len>";
+
+ if (k + 3 >= argc)
+ __emit_error(msg);
- if (k+3 >= argc)
- __emit_error(msg);
-
k++;
min_argvs = __str_to_int(argv[k++], msg);
max_argvs = __str_to_int(argv[k++], msg);
max_len = __str_to_int(argv[k++], msg);
- if ( (min_argvs > max_argvs) || (min_argvs == 0 && max_argvs == 0) )
+ if ((min_argvs > max_argvs) || (min_argvs == 0 && max_argvs == 0))
__emit_error("Invalid range to --sym-args");
- n_args = klee_range(min_argvs, max_argvs+1, "n_args");
- for (i=0; i < n_args; i++) {
- sym_arg_name[3] = '0' + sym_arg_num++;
- __add_arg(&new_argc, new_argv,
- __get_sym_str(max_len, sym_arg_name),
+ n_args = klee_range(min_argvs, max_argvs + 1, "n_args");
+
+ if (sym_arg_num + max_argvs > 99)
+ __emit_error("No more than 100 symbolic arguments allowed.");
+
+ for (i = 0; i < n_args; i++) {
+ sym_arg_name[3] = '0' + sym_arg_num / 10;
+ sym_arg_name[4] = '0' + sym_arg_num % 10;
+ sym_arg_num++;
+
+ __add_arg(&new_argc, new_argv, __get_sym_str(max_len, sym_arg_name),
1024);
}
- }
- else if (__streq(argv[k], "--sym-files") || __streq(argv[k], "-sym-files")) {
- const char* msg = "--sym-files expects two integer arguments <no-sym-files> <sym-file-len>";
+ } else if (__streq(argv[k], "--sym-files") ||
+ __streq(argv[k], "-sym-files")) {
+ const char *msg = "--sym-files expects two integer arguments "
+ "<no-sym-files> <sym-file-len>";
- if (k+2 >= argc)
- __emit_error(msg);
+ if (k + 2 >= argc)
+ __emit_error(msg);
if (sym_files != 0)
__emit_error("Multiple --sym-files are not allowed.\n");
-
+
k++;
sym_files = __str_to_int(argv[k++], msg);
sym_file_len = __str_to_int(argv[k++], msg);
if (sym_files == 0)
- __emit_error("The first argument to --sym-files (number of files) cannot be 0\n");
+ __emit_error("The first argument to --sym-files (number of files) "
+ "cannot be 0\n");
if (sym_file_len == 0)
- __emit_error("The second argument to --sym-files (file size) cannot be 0\n");
+ __emit_error("The second argument to --sym-files (file size) "
+ "cannot be 0\n");
} else if (__streq(argv[k], "--sym-stdin") ||
__streq(argv[k], "-sym-stdin")) {
@@ -187,29 +201,27 @@ usage: (klee_init_env) [options] [program arguments]\n\
__streq(argv[k], "-sym-stdout")) {
sym_stdout_flag = 1;
k++;
- }
- else if (__streq(argv[k], "--save-all-writes") || __streq(argv[k], "-save-all-writes")) {
+ } else if (__streq(argv[k], "--save-all-writes") ||
+ __streq(argv[k], "-save-all-writes")) {
save_all_writes_flag = 1;
k++;
- }
- else if (__streq(argv[k], "--fd-fail") || __streq(argv[k], "-fd-fail")) {
+ } else if (__streq(argv[k], "--fd-fail") || __streq(argv[k], "-fd-fail")) {
fd_fail = 1;
k++;
- }
- else if (__streq(argv[k], "--max-fail") || __streq(argv[k], "-max-fail")) {
+ } else if (__streq(argv[k], "--max-fail") ||
+ __streq(argv[k], "-max-fail")) {
const char *msg = "--max-fail expects an integer argument <max-failures>";
if (++k == argc)
- __emit_error(msg);
-
+ __emit_error(msg);
+
fd_fail = __str_to_int(argv[k++], msg);
- }
- else {
+ } else {
/* simply copy arguments */
__add_arg(&new_argc, new_argv, argv[k++], 1024);
}
}
- final_argv = (char**) malloc((new_argc+1) * sizeof(*final_argv));
+ final_argv = (char **)malloc((new_argc + 1) * sizeof(*final_argv));
klee_mark_global(final_argv);
memcpy(final_argv, new_argv, new_argc * sizeof(*final_argv));
final_argv[new_argc] = 0;