Add C++17 aligned new/delete entrypoints to libasan

Konstantin Serebryany via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 19 07:29:42 PDT 2016


I would appreciate if you could use http://llvm.org/docs/Phabricator.html
It's a tiny extra step for you and a big help for me.
Also, don't CC Alexey any more -- he has moved to another project. (And CC
me in Phabricator as 'kcc')

On Mon, Sep 19, 2016 at 7:17 AM, Jakub Jelinek <jakub at redhat.com> wrote:

> Hi!
>
> This is the shorter version of http://gcc.gnu.org/PR77567 changes, which
> just adds the C++17 operator new/delete/new[]/delete[] entrypoints with
> std::align_val_t arguments, but doesn't verify the C++17 requirement that
> non-std::align_val_t allocation isn't mixed with std::align_val_t
> deallocation and vice versa, because there are no bits left right now in
> the
> libasan structures to record this, but at least it complains if you
> malloc/memalign and deallocate using delete operator with std::align_val_t,
> etc.
>
> --- compiler-rt/lib/asan/asan_new_delete.cc.jj  2016-05-17
> 10:47:05.000000000 +0200
> +++ compiler-rt/lib/asan/asan_new_delete.cc     2016-09-13
> 17:44:13.428306595 +0200
> @@ -45,17 +45,30 @@
>
>  using namespace __asan;  // NOLINT
>
> +// FreeBSD prior v9.2 have wrong definition of 'size_t'.
> +// http://svnweb.freebsd.org/base?view=revision&revision=232261
> +#if SANITIZER_FREEBSD && SANITIZER_WORDSIZE == 32
> +#include <sys/param.h>
> +#if __FreeBSD_version <= 902001  // v9.2
> +#define size_t unsigned
> +#endif  // __FreeBSD_version
> +#endif  // SANITIZER_FREEBSD && SANITIZER_WORDSIZE == 32
> +
>  // This code has issues on OSX.
>  // See https://github.com/google/sanitizers/issues/131.
>
> -// Fake std::nothrow_t to avoid including <new>.
> +// Fake std::nothrow_t and std::align_val_t to avoid including <new>.
>  namespace std {
>  struct nothrow_t {};
> +enum class align_val_t: size_t {};
>  }  // namespace std
>
>  #define OPERATOR_NEW_BODY(type) \
>    GET_STACK_TRACE_MALLOC;\
>    return asan_memalign(0, size, &stack, type);
> +#define OPERATOR_NEW_BODY_ALIGN(type) \
> +  GET_STACK_TRACE_MALLOC;\
> +  return asan_memalign((uptr)align, size, &stack, type);
>
>  // On OS X it's not enough to just provide our own 'operator new' and
>  // 'operator delete' implementations, because they're going to be in the
> @@ -65,15 +78,6 @@ struct nothrow_t {};
>  // To make sure that C++ allocation/deallocation operators are overridden
> on
>  // OS X we need to intercept them using their mangled names.
>  #if !SANITIZER_MAC
> -// FreeBSD prior v9.2 have wrong definition of 'size_t'.
> -// http://svnweb.freebsd.org/base?view=revision&revision=232261
> -#if SANITIZER_FREEBSD && SANITIZER_WORDSIZE == 32
> -#include <sys/param.h>
> -#if __FreeBSD_version <= 902001  // v9.2
> -#define size_t unsigned
> -#endif  // __FreeBSD_version
> -#endif  // SANITIZER_FREEBSD && SANITIZER_WORDSIZE == 32
> -
>  CXX_OPERATOR_ATTRIBUTE
>  void *operator new(size_t size) { OPERATOR_NEW_BODY(FROM_NEW); }
>  CXX_OPERATOR_ATTRIBUTE
> @@ -84,6 +88,18 @@ void *operator new(size_t size, std::not
>  CXX_OPERATOR_ATTRIBUTE
>  void *operator new[](size_t size, std::nothrow_t const&)
>  { OPERATOR_NEW_BODY(FROM_NEW_BR); }
> +CXX_OPERATOR_ATTRIBUTE
> +void *operator new(size_t size, std::align_val_t align)
> +{ OPERATOR_NEW_BODY_ALIGN(FROM_NEW); }
> +CXX_OPERATOR_ATTRIBUTE
> +void *operator new[](size_t size, std::align_val_t align)
> +{ OPERATOR_NEW_BODY_ALIGN(FROM_NEW_BR); }
> +CXX_OPERATOR_ATTRIBUTE
> +void *operator new(size_t size, std::align_val_t align, std::nothrow_t
> const&)
> +{ OPERATOR_NEW_BODY_ALIGN(FROM_NEW); }
> +CXX_OPERATOR_ATTRIBUTE
> +void *operator new[](size_t size, std::align_val_t align, std::nothrow_t
> const&)
> +{ OPERATOR_NEW_BODY_ALIGN(FROM_NEW_BR); }
>
>  #else  // SANITIZER_MAC
>  INTERCEPTOR(void *, _Znwm, size_t size) {
> @@ -131,6 +147,32 @@ void operator delete[](void *ptr, size_t
>    GET_STACK_TRACE_FREE;
>    asan_sized_free(ptr, size, &stack, FROM_NEW_BR);
>  }
> +CXX_OPERATOR_ATTRIBUTE
> +void operator delete(void *ptr, std::align_val_t) NOEXCEPT {
> +  OPERATOR_DELETE_BODY(FROM_NEW);
> +}
> +CXX_OPERATOR_ATTRIBUTE
> +void operator delete[](void *ptr, std::align_val_t) NOEXCEPT {
> +  OPERATOR_DELETE_BODY(FROM_NEW_BR);
> +}
> +CXX_OPERATOR_ATTRIBUTE
> +void operator delete(void *ptr, std::align_val_t, std::nothrow_t const&) {
> +  OPERATOR_DELETE_BODY(FROM_NEW);
> +}
> +CXX_OPERATOR_ATTRIBUTE
> +void operator delete[](void *ptr, std::align_val_t, std::nothrow_t
> const&) {
> +  OPERATOR_DELETE_BODY(FROM_NEW_BR);
> +}
> +CXX_OPERATOR_ATTRIBUTE
> +void operator delete(void *ptr, size_t size, std::align_val_t) NOEXCEPT {
> +  GET_STACK_TRACE_FREE;
> +  asan_sized_free(ptr, size, &stack, FROM_NEW);
> +}
> +CXX_OPERATOR_ATTRIBUTE
> +void operator delete[](void *ptr, size_t size, std::align_val_t) NOEXCEPT
> {
> +  GET_STACK_TRACE_FREE;
> +  asan_sized_free(ptr, size, &stack, FROM_NEW_BR);
> +}
>
>  #else  // SANITIZER_MAC
>  INTERCEPTOR(void, _ZdlPv, void *ptr) {
>
>         Jakub
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160919/73be24d4/attachment-0001.html>


More information about the llvm-commits mailing list