C++ Unordered_set功能中的溢出
Overflow in C++ Unordered_set function
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(捕获并抱怨的整数溢出。现在,我的理解是,该行上的&
操作可能会使该行作为一个整体仍然与哈希过程相关。但是其他人做了什么来解决这个问题??使调试器静音?执行此操作的函数调用是另一个 std 库调用:
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'
似乎创建了一个关于它的错误报告,其中一位开发人员在这里回答了它 https://bugs.llvm.org/show_bug.cgi?id=38606 该操作似乎执行检查以查看它是否是 2 的幂。这段代码非常有意。
根据这里的这张票,https://bugs.llvm.org/show_bug.cgi?id=25706,他们似乎正在经历并沉默标准库中所有这些有趣的事件。
所以这就是我的答案。要么等待他们将其静音,要么我可以自己将其静音,如果不忽略它。
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 多态性和功能结合
- 带内存和隔离功能的SQLite
- 'short int'持有的值溢出,但"自动"不会溢出?
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 大于65535的C++数组[size]引发不一致的溢出
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- 类模板的成员功能的定义在单独的TU中完全专业化
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++中获得"静态纯虚拟"功能?
- C++ Unordered_set功能中的溢出
- 虚拟功能是否不太可能导致堆栈溢出
- 代码仅在2个功能实现中的1个中溢出
- 为什么功能不给整数溢出
- 功能参数导致堆栈溢出
- 如何在功能中的理智检查过程中处理整数的溢出
- 当与可能导致缓冲区溢出的功能一起使用时,外部变量是否比其他变量更大
- QtCore,QMutex 类,锁定功能 - 堆栈溢出故障
- 检查 addc 功能的溢出
- basic_streambuf炒锅的功能溢出和下溢如何