[compiler-rt] hwasan: refactor new/delete interceptor macros (PR #146698)

via llvm-commits llvm-commits at lists.llvm.org
Wed Jul 2 07:05:44 PDT 2025


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-compiler-rt-sanitizer

Author: Justin King (jcking)

<details>
<summary>Changes</summary>

Same as #<!-- -->146696 but for #<!-- -->145357.

---
Full diff: https://github.com/llvm/llvm-project/pull/146698.diff


1 Files Affected:

- (modified) compiler-rt/lib/hwasan/hwasan_new_delete.cpp (+87-29) 


``````````diff
diff --git a/compiler-rt/lib/hwasan/hwasan_new_delete.cpp b/compiler-rt/lib/hwasan/hwasan_new_delete.cpp
index f0fd3726ef1b1..18dc9ce2051a3 100644
--- a/compiler-rt/lib/hwasan/hwasan_new_delete.cpp
+++ b/compiler-rt/lib/hwasan/hwasan_new_delete.cpp
@@ -22,23 +22,75 @@
 #if HWASAN_REPLACE_OPERATORS_NEW_AND_DELETE
 
 // TODO(alekseys): throw std::bad_alloc instead of dying on OOM.
-#  define OPERATOR_NEW_BODY(nothrow)         \
+#  define OPERATOR_NEW_BODY                  \
     GET_MALLOC_STACK_TRACE;                  \
     void *res = hwasan_malloc(size, &stack); \
-    if (!nothrow && UNLIKELY(!res))          \
+    if (UNLIKELY(!res))                      \
       ReportOutOfMemory(size, &stack);       \
-    return res
-#  define OPERATOR_NEW_ALIGN_BODY(nothrow)                               \
+    return res;
+#  define OPERATOR_NEW_BODY_NOTHROW \
+    GET_MALLOC_STACK_TRACE;         \
+    return hwasan_malloc(size, &stack);
+#  define OPERATOR_NEW_BODY_ARRAY            \
+    GET_MALLOC_STACK_TRACE;                  \
+    void *res = hwasan_malloc(size, &stack); \
+    if (UNLIKELY(!res))                      \
+      ReportOutOfMemory(size, &stack);       \
+    return res;
+#  define OPERATOR_NEW_BODY_ARRAY_NOTHROW \
+    GET_MALLOC_STACK_TRACE;               \
+    return hwasan_malloc(size, &stack);
+#  define OPERATOR_NEW_BODY_ALIGN                                        \
     GET_MALLOC_STACK_TRACE;                                              \
     void *res = hwasan_memalign(static_cast<uptr>(align), size, &stack); \
-    if (!nothrow && UNLIKELY(!res))                                      \
+    if (UNLIKELY(!res))                                                  \
       ReportOutOfMemory(size, &stack);                                   \
-    return res
+    return res;
+#  define OPERATOR_NEW_BODY_ALIGN_NOTHROW \
+    GET_MALLOC_STACK_TRACE;               \
+    return hwasan_memalign(static_cast<uptr>(align), size, &stack);
+#  define OPERATOR_NEW_BODY_ALIGN_ARRAY                                  \
+    GET_MALLOC_STACK_TRACE;                                              \
+    void *res = hwasan_memalign(static_cast<uptr>(align), size, &stack); \
+    if (UNLIKELY(!res))                                                  \
+      ReportOutOfMemory(size, &stack);                                   \
+    return res;
+#  define OPERATOR_NEW_BODY_ALIGN_ARRAY_NOTHROW \
+    GET_MALLOC_STACK_TRACE;                     \
+    return hwasan_memalign(static_cast<uptr>(align), size, &stack);
 
 #  define OPERATOR_DELETE_BODY \
     GET_MALLOC_STACK_TRACE;    \
     if (ptr)                   \
-    hwasan_free(ptr, &stack)
+      hwasan_free(ptr, &stack);
+#  define OPERATOR_DELETE_BODY_ARRAY \
+    GET_MALLOC_STACK_TRACE;          \
+    if (ptr)                         \
+      hwasan_free(ptr, &stack);
+#  define OPERATOR_DELETE_BODY_ALIGN \
+    GET_MALLOC_STACK_TRACE;          \
+    if (ptr)                         \
+      hwasan_free(ptr, &stack);
+#  define OPERATOR_DELETE_BODY_ALIGN_ARRAY \
+    GET_MALLOC_STACK_TRACE;                \
+    if (ptr)                               \
+      hwasan_free(ptr, &stack);
+#  define OPERATOR_DELETE_BODY_SIZE \
+    GET_MALLOC_STACK_TRACE;         \
+    if (ptr)                        \
+      hwasan_free(ptr, &stack);
+#  define OPERATOR_DELETE_BODY_SIZE_ARRAY \
+    GET_MALLOC_STACK_TRACE;               \
+    if (ptr)                              \
+      hwasan_free(ptr, &stack);
+#  define OPERATOR_DELETE_BODY_SIZE_ALIGN \
+    GET_MALLOC_STACK_TRACE;               \
+    if (ptr)                              \
+      hwasan_free(ptr, &stack);
+#  define OPERATOR_DELETE_BODY_SIZE_ALIGN_ARRAY \
+    GET_MALLOC_STACK_TRACE;                     \
+    if (ptr)                                    \
+      hwasan_free(ptr, &stack);
 
 #elif defined(__ANDROID__)
 
@@ -46,8 +98,14 @@
 // since we previously released a runtime that intercepted these functions,
 // removing the interceptors would break ABI. Therefore we simply forward to
 // malloc and free.
-#  define OPERATOR_NEW_BODY(nothrow) return malloc(size)
+#  define OPERATOR_NEW_BODY return malloc(size)
+#  define OPERATOR_NEW_BODY_NOTHROW return malloc(size)
+#  define OPERATOR_NEW_BODY_ARRAY return malloc(size)
+#  define OPERATOR_NEW_BODY_ARRAY_NOTHROW return malloc(size)
 #  define OPERATOR_DELETE_BODY free(ptr)
+#  define OPERATOR_DELETE_BODY_ARRAY free(ptr)
+#  define OPERATOR_DELETE_BODY_SIZE free(ptr)
+#  define OPERATOR_DELETE_BODY_SIZE_ARRAY free(ptr)
 
 #endif
 
@@ -61,19 +119,19 @@ struct nothrow_t {};
 }  // namespace std
 
 INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void *operator new(size_t size) {
-  OPERATOR_NEW_BODY(false /*nothrow*/);
+  OPERATOR_NEW_BODY;
 }
 INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void *operator new[](
     size_t size) {
-  OPERATOR_NEW_BODY(false /*nothrow*/);
+  OPERATOR_NEW_BODY_ARRAY;
 }
 INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void *operator new(
     size_t size, std::nothrow_t const &) {
-  OPERATOR_NEW_BODY(true /*nothrow*/);
+  OPERATOR_NEW_BODY_NOTHROW;
 }
 INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void *operator new[](
     size_t size, std::nothrow_t const &) {
-  OPERATOR_NEW_BODY(true /*nothrow*/);
+  OPERATOR_NEW_BODY_ARRAY_NOTHROW;
 }
 
 INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete(
@@ -82,7 +140,7 @@ INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete(
 }
 INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete[](
     void *ptr) NOEXCEPT {
-  OPERATOR_DELETE_BODY;
+  OPERATOR_DELETE_BODY_ARRAY;
 }
 INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete(
     void *ptr, std::nothrow_t const &) {
@@ -90,20 +148,20 @@ INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete(
 }
 INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete[](
     void *ptr, std::nothrow_t const &) {
-  OPERATOR_DELETE_BODY;
+  OPERATOR_DELETE_BODY_ARRAY;
 }
 INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete(
     void *ptr, size_t) NOEXCEPT {
-  OPERATOR_DELETE_BODY;
+  OPERATOR_DELETE_BODY_SIZE;
 }
 INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete[](
     void *ptr, size_t) NOEXCEPT {
-  OPERATOR_DELETE_BODY;
+  OPERATOR_DELETE_BODY_SIZE_ARRAY;
 }
 
 #endif  // OPERATOR_NEW_BODY
 
-#ifdef OPERATOR_NEW_ALIGN_BODY
+#ifdef OPERATOR_NEW_BODY_ALIGN
 
 namespace std {
 enum class align_val_t : size_t {};
@@ -111,52 +169,52 @@ enum class align_val_t : size_t {};
 
 INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void *operator new(
     size_t size, std::align_val_t align) {
-  OPERATOR_NEW_ALIGN_BODY(false /*nothrow*/);
+  OPERATOR_NEW_BODY_ALIGN;
 }
 INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void *operator new[](
     size_t size, std::align_val_t align) {
-  OPERATOR_NEW_ALIGN_BODY(false /*nothrow*/);
+  OPERATOR_NEW_BODY_ALIGN_ARRAY;
 }
 INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void *operator new(
     size_t size, std::align_val_t align, std::nothrow_t const &) {
-  OPERATOR_NEW_ALIGN_BODY(true /*nothrow*/);
+  OPERATOR_NEW_BODY_ALIGN_NOTHROW;
 }
 INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void *operator new[](
     size_t size, std::align_val_t align, std::nothrow_t const &) {
-  OPERATOR_NEW_ALIGN_BODY(true /*nothrow*/);
+  OPERATOR_NEW_BODY_ALIGN_ARRAY_NOTHROW;
 }
 
 INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete(
     void *ptr, std::align_val_t align) NOEXCEPT {
-  OPERATOR_DELETE_BODY;
+  OPERATOR_DELETE_BODY_ALIGN;
 }
 INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete[](
     void *ptr, std::align_val_t) NOEXCEPT {
-  OPERATOR_DELETE_BODY;
+  OPERATOR_DELETE_BODY_ALIGN_ARRAY;
 }
 INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete(
     void *ptr, std::align_val_t, std::nothrow_t const &) NOEXCEPT {
-  OPERATOR_DELETE_BODY;
+  OPERATOR_DELETE_BODY_ALIGN;
 }
 INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete[](
     void *ptr, std::align_val_t, std::nothrow_t const &) NOEXCEPT {
-  OPERATOR_DELETE_BODY;
+  OPERATOR_DELETE_BODY_ALIGN_ARRAY;
 }
 INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete(
     void *ptr, size_t, std::align_val_t) NOEXCEPT {
-  OPERATOR_DELETE_BODY;
+  OPERATOR_DELETE_BODY_SIZE_ALIGN;
 }
 INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete[](
     void *ptr, size_t, std::align_val_t) NOEXCEPT {
-  OPERATOR_DELETE_BODY;
+  OPERATOR_DELETE_BODY_SIZE_ALIGN_ARRAY;
 }
 INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete(
     void *ptr, size_t, std::align_val_t, std::nothrow_t const &) NOEXCEPT {
-  OPERATOR_DELETE_BODY;
+  OPERATOR_DELETE_BODY_SIZE_ALIGN;
 }
 INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete[](
     void *ptr, size_t, std::align_val_t, std::nothrow_t const &) NOEXCEPT {
-  OPERATOR_DELETE_BODY;
+  OPERATOR_DELETE_BODY_SIZE_ALIGN_ARRAY;
 }
 
 #endif  // OPERATOR_NEW_ALIGN_BODY

``````````

</details>


https://github.com/llvm/llvm-project/pull/146698


More information about the llvm-commits mailing list