From 41460b380a9538e2bd06c42c25ccf20f0644f600 Mon Sep 17 00:00:00 2001 From: Andres Noetzli Date: Mon, 15 May 2017 08:39:16 -0700 Subject: [PATCH] Minor fix in safe_print function This commit fixes two issues reported by Coverity: - Fixes the check whether the buffer is full in safe_print_hex - Removes dead code in safe_print for floating-point values Additionally, it fixes an issue reported by Andy where the names of the statistics were printed as "" due to calling the const char* version instead of the std::string version of safe_print. Finally, this fixes an issue where --segv-spin would not print the program name because it was a const char*. The program name is now stored as a string. NOTE: As a side effect, the last part also fixes Coverity issue 1362944, which has been in CVC4 for a long time. --- src/main/driver_unified.cpp | 5 +++-- src/main/main.h | 2 +- src/main/util.cpp | 12 ++++++------ src/util/safe_print.cpp | 7 +++---- src/util/statistics.cpp | 4 ++-- src/util/statistics_registry.h | 2 +- 6 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/main/driver_unified.cpp b/src/main/driver_unified.cpp index 6de4f9ff4..5113bab10 100644 --- a/src/main/driver_unified.cpp +++ b/src/main/driver_unified.cpp @@ -61,7 +61,7 @@ namespace CVC4 { const char *progPath; /** Just the basename component of argv[0] */ - const char *progName; + const std::string *progName; /** A pointer to the CommandExecutor (the signal handlers need it) */ CVC4::main::CommandExecutor* pExecutor = NULL; @@ -112,7 +112,8 @@ int runCvc4(int argc, char* argv[], Options& opts) { } # endif - progName = opts.getBinaryName().c_str(); + string progNameStr = opts.getBinaryName(); + progName = &progNameStr; if( opts.getHelp() ) { printUsage(opts, true); diff --git a/src/main/main.h b/src/main/main.h index 8277d366a..e4723a743 100644 --- a/src/main/main.h +++ b/src/main/main.h @@ -38,7 +38,7 @@ class CommandExecutor; extern const char* progPath; /** Just the basename component of argv[0] */ -extern const char* progName; +extern const std::string* progName; /** A reference for use by the signal handlers to print statistics */ extern CVC4::main::CommandExecutor* pExecutor; diff --git a/src/main/util.cpp b/src/main/util.cpp index 744122cc8..9dc5049a9 100644 --- a/src/main/util.cpp +++ b/src/main/util.cpp @@ -112,14 +112,14 @@ void segv_handler(int sig, siginfo_t* info, void* c) { safe_print(STDERR_FILENO, "Spinning so that a debugger can be connected.\n"); safe_print(STDERR_FILENO, "Try: gdb "); - safe_print(STDERR_FILENO, progName); + safe_print(STDERR_FILENO, *progName); safe_print(STDERR_FILENO, " "); safe_print(STDERR_FILENO, getpid()); safe_print(STDERR_FILENO, "\n"); safe_print(STDERR_FILENO, " or: gdb --pid="); safe_print(STDERR_FILENO, getpid()); safe_print(STDERR_FILENO, " "); - safe_print(STDERR_FILENO, progName); + safe_print(STDERR_FILENO, *progName); safe_print(STDERR_FILENO, "\n"); for(;;) { sleep(60); @@ -156,14 +156,14 @@ void ill_handler(int sig, siginfo_t* info, void*) { safe_print(STDERR_FILENO, "Spinning so that a debugger can be connected.\n"); safe_print(STDERR_FILENO, "Try: gdb "); - safe_print(STDERR_FILENO, progName); + safe_print(STDERR_FILENO, *progName); safe_print(STDERR_FILENO, " "); safe_print(STDERR_FILENO, getpid()); safe_print(STDERR_FILENO, "\n"); safe_print(STDERR_FILENO, " or: gdb --pid="); safe_print(STDERR_FILENO, getpid()); safe_print(STDERR_FILENO, " "); - safe_print(STDERR_FILENO, progName); + safe_print(STDERR_FILENO, *progName); safe_print(STDERR_FILENO, "\n"); for(;;) { sleep(60); @@ -206,14 +206,14 @@ void cvc4unexpected() { safe_print(STDERR_FILENO, "Spinning so that a debugger can be connected.\n"); safe_print(STDERR_FILENO, "Try: gdb "); - safe_print(STDERR_FILENO, progName); + safe_print(STDERR_FILENO, *progName); safe_print(STDERR_FILENO, " "); safe_print(STDERR_FILENO, getpid()); safe_print(STDERR_FILENO, "\n"); safe_print(STDERR_FILENO, " or: gdb --pid="); safe_print(STDERR_FILENO, getpid()); safe_print(STDERR_FILENO, " "); - safe_print(STDERR_FILENO, progName); + safe_print(STDERR_FILENO, *progName); safe_print(STDERR_FILENO, "\n"); for(;;) { sleep(60); diff --git a/src/util/safe_print.cpp b/src/util/safe_print.cpp index ff5a7aa7e..dc986e251 100644 --- a/src/util/safe_print.cpp +++ b/src/util/safe_print.cpp @@ -128,9 +128,8 @@ void safe_print(int fd, const double& _d) { d -= c; i++; } - if (i == 0) { - safe_print(fd, "0"); - } else if (write(fd, buf, i) != i) { + + if (write(fd, buf, i) != i) { abort(); } } @@ -172,7 +171,7 @@ void safe_print_hex(int fd, uint64_t i) { // This loop fills the buffer from the end. The number of elements in the // buffer is BUFER_SIZE - idx - 1 and they start at position idx + 1. - size_t idx = BUFFER_SIZE - 1; + ssize_t idx = BUFFER_SIZE - 1; while (i != 0 && idx >= 0) { char current = i % 16; if (current <= 9) { diff --git a/src/util/statistics.cpp b/src/util/statistics.cpp index 73ea5b1b1..9423c9379 100644 --- a/src/util/statistics.cpp +++ b/src/util/statistics.cpp @@ -122,8 +122,8 @@ void StatisticsBase::safeFlushInformation(int fd) const { for (StatSet::iterator i = d_stats.begin(); i != d_stats.end(); ++i) { Stat* s = *i; if (d_prefix.size() != 0) { - safe_print(fd, d_prefix.c_str()); - safe_print(fd, s_regDelim.c_str()); + safe_print(fd, d_prefix); + safe_print(fd, s_regDelim); } s->safeFlushStat(fd); safe_print(fd, "\n"); diff --git a/src/util/statistics_registry.h b/src/util/statistics_registry.h index 1206a3e4a..bd7f87b44 100644 --- a/src/util/statistics_registry.h +++ b/src/util/statistics_registry.h @@ -137,7 +137,7 @@ public: */ virtual void safeFlushStat(int fd) const { if (__CVC4_USE_STATISTICS) { - safe_print(fd, d_name.c_str()); + safe_print(fd, d_name); safe_print(fd, ", "); safeFlushInformation(fd); } -- 2.30.2