Minor fix in safe_print function
authorAndres Noetzli <noetzli@stanford.edu>
Mon, 15 May 2017 15:39:16 +0000 (08:39 -0700)
committerAndres Noetzli <noetzli@stanford.edu>
Mon, 15 May 2017 21:53:38 +0000 (14:53 -0700)
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 "<unsupported>" 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
src/main/main.h
src/main/util.cpp
src/util/safe_print.cpp
src/util/statistics.cpp
src/util/statistics_registry.h

index 6de4f9ff42b35b5f46ef96514d5520d97882990e..5113bab100d26d459f235ac8be8eb57fae985685 100644 (file)
@@ -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);
index 8277d366a36711dbf98fc7f32f473d53d501ebe0..e4723a743e5fe708cdeafa2d700a0902d70c521f 100644 (file)
@@ -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;
index 744122cc8eb934050c02c51ed45d1f01d551ca8b..9dc5049a92de5a9230ea0d91307e953822284756 100644 (file)
@@ -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<int64_t>(STDERR_FILENO, getpid());
     safe_print(STDERR_FILENO, "\n");
     safe_print(STDERR_FILENO, " or:  gdb --pid=");
     safe_print<int64_t>(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<int64_t>(STDERR_FILENO, getpid());
     safe_print(STDERR_FILENO, "\n");
     safe_print(STDERR_FILENO, " or:  gdb --pid=");
     safe_print<int64_t>(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<int64_t>(STDERR_FILENO, getpid());
     safe_print(STDERR_FILENO, "\n");
     safe_print(STDERR_FILENO, " or:  gdb --pid=");
     safe_print<int64_t>(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);
index ff5a7aa7e6aabb3a856b17600ca36f5c281f87bf..dc986e2516371f25c01e5dd7db30fcd92ebe9f98 100644 (file)
@@ -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) {
index 73ea5b1b1395c0125dadace9ade74c72ef15c720..9423c937997bc118f8c2839595f330eb2dd2580a 100644 (file)
@@ -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");
index 1206a3e4aae0b2946c1aa64b7c4ed507f76c6c61..bd7f87b44962ea675e1988bab39e8123545bc12a 100644 (file)
@@ -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);
     }