From 9ea001401caa607dccbd974df0d44b13be63de20 Mon Sep 17 00:00:00 2001 From: Evgeniy Stepanov Date: Fri, 25 Jan 2019 02:05:25 +0000 Subject: [hwasan] Implement print_module_map flag. Reviewers: kcc, pcc Subscribers: kubamracek, llvm-commits Differential Revision: https://reviews.llvm.org/D57130 llvm-svn: 352150 --- compiler-rt/lib/hwasan/hwasan_linux.cc | 4 +-- compiler-rt/lib/hwasan/hwasan_report.cc | 16 +++++++---- .../test/hwasan/TestCases/print-module-map.c | 32 ++++++++++++++++++++++ 3 files changed, 45 insertions(+), 7 deletions(-) create mode 100644 compiler-rt/test/hwasan/TestCases/print-module-map.c diff --git a/compiler-rt/lib/hwasan/hwasan_linux.cc b/compiler-rt/lib/hwasan/hwasan_linux.cc index f4ef22fcf12..2a0aebbbe9e 100644 --- a/compiler-rt/lib/hwasan/hwasan_linux.cc +++ b/compiler-rt/lib/hwasan/hwasan_linux.cc @@ -218,6 +218,8 @@ bool MemIsApp(uptr p) { } static void HwasanAtExit(void) { + if (common_flags()->print_module_map) + DumpProcessMap(); if (flags()->print_stats && (flags()->atexit || hwasan_report_count > 0)) ReportStats(); if (hwasan_report_count > 0) { @@ -376,8 +378,6 @@ static void HandleTagMismatch(AccessInfo ai, uptr pc, uptr frame, GetStackTrace(stack, kStackTraceMax, pc, frame, uc, common_flags()->fast_unwind_on_fatal); - ++hwasan_report_count; - bool fatal = flags()->halt_on_error || !ai.recover; ReportTagMismatch(stack, ai.addr, ai.size, ai.is_store, fatal); } diff --git a/compiler-rt/lib/hwasan/hwasan_report.cc b/compiler-rt/lib/hwasan/hwasan_report.cc index 495e4555fcb..aad5e409560 100644 --- a/compiler-rt/lib/hwasan/hwasan_report.cc +++ b/compiler-rt/lib/hwasan/hwasan_report.cc @@ -34,15 +34,21 @@ class ScopedReport { ScopedReport(bool fatal = false) : error_message_(1), fatal(fatal) { BlockingMutexLock lock(&error_message_lock_); error_message_ptr_ = fatal ? &error_message_ : nullptr; + ++hwasan_report_count; } ~ScopedReport() { - BlockingMutexLock lock(&error_message_lock_); - if (fatal) { - SetAbortMessage(error_message_.data()); - Die(); + { + BlockingMutexLock lock(&error_message_lock_); + if (fatal) + SetAbortMessage(error_message_.data()); + error_message_ptr_ = nullptr; } - error_message_ptr_ = nullptr; + if (common_flags()->print_module_map >= 2 || + (fatal && common_flags()->print_module_map)) + DumpProcessMap(); + if (fatal) + Die(); } static void MaybeAppendToErrorMessage(const char *msg) { diff --git a/compiler-rt/test/hwasan/TestCases/print-module-map.c b/compiler-rt/test/hwasan/TestCases/print-module-map.c new file mode 100644 index 00000000000..bb94aa11666 --- /dev/null +++ b/compiler-rt/test/hwasan/TestCases/print-module-map.c @@ -0,0 +1,32 @@ +// RUN: %clang_hwasan %s -o %t && %env_hwasan_opts=print_module_map=1 %run %t 2>&1 | FileCheck %s --check-prefixes=EXIT,NOMORE +// RUN: %clang_hwasan %s -DBUG -o %t && %env_hwasan_opts=print_module_map=1 not %run %t 2>&1 | FileCheck %s --check-prefixes=EXIT,NOMORE +// RUN: %clang_hwasan %s -DBUG -fsanitize-recover=hwaddress -o %t && %env_hwasan_opts=print_module_map=1,halt_on_error=0 not %run %t 2>&1 | FileCheck %s --check-prefixes=EXIT,NOMORE +// RUN: %clang_hwasan %s -DBUG -fsanitize-recover=hwaddress -o %t && %env_hwasan_opts=print_module_map=2,halt_on_error=0 not %run %t 2>&1 | FileCheck %s --check-prefixes=BUG1,BUG2,EXIT,NOMORE + +#include +#include +#include + +int main() { + __hwasan_enable_allocator_tagging(); +#ifdef BUG + char * volatile x = (char*)malloc(40); + free(x); + free(x); + free(x); +#endif + __hwasan_disable_allocator_tagging(); + // BUG1: Process memory map follows: + // BUG1: print-module-map + // BUG1: End of process memory map. + + // BUG2: Process memory map follows: + // BUG2: print-module-map + // BUG2: End of process memory map. + + // EXIT: Process memory map follows: + // EXIT: print-module-map + // EXIT: End of process memory map. + + // NOMORE-NOT: Process memory map follows: +} -- cgit v1.2.1