C++ float-to-int conversion can be undefined behavior
La conversion d'un float en int en C++ est un comportement indéterminé lorsque la valeur tronquée ne tient pas dans le type entier, et ce cas arrive facilement par inadvertance dans le code. Les trois formes courantes de conversion (implicite, int(f) et static_cast<int>(f)) n'émettent généralement aucun avertissement avec -Wall et -Wextra et sont pourtant indéterminées pour certains inputs. Cppreference précise que la partie fractionnaire est supprimée et que si la valeur ne peut pas être représentée dans le type de destination, le comportement est indéterminé, même pour les entiers non signés. La bibliothèque GSL fournit gsl::narrow qui promet de lever une erreur quand la valeur ne tient pas, mais elle n'adresse pas correctement les conversions float→int et laisse place à du comportement indéterminé, problème que les mainteneurs ont qualifié de « bénin » pour leurs plateformes cibles. La solution correcte est de vérifier les bornes avant la conversion ou d'utiliser une approche saturante, on peut détecter ces UB avec UBSan (-fsanitize=float-cast-overflow), et le défaut n'a pas été corrigé dans GSL.