Ho acceso -fsanitize=undefined
sul mio progetto che utilizza Catch, la libreria di test delle unità. Una linea di Catch è stata segnalata come causa di un comportamento indefinito da questo flag. Sono riuscito a fare un esempio isolato:Questo codice è davvero indefinito, come sembra indicare Clang?
#include <iomanip>
#include <sstream>
int main()
{
std::ostringstream os;
os << "0x" << std::setfill('0') << std::hex;
}
compilato con:
clang++ -fsanitize=undefined main.cpp
Se ho eseguito questo, il seguente stampa è data:
/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'
Questo accade per me su clang 3.6.0
e per un amico con clang 3.4-1ubuntu3
. Non succede per me su gcc versione 4.9.2
Allora, che succede qui? Questo codice è veramente cattivo, o c'è qualcosa di sospetto sulla fine del clang?
Solo 'os << std :: hex;' sembra anche riprodurre il problema. – dyp
http://stackoverflow.com/questions/20617788/using-memory-sanitizer-with-libstdc Forse questo? –
Mi piacerebbe un titolo più descrittivo, ma ho difficoltà a inventarne uno. –