En C++, convertir un valor en coma flotante a un entero mediante sintaxis tan habitual como int i = f; o static_cast<int>(f) constituye comportamiento indefinido cuando el valor truncado no cabe en el tipo destino. El estándar lo recoge en la página de conversiones implícitas de Cppreference, donde se aclara que ni siquiera los tipos sin signo escapan a esa regla. El compilador no avisa de ello ni con -Wall -Wextra, y -Wconversion solo detecta la conversión implícita, por lo que programadoras y programadores pueden introducir el error sin darse cuenta.
El artículo lo ilustra con un caso real en la Guidelines Support Library (GSL) de Microsoft, que acompaña a las C++ Core Guidelines. Su función gsl::narrow, documentada como una conversión segura que lanza excepción cuando el valor no encaja, acaba recurriendo a un static_cast y, por tanto, también incurre en comportamiento indefinido. El autor lo señaló en una incidencia en GitHub y la respuesta del equipo fue que se considera aceptable porque las plataformas actuales no generan trampas hardware.
Aunque en x86 la instrucción CVTTSS2SI y en AArch64 FCVTZS producen resultados coherentes en la práctica, el problema no es benigno: distintas arquitecturas pueden dar resultados distintos y cualquier optimización futura del compilador que asuma ausencia de comportamiento indefinido puede romper el programa. La solución correcta pasa por comprobar los límites antes de convertir, una técnica inspirada en la conversión saturada de Rust, o por usar el detector -fsanitize=float-cast-overflow de UBSan en Clang y GCC. La errata detectada en la GSL sigue presente en el código y no ha sido corregida.
