From a96c4dc70efa6e45b27640cdd9812e0817c9a75d Mon Sep 17 00:00:00 2001 From: Alexey Samsonov Date: Fri, 1 Nov 2013 00:19:46 +0000 Subject: Consistently use StackTrace::PrintStack in ASan, LSan and MSan git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@193834 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/asan/asan_stack.cc | 5 ----- lib/lsan/lsan_common.cc | 1 - lib/msan/msan_report.cc | 13 ++++--------- lib/sanitizer_common/sanitizer_stacktrace.cc | 6 ++++++ lib/sanitizer_common/sanitizer_stacktrace.h | 1 + 5 files changed, 11 insertions(+), 15 deletions(-) diff --git a/lib/asan/asan_stack.cc b/lib/asan/asan_stack.cc index 7fa9e05a..0bc5a5f2 100644 --- a/lib/asan/asan_stack.cc +++ b/lib/asan/asan_stack.cc @@ -25,12 +25,7 @@ static bool MaybeCallAsanSymbolize(const void *pc, char *out_buffer, } void PrintStack(const uptr *trace, uptr size) { - if (!trace) { - Printf("\n\n"); - return; - } StackTrace::PrintStack(trace, size, MaybeCallAsanSymbolize); - Printf("\n"); } void PrintStack(StackTrace *stack) { diff --git a/lib/lsan/lsan_common.cc b/lib/lsan/lsan_common.cc index e305c0e2..cfa9db0b 100644 --- a/lib/lsan/lsan_common.cc +++ b/lib/lsan/lsan_common.cc @@ -492,7 +492,6 @@ void LeakReport::PrintLargest(uptr num_leaks_to_print) { leaks_[i].total_size, leaks_[i].hit_count); Printf("%s", d.End()); PrintStackTraceById(leaks_[i].stack_trace_id); - Printf("\n"); leaks_printed++; if (leaks_printed == num_leaks_to_print) break; } diff --git a/lib/msan/msan_report.cc b/lib/msan/msan_report.cc index bb591ebd..524e9752 100644 --- a/lib/msan/msan_report.cc +++ b/lib/msan/msan_report.cc @@ -34,11 +34,6 @@ class Decorator: private __sanitizer::AnsiColorDecorator { const char *End() { return Default(); } }; -static void PrintStack(const uptr *trace, uptr size) { - StackTrace::PrintStack(trace, size); - Printf("\n"); -} - static void DescribeOrigin(u32 origin) { Decorator d; if (common_flags()->verbosity) @@ -60,14 +55,14 @@ static void DescribeOrigin(u32 origin) { // For some reason function address in LLVM IR is 1 less then the address // of the first instruction. pc += 1; - PrintStack(&pc, 1); + StackTrace::PrintStack(&pc, 1); } } else { uptr size = 0; const uptr *trace = StackDepotGet(origin, &size); Printf(" %sUninitialized value was created by a heap allocation%s\n", d.Origin(), d.End()); - PrintStack(trace, size); + StackTrace::PrintStack(trace, size); } } @@ -88,7 +83,7 @@ void ReportUMR(StackTrace *stack, u32 origin) { Printf("%s", d.Warning()); Report(" WARNING: MemorySanitizer: use-of-uninitialized-value\n"); Printf("%s", d.End()); - PrintStack(stack->trace, stack->size); + StackTrace::PrintStack(stack->trace, stack->size); if (origin) { DescribeOrigin(origin); } @@ -99,7 +94,7 @@ void ReportExpectedUMRNotFound(StackTrace *stack) { SpinMutexLock l(&CommonSanitizerReportMutex); Printf(" WARNING: Expected use of uninitialized value not found\n"); - PrintStack(stack->trace, stack->size); + StackTrace::PrintStack(stack->trace, stack->size); } void ReportAtExitStatistics() { diff --git a/lib/sanitizer_common/sanitizer_stacktrace.cc b/lib/sanitizer_common/sanitizer_stacktrace.cc index 70209f25..d01e26b0 100644 --- a/lib/sanitizer_common/sanitizer_stacktrace.cc +++ b/lib/sanitizer_common/sanitizer_stacktrace.cc @@ -40,6 +40,10 @@ static void PrintStackFramePrefix(uptr frame_num, uptr pc) { void StackTrace::PrintStack(const uptr *addr, uptr size, SymbolizeCallback symbolize_callback) { + if (addr == 0) { + Printf("\n\n"); + return; + } MemoryMappingLayout proc_maps(/*cache_enabled*/true); InternalScopedBuffer buff(GetPageSizeCached() * 2); InternalScopedBuffer addr_frames(64); @@ -100,6 +104,8 @@ void StackTrace::PrintStack(const uptr *addr, uptr size, frame_num++; } } + // Always print a trailing empty line after stack trace. + Printf("\n"); } uptr StackTrace::GetCurrentPc() { diff --git a/lib/sanitizer_common/sanitizer_stacktrace.h b/lib/sanitizer_common/sanitizer_stacktrace.h index e66e2a9b..8c55397f 100644 --- a/lib/sanitizer_common/sanitizer_stacktrace.h +++ b/lib/sanitizer_common/sanitizer_stacktrace.h @@ -34,6 +34,7 @@ struct StackTrace { uptr size; uptr trace[kStackTraceMax]; + // Prints a symbolized stacktrace, followed by an empty line. static void PrintStack(const uptr *addr, uptr size, SymbolizeCallback symbolize_callback = 0); -- cgit v1.2.3