From: Brian Norris <banorris@uci.edu>
Date: Thu, 18 Apr 2013 00:10:20 +0000 (-0700)
Subject: stacktrace: remove usage of FILE in stacktrace
X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=0a99a3c4c1c9aab7be017682b43ddf12d609ff4b;p=cdsspec-compiler.git

stacktrace: remove usage of FILE in stacktrace

The original print_stacktrace() function required a FILE pointer, so we
manufactured one. We really should avoid the bugs that can come from the
allocation and buffering done with FILE, since this is used on error
paths.
---

diff --git a/common.cc b/common.cc
index 9cb7239..66b563a 100644
--- a/common.cc
+++ b/common.cc
@@ -22,9 +22,7 @@ int model_out = STDOUT_FILENO;
 void print_trace(void)
 {
 #ifdef CONFIG_STACKTRACE
-	FILE *file = fdopen(model_out, "w");
-	print_stacktrace(file);
-	fclose(file);
+	print_stacktrace(model_out);
 #else
 	void *array[MAX_TRACE_LEN];
 	char **strings;
diff --git a/stacktrace.h b/stacktrace.h
index 01d31d2..a3b0350 100644
--- a/stacktrace.h
+++ b/stacktrace.h
@@ -9,10 +9,13 @@
 #include <execinfo.h>
 #include <cxxabi.h>
 
-/** Print a demangled stack backtrace of the caller function to FILE* out. */
-static inline void print_stacktrace(FILE *out = stderr, unsigned int max_frames = 63)
+/**
+ * @brief Print a demangled stack backtrace of the caller function to file
+ * descriptor fd.
+ */
+static inline void print_stacktrace(int fd = STDERR_FILENO, unsigned int max_frames = 63)
 {
-	fprintf(out, "stack trace:\n");
+	dprintf(fd, "stack trace:\n");
 
 	// storage array for stack trace address data
 	void* addrlist[max_frames+1];
@@ -21,7 +24,7 @@ static inline void print_stacktrace(FILE *out = stderr, unsigned int max_frames
 	int addrlen = backtrace(addrlist, sizeof(addrlist) / sizeof(void*));
 
 	if (addrlen == 0) {
-		fprintf(out, "  <empty, possibly corrupt>\n");
+		dprintf(fd, "  <empty, possibly corrupt>\n");
 		return;
 	}
 
@@ -65,17 +68,17 @@ static inline void print_stacktrace(FILE *out = stderr, unsigned int max_frames
 					funcname, &funcnamesize, &status);
 			if (status == 0) {
 				funcname = ret; // use possibly realloc()-ed string
-				fprintf(out, "  %s : %s+%s\n",
+				dprintf(fd, "  %s : %s+%s\n",
 						symbollist[i], funcname, begin_offset);
 			} else {
 				// demangling failed. Output function name as a C function with
 				// no arguments.
-				fprintf(out, "  %s : %s()+%s\n",
+				dprintf(fd, "  %s : %s()+%s\n",
 						symbollist[i], begin_name, begin_offset);
 			}
 		} else {
 			// couldn't parse the line? print the whole line.
-			fprintf(out, "  %s\n", symbollist[i]);
+			dprintf(fd, "  %s\n", symbollist[i]);
 		}
 	}
 
@@ -83,4 +86,9 @@ static inline void print_stacktrace(FILE *out = stderr, unsigned int max_frames
 	free(symbollist);
 }
 
+static inline void print_stacktrace(FILE *out, unsigned int max_frames = 63)
+{
+	print_stacktrace(fileno(out), max_frames);
+}
+
 #endif // __STACKTRACE_H__