Я включил -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'
Это происходит для меня на лязгом 3.6.0
и для друга с clang 3.4-1ubuntu3
. Это не происходит для меня по версии gcc 4.9.2
Так что же здесь? Действительно ли этот код плохой, или есть что-то подозрительное, продолжающееся на конце clang?
Просто 'os << std :: hex;', похоже, также воспроизводит проблему. – dyp
http://stackoverflow.com/questions/20617788/using-memory-sanitizer-with-libstdc Возможно это? –
Мне понравилось бы более описательное название, но мне трудно найти его. –