Ich eingeschaltet -fsanitize=undefined
auf meinem Projekt, die Catch, die Unit-Test-Bibliothek verwendet. Eine Zeile von Catch wurde durch dieses Flag als nicht definiertes Verhalten gemeldet. Ich schaffte es ein isoliertes Beispiel zu machen:Ist dieser Code wirklich undefiniert, wie Clang angibt?
#include <iomanip>
#include <sstream>
int main()
{
std::ostringstream os;
os << "0x" << std::setfill('0') << std::hex;
}
Zusammengestellt mit:
clang++ -fsanitize=undefined main.cpp
Wenn ich dies ausführen, wird der folgende Druck gegeben:
/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'
Dies geschieht für mich auf Klirren 3.6.0
und für einen Freund mit Klang 3.4-1ubuntu3
. Es passiert nicht für mich auf GCC-Version 4.9.2
Also was ist hier oben? Ist dieser Code wirklich schlecht, oder läuft am Ende des Klangs etwas Fauliges?
Nur 'os << std :: hex;' scheint auch das Problem zu reproduzieren. – dyp
http://stackoverflow.com/questions/20617788/using-memory-sanitizer-with-libstdc Vielleicht das? –
Ich würde einen beschreibenden Titel lieben, aber es fällt mir schwer, einen zu finden. –