You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何std::bitset::set()会触发未定义行为?

关于Clang整数Sanitizer与std::bitset的未定义行为问题

当使用命令clang++ -fsanitize=integer test_bitset.cpp编译以下代码时:

#include <bitset>

int
main(int argc, char** argv) {
    std::bitset<96> mask;
    mask.set();
    return 0;
}

运行程序会触发如下运行时错误:

.../include/c++/12/bitset:657:46: runtime error: left shift of 18446744073709551615 by 32 places cannot be represented in type 'std::_Sanitize::_WordT' (aka 'unsigned long')
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior .../include/c++/12/bitset:657:46 in 

尝试通过clang++ -fsanitize=integer -fno-sanitize=unsigned-integer-overflow test_bitset.cpp禁用无符号整数溢出检查后,该未定义行为错误仍然存在。但令人困惑的是,如果手动按照Clang文档描述启用所有整数检查项:

clang++ -fsanitize=signed-integer-overflow,unsigned-integer-overflow,shift,integer-divide-by-zero,implicit-unsigned-integer-truncation,implicit-signed-integer-truncation,implicit-integer-sign-change test_bitset.cpp 

运行时的未定义行为错误却消失了。这似乎说明-fsanitize=integer包含了更多未明确列出的检查项?

目前可以通过黑名单屏蔽bitset相关的错误,但想确认这是标准库的bug还是可以安全忽略的问题。测试环境为Ubuntu22.04,使用Clang14和15版本,寻求相关提示。

内容的提问来源于stack exchange,提问作者Michael

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 04:16:11