-fsanitize=undefined
単体テスト ライブラリである Catch を使用するプロジェクトに切り替えました。Catch からの 1 行は、このフラグによって未定義の動作を引き起こしていることが通知されました。私は孤立した例を作ることができました:
#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 の最後で怪しいことが起こっているのでしょうか?