注目★★★★★Lobsters
C++ の float→int 変換は未定義動作、多くのコードが見落とし
30秒で把握
- 1C++ の float→int 変換が値の範囲外で未定義動作・既存コード多数が見落とし
- 2GSL の gsl::narrow も同じ脆弱性・警告されずコンパイラ最適化で破綻リスク
- 3bounds check 必須・UBSan (-fsanitize=float-cast-overflow) での検証推奨
要約
C++ で float を int に変換する際、truncate 後の値が int の範囲に収まらない場合は未定義動作となる。-Wall -Wextra を有効にしても警告されず、暗黙変換・explicit キャスト・static_cast のいずれでも同じリスクがある。マイクロソフトの Guidelines Support Library (GSL) の gsl::narrow も同じ落とし穴に陥っており、ドキュメントでは安全と説明しながら実装上は未定義動作のままである。x86 の CVTTSS2SI や AArch64 の FCVTZS など現在のプロセッサは INT_MIN へマップ or 飽和処理で「通常は動く」が、コンパイラ最適化で予期しない変換を受ける可能性がある。正しい対策は bounds check を cast 前に実施し、UBSan (-fsanitize=float-cast-overflow) での検証が推奨される。
あなたへの影響
この記事が日本のエンジニアに与える影響と、今日取るべきアクションは、Personal会員向けに掲載しています。
クレカ不要・いつでも解約