Skip to content

Commit 22c9a78

Browse files
committed
Fix aliasing violation in Itanium and new ARM implementation
1 parent a4ae527 commit 22c9a78

File tree

1 file changed

+10
-8
lines changed

1 file changed

+10
-8
lines changed

libcxx/include/__memory/array_cookie.h

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -91,21 +91,23 @@ _LIBCPP_HIDE_FROM_ABI _LIBCPP_NO_SANITIZE("address") size_t __get_array_cookie([
9191

9292
#if defined(_LIBCPP_ABI_ITANIUM)
9393

94-
size_t const* __cookie = reinterpret_cast<size_t const*>(__ptr) - 1;
95-
return *__cookie;
94+
using _ArrayCookie = size_t;
95+
char const* __allocation_start = reinterpret_cast<char const*>(__ptr) - sizeof(_ArrayCookie);
96+
char __cookie[sizeof(_ArrayCookie)];
97+
__builtin_memcpy(&__cookie, __allocation_start, sizeof(_ArrayCookie)); // necessary to avoid violating strict aliasing
98+
return *reinterpret_cast<_ArrayCookie const*>(&__cookie);
9699

97100
#elif defined(_LIBCPP_ABI_ITANIUM_WITH_ARM_DIFFERENCES)
98101

99-
struct _ArrayCookie {
102+
struct [[__gnu__::__aligned__(_LIBCPP_ALIGNOF(_Tp))]] _ArrayCookie {
100103
size_t __element_size;
101104
size_t __element_count;
102105
};
103106

104-
size_t __cookie_size_with_padding = // max(sizeof(_ArrayCookie), alignof(T))
105-
sizeof(_ArrayCookie) < _LIBCPP_ALIGNOF(_Tp) ? _LIBCPP_ALIGNOF(_Tp) : sizeof(_ArrayCookie);
106-
char const* __allocation_start = reinterpret_cast<char const*>(__ptr) - __cookie_size_with_padding;
107-
_ArrayCookie const* __cookie = reinterpret_cast<_ArrayCookie const*>(__allocation_start);
108-
return __cookie->__element_count;
107+
char const* __allocation_start = reinterpret_cast<char const*>(__ptr) - sizeof(_ArrayCookie);
108+
char __cookie[sizeof(_ArrayCookie)];
109+
__builtin_memcpy(&__cookie, __allocation_start, sizeof(_ArrayCookie)); // necessary to avoid violating strict aliasing
110+
return reinterpret_cast<_ArrayCookie const*>(&__cookie)->__element_count;
109111

110112
#else
111113

0 commit comments

Comments
 (0)