我打开了-fsanitize=undefined
使用单元测试库 Catch 的项目。来自 Catch 的一行被此标志指示为导致未定义的行为。我设法做了一个孤立的例子:
#include <iomanip>
#include <sstream>
int main()
{
std::ostringstream os;
os << "0x" << std::setfill('0') << std::hex;
}
编译:
clang++ -fsanitize=undefined main.cpp
如果我运行它,将给出以下打印:
/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../include/c++/4.9.2/bits/ios_base.h:96:24: runtime error: load of value 4294967221, which is not a valid value for type 'std::_Ios_Fmtflags'
/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../include/c++/4.9.2/bits/ios_base.h:76:67: runtime error: load of value 4294967221, which is not a valid value for type 'std::_Ios_Fmtflags'
这发生在我和 clang3.6.0
的朋友身上3.4-1ubuntu3
。我在 gcc 版本上不会发生这种情况4.9.2
那么这里是什么?这段代码真的很糟糕,还是在 clang 的结尾有什么可疑的地方?