Apple's dynamic linker won't weak-def_coalesce from a file unless there is at least one weak symbol in the compilation unit so local __ubsan_on_report never has the chance to override the weak one even though the dynamic linker may see it first. This works around the issue by adding an unused weak symbol. (Amended: Remove excessive clang-format artifacts) rdar://95244261 Differential Revision: https://reviews.llvm.org/D127929
59 lines
1.4 KiB
C++
59 lines
1.4 KiB
C++
// RUN: %clangxx_asan -O0 %s -o %t && not %run %t 2>&1 | FileCheck %s
|
|
|
|
#include <sanitizer/asan_interface.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
// FIXME: Doesn't work with DLLs
|
|
// XFAIL: win32-dynamic-asan
|
|
|
|
// If we use %p with MSVC, it comes out all upper case. Use %08x to get
|
|
// lowercase hex.
|
|
#ifdef _MSC_VER
|
|
# ifdef _WIN64
|
|
# define PTR_FMT "0x%08llx"
|
|
# else
|
|
# define PTR_FMT "0x%08x"
|
|
# endif
|
|
// Solaris libc omits the leading 0x.
|
|
#elif defined(__sun__) && defined(__svr4__)
|
|
# define PTR_FMT "0x%p"
|
|
#else
|
|
# define PTR_FMT "%p"
|
|
#endif
|
|
|
|
char *heap_ptr;
|
|
|
|
int main() {
|
|
// Disable stderr buffering. Needed on Windows.
|
|
setvbuf(stderr, NULL, _IONBF, 0);
|
|
|
|
heap_ptr = (char *)malloc(10);
|
|
fprintf(stderr, "heap_ptr: " PTR_FMT "\n", heap_ptr);
|
|
// CHECK: heap_ptr: 0x[[ADDR:[0-9a-f]+]]
|
|
|
|
free(heap_ptr);
|
|
free(heap_ptr); // BOOM
|
|
return 0;
|
|
}
|
|
|
|
// Required for dyld macOS 12.0+
|
|
#if (__APPLE__)
|
|
__attribute__((weak))
|
|
#endif
|
|
extern "C" void
|
|
__asan_on_error() {
|
|
int present = __asan_report_present();
|
|
void *addr = __asan_get_report_address();
|
|
const char *description = __asan_get_report_description();
|
|
|
|
fprintf(stderr, "%s\n", (present == 1) ? "report present" : "");
|
|
// CHECK: report present
|
|
fprintf(stderr, "addr: " PTR_FMT "\n", addr);
|
|
// CHECK: addr: {{0x0*}}[[ADDR]]
|
|
fprintf(stderr, "description: %s\n", description);
|
|
// CHECK: description: double-free
|
|
}
|
|
|
|
// CHECK: AddressSanitizer: attempting double-free on {{0x0*}}[[ADDR]] in thread T0
|