TBH,我惊讶地问了我一个问题,但看着这段代码
template <class _Tp, class _Hash, class _Equal, class _Alloc>
void
__hash_table<_Tp, _Hash, _Equal, _Alloc>::rehash(size_type __n)
{
if (__n == 1)
__n = 2;
else if (__n & (__n - 1)) // >>>>>>LINE IN QUESTION<<<<<<<<<<<
__n = __next_prime(__n);
size_type __bc = bucket_count();
if (__n > __bc)
__rehash(__n);
else if (__n < __bc)
{
__n = _VSTD::max<size_type>
(
__n,
__is_hash_power2(__bc) ? __next_hash_pow2(size_t(ceil(float(size()) / max_load_factor()))) :
__next_prime(size_t(ceil(float(size()) / max_load_factor())))
);
if (__n < __bc)
__rehash(__n);
}
}
在上面的那一行,应该允许__n
为零,其旁边的- 1
会导致整数溢出,调试器(在我的情况下为XCode)会捕获并抱怨。现在,我的理解是该行上的&
操作可能使该行整体上仍与哈希过程相关。但是其他人为解决这个问题做了什么?使调试器静音?完成此操作的函数调用是另一个标准库调用:
template <class _Value, class _Hash, class _Pred, class _Alloc>
unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(const unordered_set& __u)
: __table_(__u.__table_){
#if _LIBCPP_DEBUG_LEVEL >= 2
__get_db()->__insert_c(this);
#endif
__table_.rehash(__u.bucket_count()); // >>FUNCTION CALL<<<<
insert(__u.begin(), __u.end());
}
此处__u.bucket_count()
返回零,因此发生了有关的行为。
我在XCode中通过未定义的行为清除程序收到的错误或清除程序警告为Unsigned integer overflow: 0 - 1 cannot be represented in type 'unsigned long'
答案 0 :(得分:2)
似乎已创建了一个有关此问题的错误报告,其中一位开发人员在此处https://bugs.llvm.org/show_bug.cgi?id=38606回答了该问题 似乎该操作正在执行检查以查看是否为2的幂。此代码是非常有意的。
根据这张票证https://bugs.llvm.org/show_bug.cgi?id=25706,看来他们正在经历并沉默标准库中所有这些有趣的事件。
所以我猜这就是我的答案。等待他们将其静音,或者我可以自己静音,如果不忽略它。