Preemptively disable unsigned integer sanitization in 32 and 64 bit versions of __murmur2_or_cityhash. This lets people use the unsigned integer overflow checker in UBSAN w/o getting hits from libc++'s hash code (where the unsigned integer overflow is legal and deliberate)> Patch by @danielaustin. Reviewed as: http://reviews.llvm.org/D15973
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@257368 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -597,6 +597,11 @@ namespace std {
|
|||||||
|
|
||||||
#define _LIBCPP_HAS_NO_ASAN
|
#define _LIBCPP_HAS_NO_ASAN
|
||||||
|
|
||||||
|
// Allow for build-time disabling of unsigned integer sanitization
|
||||||
|
#ifndef _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK
|
||||||
|
#define _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK __attribute((no_sanitize("unsigned integer")))
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // __clang__ || __GNUC__ || _MSC_VER || __IBMCPP__
|
#endif // __clang__ || __GNUC__ || _MSC_VER || __IBMCPP__
|
||||||
|
|
||||||
#ifndef _LIBCPP_HAS_NO_NOEXCEPT
|
#ifndef _LIBCPP_HAS_NO_NOEXCEPT
|
||||||
@@ -826,6 +831,10 @@ extern "C" void __sanitizer_annotate_contiguous_container(
|
|||||||
#define _LIBCPP_HAS_NO_ATOMIC_HEADER
|
#define _LIBCPP_HAS_NO_ATOMIC_HEADER
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK
|
||||||
|
#define _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // __cplusplus
|
#endif // __cplusplus
|
||||||
|
|
||||||
#endif // _LIBCPP_CONFIG
|
#endif // _LIBCPP_CONFIG
|
||||||
|
|||||||
@@ -3194,7 +3194,7 @@ struct __murmur2_or_cityhash<_Size, 32>
|
|||||||
// murmur2
|
// murmur2
|
||||||
template <class _Size>
|
template <class _Size>
|
||||||
_Size
|
_Size
|
||||||
__murmur2_or_cityhash<_Size, 32>::operator()(const void* __key, _Size __len)
|
__murmur2_or_cityhash<_Size, 32>::operator()(const void* __key, _Size __len) _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK
|
||||||
{
|
{
|
||||||
const _Size __m = 0x5bd1e995;
|
const _Size __m = 0x5bd1e995;
|
||||||
const _Size __r = 24;
|
const _Size __r = 24;
|
||||||
@@ -3344,7 +3344,7 @@ struct __murmur2_or_cityhash<_Size, 64>
|
|||||||
// cityhash64
|
// cityhash64
|
||||||
template <class _Size>
|
template <class _Size>
|
||||||
_Size
|
_Size
|
||||||
__murmur2_or_cityhash<_Size, 64>::operator()(const void* __key, _Size __len)
|
__murmur2_or_cityhash<_Size, 64>::operator()(const void* __key, _Size __len) _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK
|
||||||
{
|
{
|
||||||
const char* __s = static_cast<const char*>(__key);
|
const char* __s = static_cast<const char*>(__key);
|
||||||
if (__len <= 32) {
|
if (__len <= 32) {
|
||||||
|
|||||||
Reference in New Issue
Block a user