概要
Rustチームは7月16日、Rust 1.97.0のリリースからわずか1週間というごく短い間隔でポイントリリース版の1.97.1を公開した。今回の修正の対象は、LLVMの最適化処理に起因する誤コンパイル(miscompilation)の問題で、正当なRustコードが最適化ビルド時に不正な機械語へとコンパイルされてしまう重大なバグだった。公式ブログでは「Rust 1.97.1 fixes a miscompilation in an LLVM optimization」と説明されており、開発チームはLLVM側の修正をバックポートするとともに、1.97.0で誤コンパイルの発生確率を高めていたRustのIR生成の変更を無効化する対応を取った。
技術的な詳細
問題はGitHub上のissueで報告されており、異なるサイズを持つバリアント(BigとSmall)を含む列挙型と構造体をネストさせ、map()を用いた複雑なパターンマッチ処理を行うコードで再現する。最適化フラグ-Oを有効にしたx86-64ターゲット向けビルドで発生し、本来Noneを返すはずの関数がセグメンテーションフォルトでクラッシュするという深刻な症状を引き起こしていた。この不具合はRust 1.97.0のほか、当時のベータ版1.98.0やナイトリー版1.99.0でも確認された一方、1.96.1では発生しない「回帰バグ」であることが判明し、Critical(重大)の優先度が付けられていた。
背景
チームの調査によれば、この誤コンパイルを引き起こす根本的な問題自体は少なくともRust 1.87の時点から存在していたという。しかし普段は表面化しない条件であったところ、Rust 1.97.0で行われたIR生成方法の変更によって、問題が顕在化する可能性が大幅に高まってしまった。これを受けてRustチームは通常のリリースサイクルを待たず、LLVM側の修正の取り込みと該当変更の無効化を行った緊急のポイントリリースとして1.97.1を送り出した。
今後の展望
Rustチームは今回のような回帰バグの早期発見のため、ユーザーに対してrustup default betaやrustup default nightlyによるベータ・ナイトリーチャネルでのテストへの協力を呼びかけている。問題を発見した場合はGitHub上でのバグ報告を推奨しており、今回のケースのようにリリース後短期間で重大な誤コンパイルバグが是正されたことは、リリースプロセスの検証体制が機能していることを示す事例といえる。