From: Brian Norris Date: Thu, 18 Apr 2013 00:10:20 +0000 (-0700) Subject: stacktrace: remove usage of FILE in stacktrace X-Git-Url: http://plrg.eecs.uci.edu/git/?p=c11tester.git;a=commitdiff_plain;h=0a99a3c4c1c9aab7be017682b43ddf12d609ff4b 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 9cb7239d..66b563a8 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 01d31d2f..a3b03509 100644 --- a/stacktrace.h +++ b/stacktrace.h @@ -9,10 +9,13 @@ #include #include -/** 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, " \n"); + dprintf(fd, " \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__