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