diff options
| author | Eric Fiselier <eric@efcs.ca> | 2016-10-05 22:55:10 +0000 |
|---|---|---|
| committer | Eric Fiselier <eric@efcs.ca> | 2016-10-05 22:55:10 +0000 |
| commit | ae34c56ee77ba6f9096dcec543d99d9ab87a6718 (patch) | |
| tree | d9374a630e6963b8a768062f56e4c208f214d684 /libcxx/include | |
| parent | 5d0fbbbca13960f7c996fc6f36ece35b652d7c4d (diff) | |
| download | bcm5719-llvm-ae34c56ee77ba6f9096dcec543d99d9ab87a6718.tar.gz bcm5719-llvm-ae34c56ee77ba6f9096dcec543d99d9ab87a6718.zip | |
Fix strict-aliasing violation in typeinfo::hash_code()
Summary:
The current implementation of `hash_code()` for uniqued RTTI strings violates strict aliasing by dereferencing a type-punned pointer. Specifically it generates a `const char**` pointer from the address of the `__name` member before casting it to `const size_t*` and dereferencing it to get the hash. This is really just a complex and incorrect way of writing `reinterpret_cast<size_t>(__name)`.
This patch changes the conversion sequence so that it no longer contains UB.
Reviewers: howard.hinnant, mclow.lists
Subscribers: rjmccall, cfe-commits
Differential Revision: https://reviews.llvm.org/D24012
llvm-svn: 283408
Diffstat (limited to 'libcxx/include')
| -rw-r--r-- | libcxx/include/__config | 6 | ||||
| -rw-r--r-- | libcxx/include/typeinfo | 4 |
2 files changed, 1 insertions, 9 deletions
diff --git a/libcxx/include/__config b/libcxx/include/__config index b0a3091e497..311e0607a71 100644 --- a/libcxx/include/__config +++ b/libcxx/include/__config @@ -694,12 +694,6 @@ template <unsigned> struct __static_assert_check {}; #define _NOALIAS #endif -#ifdef __GNUC__ -#define _LIBCPP_MAY_ALIAS __attribute__((__may_alias__)) -#else -#define _LIBCPP_MAY_ALIAS -#endif - #if __has_feature(cxx_explicit_conversions) || defined(__IBMCPP__) # define _LIBCPP_EXPLICIT explicit #else diff --git a/libcxx/include/typeinfo b/libcxx/include/typeinfo index ace66099142..9b14cb36048 100644 --- a/libcxx/include/typeinfo +++ b/libcxx/include/typeinfo @@ -77,8 +77,6 @@ class _LIBCPP_EXCEPTION_ABI type_info type_info& operator=(const type_info&); type_info(const type_info&); - typedef size_t _LIBCPP_MAY_ALIAS _ASizeT; // Avoid strict-aliasing issues. - protected: #ifndef _LIBCPP_NONUNIQUE_RTTI_BIT const char* __type_name; @@ -119,7 +117,7 @@ public: _LIBCPP_INLINE_VISIBILITY size_t hash_code() const _NOEXCEPT #ifndef _LIBCPP_NONUNIQUE_RTTI_BIT - {return *reinterpret_cast<const _ASizeT *>(&__type_name);} + {return reinterpret_cast<size_t>(__type_name);} #else {if (!(__type_name & _LIBCPP_NONUNIQUE_RTTI_BIT)) return __type_name; const char *__ptr = name(); |

