Я включил -fsanitize=undefined
в моем проекте, который использует библиотеку тестирования модулей Catch. Одна строка из Catch была указана как вызывающая поведение undefined этим флагом. Мне удалось сделать изолированный пример:
#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'
Это происходит для меня на clang 3.6.0
и для друга с clang 3.4-1ubuntu3
. Это не происходит для меня в версии gcc 4.9.2
Итак, что здесь? Действительно ли этот код плохой, или есть что-то подозрительное, продолжающееся на конце clang?