diff --git a/compiler-rt/lib/asan/asan_new_delete.cpp b/compiler-rt/lib/asan/asan_new_delete.cpp --- a/compiler-rt/lib/asan/asan_new_delete.cpp +++ b/compiler-rt/lib/asan/asan_new_delete.cpp @@ -45,7 +45,7 @@ #endif #undef COMMENT_EXPORT #else -#define CXX_OPERATOR_ATTRIBUTE INTERCEPTOR_ATTRIBUTE +#define CXX_OPERATOR_ATTRIBUTE INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE #endif using namespace __asan; diff --git a/compiler-rt/test/asan/TestCases/replaceable_new_delete.cpp b/compiler-rt/test/asan/TestCases/replaceable_new_delete.cpp new file mode 100644 --- /dev/null +++ b/compiler-rt/test/asan/TestCases/replaceable_new_delete.cpp @@ -0,0 +1,28 @@ +// Ensure that operator new/delete are still replaceable. + +// RUN: %clangxx %s -o %t -fsanitize=address -shared-libsan && not %run %t 2>&1 | FileCheck %s +// RUN: %clangxx %s -o %t -fsanitize=address -static-libsan && not %run %t 2>&1 | FileCheck %s + +#include +#include +#include + +void *operator new[](size_t size) { + fprintf(stderr, "replaced new\n"); + return malloc(size); +} + +void operator delete[](void *ptr) noexcept { + fprintf(stderr, "replaced delete\n"); + return free(ptr); +} + +int main(int argc, char **argv) { + // CHECK: replaced new + char *x = new char[5]; + // CHECK: replaced delete + delete[] x; + // CHECK: ERROR: AddressSanitizer + *x = 13; + return 0; +}