C++: Float-zu-Int-Konvertierung kann undefiniertes Verhalten auslösen
C++ float-to-int conversion can be undefined behavior
Das Konvertieren einer Gleitkommazahl in einen Integer ist in C++ undefiniertes Verhalten, wenn der abgeschnittene Wert nicht in den Zieltyp passt – selbst bei unsigned Typen. Diese Fehlerquelle ist weit verbreitet, wie das Beispiel der Microsoft Guidelines Support Library (GSL) zeigt: gsl::narrow soll sichere Konvertierungen ermöglichen, führt aber bei bestimmten Eingaben zu undefiniertem Verhalten, anstatt wie dokumentiert eine Ausnahme zu werfen. Die Verantwortlichen rechtfertigen dies mit der Annahme, dass das Verhalten auf den Zielplattformen harmlos sei, doch das ist trügerisch: Unterschiedliche Hardware liefert unterschiedliche Ergebnisse, und Compiler könnten das Verhalten jederzeit ändern. Der Artikel empfiehlt, vor der Konvertierung Grenzen zu prüfen und den Undefined Behavior Sanitizer (UBSan) einzusetzen.
Ihr Code könnte plötzlich nicht mehr funktionieren, wenn der Compiler zufällig eine andere Transformation anwendet.