2222#if  HWASAN_REPLACE_OPERATORS_NEW_AND_DELETE
2323
2424//  TODO(alekseys): throw std::bad_alloc instead of dying on OOM.
25- #  define  OPERATOR_NEW_BODY ( nothrow )          \
25+ #  define  OPERATOR_NEW_BODY                    \
2626    GET_MALLOC_STACK_TRACE;                  \
2727    void  *res = hwasan_malloc(size, &stack); \
28-     if  (!nothrow &&  UNLIKELY(!res))          \
28+     if  (UNLIKELY(!res))                       \
2929      ReportOutOfMemory (size, &stack);       \
3030    return  res
31- #  define  OPERATOR_NEW_ALIGN_BODY (nothrow )                               \
31+ #  define  OPERATOR_NEW_BODY_NOTHROW  \
32+     GET_MALLOC_STACK_TRACE;         \
33+     return  hwasan_malloc(size, &stack)
34+ #  define  OPERATOR_NEW_BODY_ARRAY             \
35+     GET_MALLOC_STACK_TRACE;                  \
36+     void  *res = hwasan_malloc(size, &stack); \
37+     if  (UNLIKELY(!res))                      \
38+       ReportOutOfMemory (size, &stack);       \
39+     return  res
40+ #  define  OPERATOR_NEW_BODY_ARRAY_NOTHROW  \
41+     GET_MALLOC_STACK_TRACE;               \
42+     return  hwasan_malloc(size, &stack)
43+ #  define  OPERATOR_NEW_BODY_ALIGN                                         \
44+     GET_MALLOC_STACK_TRACE;                                              \
45+     void  *res = hwasan_memalign(static_cast <uptr>(align), size, &stack); \
46+     if  (UNLIKELY(!res))                                                  \
47+       ReportOutOfMemory (size, &stack);                                   \
48+     return  res
49+ #  define  OPERATOR_NEW_BODY_ALIGN_NOTHROW  \
50+     GET_MALLOC_STACK_TRACE;               \
51+     return  hwasan_memalign(static_cast <uptr>(align), size, &stack)
52+ #  define  OPERATOR_NEW_BODY_ALIGN_ARRAY                                   \
3253    GET_MALLOC_STACK_TRACE;                                              \
3354    void  *res = hwasan_memalign(static_cast <uptr>(align), size, &stack); \
34-     if  (!nothrow &&  UNLIKELY(!res))                                      \
55+     if  (UNLIKELY(!res))                                                   \
3556      ReportOutOfMemory (size, &stack);                                   \
3657    return  res
58+ #  define  OPERATOR_NEW_BODY_ALIGN_ARRAY_NOTHROW  \
59+     GET_MALLOC_STACK_TRACE;                     \
60+     return  hwasan_memalign(static_cast <uptr>(align), size, &stack)
3761
3862#  define  OPERATOR_DELETE_BODY  \
3963    GET_MALLOC_STACK_TRACE;    \
4064    if  (ptr)                   \
4165    hwasan_free (ptr, &stack)
66+ #  define  OPERATOR_DELETE_BODY_ARRAY  \
67+     GET_MALLOC_STACK_TRACE;          \
68+     if  (ptr)                         \
69+     hwasan_free (ptr, &stack)
70+ #  define  OPERATOR_DELETE_BODY_ALIGN  \
71+     GET_MALLOC_STACK_TRACE;          \
72+     if  (ptr)                         \
73+     hwasan_free (ptr, &stack)
74+ #  define  OPERATOR_DELETE_BODY_ALIGN_ARRAY  \
75+     GET_MALLOC_STACK_TRACE;                \
76+     if  (ptr)                               \
77+     hwasan_free (ptr, &stack)
78+ #  define  OPERATOR_DELETE_BODY_SIZE  \
79+     GET_MALLOC_STACK_TRACE;         \
80+     if  (ptr)                        \
81+     hwasan_free (ptr, &stack)
82+ #  define  OPERATOR_DELETE_BODY_SIZE_ARRAY  \
83+     GET_MALLOC_STACK_TRACE;               \
84+     if  (ptr)                              \
85+     hwasan_free (ptr, &stack)
86+ #  define  OPERATOR_DELETE_BODY_SIZE_ALIGN  \
87+     GET_MALLOC_STACK_TRACE;               \
88+     if  (ptr)                              \
89+     hwasan_free (ptr, &stack)
90+ #  define  OPERATOR_DELETE_BODY_SIZE_ALIGN_ARRAY  \
91+     GET_MALLOC_STACK_TRACE;                     \
92+     if  (ptr)                                    \
93+     hwasan_free (ptr, &stack)
4294
4395#elif  defined(__ANDROID__)
4496
4597//  We don't actually want to intercept operator new and delete on Android, but
4698//  since we previously released a runtime that intercepted these functions,
4799//  removing the interceptors would break ABI. Therefore we simply forward to
48100//  malloc and free.
49- #  define  OPERATOR_NEW_BODY (nothrow ) return  malloc(size)
101+ #  define  OPERATOR_NEW_BODY  return  malloc(size)
102+ #  define  OPERATOR_NEW_BODY_NOTHROW  return  malloc(size)
103+ #  define  OPERATOR_NEW_BODY_ARRAY  return  malloc(size)
104+ #  define  OPERATOR_NEW_BODY_ARRAY_NOTHROW  return  malloc(size)
50105#  define  OPERATOR_DELETE_BODY  free (ptr)
106+ #  define  OPERATOR_DELETE_BODY_ARRAY  free (ptr)
107+ #  define  OPERATOR_DELETE_BODY_SIZE  free (ptr)
108+ #  define  OPERATOR_DELETE_BODY_SIZE_ARRAY  free (ptr)
51109
52110#endif
53111
@@ -61,19 +119,19 @@ struct nothrow_t {};
61119}  //  namespace std
62120
63121INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void  *operator  new (size_t  size) {
64-   OPERATOR_NEW_BODY ( false   /* nothrow */ ) ;
122+   OPERATOR_NEW_BODY;
65123}
66124INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void  *operator  new [](
67125    size_t  size) {
68-   OPERATOR_NEW_BODY ( false   /* nothrow */ ) ;
126+   OPERATOR_NEW_BODY_ARRAY ;
69127}
70128INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void  *operator  new (
71129    size_t  size, std::nothrow_t  const  &) {
72-   OPERATOR_NEW_BODY ( true   /* nothrow */ ) ;
130+   OPERATOR_NEW_BODY_NOTHROW ;
73131}
74132INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void  *operator  new [](
75133    size_t  size, std::nothrow_t  const  &) {
76-   OPERATOR_NEW_BODY ( true   /* nothrow */ ) ;
134+   OPERATOR_NEW_BODY_ARRAY_NOTHROW ;
77135}
78136
79137INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void  operator  delete (
@@ -82,81 +140,81 @@ INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete(
82140}
83141INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void  operator  delete[] (
84142    void  *ptr) NOEXCEPT {
85-   OPERATOR_DELETE_BODY ;
143+   OPERATOR_DELETE_BODY_ARRAY ;
86144}
87145INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void  operator  delete (
88146    void  *ptr, std::nothrow_t  const  &) {
89147  OPERATOR_DELETE_BODY;
90148}
91149INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void  operator  delete[] (
92150    void  *ptr, std::nothrow_t  const  &) {
93-   OPERATOR_DELETE_BODY ;
151+   OPERATOR_DELETE_BODY_ARRAY ;
94152}
95153INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void  operator  delete (
96154    void  *ptr, size_t ) NOEXCEPT {
97-   OPERATOR_DELETE_BODY ;
155+   OPERATOR_DELETE_BODY_SIZE ;
98156}
99157INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void  operator  delete[] (
100158    void  *ptr, size_t ) NOEXCEPT {
101-   OPERATOR_DELETE_BODY ;
159+   OPERATOR_DELETE_BODY_SIZE_ARRAY ;
102160}
103161
104162#endif   //  OPERATOR_NEW_BODY
105163
106- #ifdef  OPERATOR_NEW_ALIGN_BODY 
164+ #ifdef  OPERATOR_NEW_BODY_ALIGN 
107165
108166namespace  std  {
109167enum  class  align_val_t  : size_t  {};
110168}  //  namespace std
111169
112170INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void  *operator  new (
113171    size_t  size, std::align_val_t  align) {
114-   OPERATOR_NEW_ALIGN_BODY ( false   /* nothrow */ ) ;
172+   OPERATOR_NEW_BODY_ALIGN ;
115173}
116174INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void  *operator  new [](
117175    size_t  size, std::align_val_t  align) {
118-   OPERATOR_NEW_ALIGN_BODY ( false   /* nothrow */ ) ;
176+   OPERATOR_NEW_BODY_ALIGN_ARRAY ;
119177}
120178INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void  *operator  new (
121179    size_t  size, std::align_val_t  align, std::nothrow_t  const  &) {
122-   OPERATOR_NEW_ALIGN_BODY ( true   /* nothrow */ ) ;
180+   OPERATOR_NEW_BODY_ALIGN_NOTHROW ;
123181}
124182INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void  *operator  new [](
125183    size_t  size, std::align_val_t  align, std::nothrow_t  const  &) {
126-   OPERATOR_NEW_ALIGN_BODY ( true   /* nothrow */ ) ;
184+   OPERATOR_NEW_BODY_ALIGN_ARRAY_NOTHROW ;
127185}
128186
129187INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void  operator  delete (
130188    void  *ptr, std::align_val_t  align) NOEXCEPT {
131-   OPERATOR_DELETE_BODY ;
189+   OPERATOR_DELETE_BODY_ALIGN ;
132190}
133191INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void  operator  delete[] (
134192    void  *ptr, std::align_val_t ) NOEXCEPT {
135-   OPERATOR_DELETE_BODY ;
193+   OPERATOR_DELETE_BODY_ALIGN_ARRAY ;
136194}
137195INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void  operator  delete (
138196    void  *ptr, std::align_val_t , std::nothrow_t  const  &) NOEXCEPT {
139-   OPERATOR_DELETE_BODY ;
197+   OPERATOR_DELETE_BODY_ALIGN ;
140198}
141199INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void  operator  delete[] (
142200    void  *ptr, std::align_val_t , std::nothrow_t  const  &) NOEXCEPT {
143-   OPERATOR_DELETE_BODY ;
201+   OPERATOR_DELETE_BODY_ALIGN_ARRAY ;
144202}
145203INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void  operator  delete (
146204    void  *ptr, size_t , std::align_val_t ) NOEXCEPT {
147-   OPERATOR_DELETE_BODY ;
205+   OPERATOR_DELETE_BODY_SIZE_ALIGN ;
148206}
149207INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void  operator  delete[] (
150208    void  *ptr, size_t , std::align_val_t ) NOEXCEPT {
151-   OPERATOR_DELETE_BODY ;
209+   OPERATOR_DELETE_BODY_SIZE_ALIGN_ARRAY ;
152210}
153211INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void  operator  delete (
154212    void  *ptr, size_t , std::align_val_t , std::nothrow_t  const  &) NOEXCEPT {
155-   OPERATOR_DELETE_BODY ;
213+   OPERATOR_DELETE_BODY_SIZE_ALIGN ;
156214}
157215INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void  operator  delete[] (
158216    void  *ptr, size_t , std::align_val_t , std::nothrow_t  const  &) NOEXCEPT {
159-   OPERATOR_DELETE_BODY ;
217+   OPERATOR_DELETE_BODY_SIZE_ALIGN_ARRAY ;
160218}
161219
162- #endif   //  OPERATOR_NEW_ALIGN_BODY 
220+ #endif   //  OPERATOR_NEW_BODY_ALIGN 
0 commit comments