为何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
相关产品推荐
相关产品推荐

