X-Git-Url: http://plrg.eecs.uci.edu/git/?p=c11tester.git;a=blobdiff_plain;f=common.cc;h=8bef5194201c59f3ee3ff16bf87e1dbaa18a3319;hp=66b563a8ba6223a32a2c7d08067406fec0914c4b;hb=7d1b8dbe8d1839862c3db07e67a313d0e6efce81;hpb=0a99a3c4c1c9aab7be017682b43ddf12d609ff4b diff --git a/common.cc b/common.cc index 66b563a8..8bef5194 100644 --- a/common.cc +++ b/common.cc @@ -33,11 +33,11 @@ void print_trace(void) model_print("\nDumping stack trace (%d frames):\n", size); - for (i = 0; i < size; i++) + for (i = 0;i < size;i++) model_print("\t%s\n", strings[i]); free(strings); -#endif /* CONFIG_STACKTRACE */ +#endif /* CONFIG_STACKTRACE */ } void assert_hook(void) @@ -50,14 +50,14 @@ void model_assert(bool expr, const char *file, int line) if (!expr) { char msg[100]; sprintf(msg, "Program has hit assertion in file %s at line %d\n", - file, line); + file, line); model->assert_user_bug(msg); } } #ifndef CONFIG_DEBUG -static int fd_user_out; /**< @brief File descriptor from which to read user program output */ +static int fd_user_out; /**< @brief File descriptor from which to read user program output */ /** * @brief Setup output redirecting @@ -79,6 +79,8 @@ static int fd_user_out; /**< @brief File descriptor from which to read user prog * * This function should only be called once. */ +char filename[256]; + void redirect_output() { /* Save stdout for later use */ @@ -87,25 +89,13 @@ void redirect_output() perror("dup"); exit(EXIT_FAILURE); } - - /* Redirect program output to a pipe */ - int pipefd[2]; - if (pipe(pipefd) < 0) { - perror("pipe"); - exit(EXIT_FAILURE); - } - if (dup2(pipefd[1], STDOUT_FILENO) < 0) { + snprintf_(filename, sizeof(filename), "C11FuzzerTmp%d", getpid()); + fd_user_out = open(filename, O_CREAT | O_TRUNC| O_RDWR, S_IRWXU); + if (dup2(fd_user_out, STDOUT_FILENO) < 0) { perror("dup2"); exit(EXIT_FAILURE); } - close(pipefd[1]); - /* Save the "read" side of the pipe for use later */ - if (fcntl(pipefd[0], F_SETFL, O_NONBLOCK) < 0) { - perror("fcntl"); - exit(EXIT_FAILURE); - } - fd_user_out = pipefd[0]; } /** @@ -138,8 +128,8 @@ static ssize_t read_to_buf(int fd, char *buf, size_t maxlen) void clear_program_output() { fflush(stdout); - char buf[200]; - while (read_to_buf(fd_user_out, buf, sizeof(buf))); + close(fd_user_out); + unlink(filename); } /** @brief Print out any pending program output */ @@ -147,9 +137,12 @@ void print_program_output() { char buf[200]; + model_print("---- BEGIN PROGRAM OUTPUT ----\n"); + /* Gather all program output */ fflush(stdout); + lseek(fd_user_out, 0, SEEK_SET); /* Read program output pipe and write to (real) stdout */ ssize_t ret; while (1) { @@ -165,5 +158,10 @@ void print_program_output() ret -= res; } } + + close(fd_user_out); + unlink(filename); + + model_print("---- END PROGRAM OUTPUT ----\n"); } -#endif /* ! CONFIG_DEBUG */ +#endif /* ! CONFIG_DEBUG */