From c88ce270afe17bf35376a89c8b929eee93764e07 Mon Sep 17 00:00:00 2001 From: Matt Morehouse Date: Wed, 2 Oct 2019 20:13:21 +0000 Subject: [sanitizer_common] Rename OnPrint to __sanitizer_on_print. Summary: https://reviews.llvm.org/D28596 exposed OnPrint in the global namespace, which can cause collisions with user-defined OnPrint() functions. Reviewers: vitalybuka, dvyukov Reviewed By: vitalybuka, dvyukov Subscribers: llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D67987 git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@373518 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/sanitizer_common/sanitizer_printf.cpp | 8 +++++++- test/sanitizer_common/TestCases/onprint.cpp | 31 +++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 test/sanitizer_common/TestCases/onprint.cpp diff --git a/lib/sanitizer_common/sanitizer_printf.cpp b/lib/sanitizer_common/sanitizer_printf.cpp index 9d1c54478..7063de257 100644 --- a/lib/sanitizer_common/sanitizer_printf.cpp +++ b/lib/sanitizer_common/sanitizer_printf.cpp @@ -229,15 +229,21 @@ void SetPrintfAndReportCallback(void (*callback)(const char *)) { // Can be overriden in frontend. #if SANITIZER_GO && defined(TSAN_EXTERNAL_HOOKS) // Implementation must be defined in frontend. +// TODO(morehouse): Remove OnPrint after migrating Go to __sanitizer_on_print. extern "C" void OnPrint(const char *str); +extern "C" void __sanitizer_on_print(const char *str); #else -SANITIZER_INTERFACE_WEAK_DEF(void, OnPrint, const char *str) { +SANITIZER_INTERFACE_WEAK_DEF(void, __sanitizer_on_print, const char *str) { (void)str; } #endif static void CallPrintfAndReportCallback(const char *str) { +#if SANITIZER_GO && defined(TSAN_EXTERNAL_HOOKS) + // TODO(morehouse): Remove OnPrint after migrating Go to __sanitizer_on_print. OnPrint(str); +#endif + __sanitizer_on_print(str); if (PrintfAndReportCallback) PrintfAndReportCallback(str); } diff --git a/test/sanitizer_common/TestCases/onprint.cpp b/test/sanitizer_common/TestCases/onprint.cpp new file mode 100644 index 000000000..4b3f31e7b --- /dev/null +++ b/test/sanitizer_common/TestCases/onprint.cpp @@ -0,0 +1,31 @@ +// Checks that the __sanitizer_on_print hook gets the exact same sanitizer +// report as what is printed to stderr. +// +// RUN: %clangxx %s -o %t +// RUN: %run %t %t-onprint.txt 2>%t-stderr.txt || true +// RUN: diff %t-onprint.txt %t-stderr.txt + +#include +#include +#include + +FILE *f; +volatile void *buf; +volatile char sink; + +extern "C" void __sanitizer_on_print(const char *str) { + fprintf(f, "%s", str); + fflush(f); +} + +int main(int argc, char *argv[]) { + assert(argc >= 2); + f = fopen(argv[1], "w"); + + // Use-after-free to trigger ASan/TSan reports. + void *ptr = malloc(1); + buf = ptr; + free(ptr); + sink = *static_cast(ptr); + return 0; +} -- cgit v1.2.1