From: root Date: Thu, 1 Aug 2019 06:12:32 +0000 (-0700) Subject: Switch from pipes to temporary file to store program output to get rid length limits. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=4734cee80cd579ded905ce4057ef9a2c3c81e494;p=c11tester.git Switch from pipes to temporary file to store program output to get rid length limits. --- diff --git a/common.cc b/common.cc index 904a298e..8bef5194 100644 --- a/common.cc +++ b/common.cc @@ -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 */ @@ -152,6 +142,7 @@ void print_program_output() /* 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) { @@ -168,6 +159,9 @@ void print_program_output() } } + close(fd_user_out); + unlink(filename); + model_print("---- END PROGRAM OUTPUT ----\n"); } #endif /* ! CONFIG_DEBUG */ diff --git a/common.mk b/common.mk index aca498c7..bc068dff 100644 --- a/common.mk +++ b/common.mk @@ -8,7 +8,7 @@ UNAME := $(shell uname) LIB_NAME := model LIB_SO := lib$(LIB_NAME).so -CPPFLAGS += -Wall -g -O0 +CPPFLAGS += -Wall -g -O3 # Mac OSX options ifeq ($(UNAME), Darwin) diff --git a/main.cc b/main.cc index 53495072..590a41d2 100644 --- a/main.cc +++ b/main.cc @@ -189,8 +189,6 @@ int main(int argc, char **argv) "Distributed under the GPLv2\n" "Written by Weiyu Luo, Brian Norris, and Brian Demsky\n\n"); - /* Configure output redirection for the model-checker */ - redirect_output(); //Initialize snapshotting library and model checker object if (!model) { @@ -199,6 +197,9 @@ int main(int argc, char **argv) model->startChecker(); } + /* Configure output redirection for the model-checker */ + redirect_output(); + register_plugins(); //Parse command line options