Rust 1.99.1、FFIのbool誤コンパイルと2つのリンクのバグを修正
Rust(ラスト)1.99.1は、1.99.0で生じた3つのリグレッションを修正しました。x86_64のFFI関数が0または1以外のbool値を返すことがある問題も含まれます。rustupで更新できます。
3 分で読めます

Rust Release Teamは2026年10月15日、Rust 1.99.1をリリースしました。Rust 1.99.0の2週間後です。このポイントリリースは、3つのリグレッションを修正します。リグレッションとは、以前のバージョンで動いていたものが、その後壊れることです。最も深刻なものでは、x86_64上で、Cのコードにboolを返す一部の関数が0または1以外の値を返していました。コンパイル時の警告はありませんでした。
3つの修正
Rustブログの告知は、標準ライブラリー、コンパイラー、リンカーについて、修正を1つずつ挙げています。
| バグ | 影響を受けた環境 | 修正内容 | Issue |
|---|---|---|---|
wcslenシンボルの欠落 | 一部のターゲット、特にUEFI | wcslenをフォールバックとしてcompiler-builtinsに追加 | #163614 |
FFIのbool戻り値の誤コンパイル | x86_64 | 戻り値の型を再びゼロ拡張の対象に指定 | #163911 |
rust-lldがlibLLVMを読み込めない | macOS(rustupプロキシーを使わない場合) | libLLVM.dylibへのrpathを付けてrust-lldをビルド | #163947 |
rustup update stableで更新してください。ブログは、こうしたリグレッションをリリース前に見つけられるよう、betaとnightlyのツールチェーンを試すことも勧めています。
x86_64でのboolのバグ
FFI(foreign function interface、外部関数インターフェース)は、RustがCのコードを呼び出し、CがRustを呼び出すための仕組みです。boolは、必ず0か1として届かなければなりません。x86_64の呼び出し規約では、返されるboolはゼロ拡張しなければなりません。つまり、レジスターの使われていない上位ビットをクリアします。
ブログによると、1.99.0では戻り値レジスターのビット1から7が未規定のままでした。そのため、呼び出し側が0または1以外の値を受け取る可能性がありました。修正では、「ABIが求めるとおり」、戻り値の型を再びゼロ拡張の対象に指定します。Linux Compatibleによると、ある報告では値16が観測されました。
Linux Compatibleは、原因をそれ以前の変更であるPR #142389にたどっています。この変更は、x86_64でスカラーの戻り値型からゼロ拡張を外していました。この問題は、後の変更で安全策が取り除かれて初めて表面化しました。同サイトによると、aarch64とloongarch64は影響を受けていません。PBXScienceは、何の兆候もなく失敗したため、これを3つのバグの中で最も深刻だとしています。
wcslenとmacOSのリンカーのバグ
wcslenは、ワイド文字列の長さを測るCの関数です。LLVMの最適化パスがこの関数の呼び出しを挿入することがありますが、一部のターゲットはこの関数を提供していません。ブログによると、PCを起動するファームウェア層であるUEFIでは、stdを使うプロジェクトがすべて壊れていました。
Linux Compatibleは、このエラーはリリースビルドでしか現れなかったと付け加えています。更新するまでの回避策として、RUSTFLAGS="-C llvm-args=-disable-loop-idiom-wcslen"を設定してこのパスを無効にする方法を挙げています。
3つ目のバグはmacOSで起きました。Rustに同梱されるリンカーであるrust-lldを、rustupプロキシーを通さずに実行すると、libLLVM.dylibを見つけられませんでした。rpathとは、プログラムに組み込まれたライブラリーの検索パスです。1.99.1にはこれが含まれるようになりました。Linux Compatibleは、Apple Siliconでのクラッシュを報告しています。同サイトによると、fenixでインストールしたツールチェーンが影響を受けました。rustupのプロキシーを経由しないためです。
このリリースは、10月1日のRust 1.99.0に続くものです。1.99.0では、C-variadic関数の定義が安定化され、LLVM 23に移行しました。PBXScienceによると、Rust 1.100.0はベータ版の段階にあり、11月12日にリリースされる予定です。
これが開発者にとって意味すること
x86_64でRustのコードがCにboolを返しているなら、今すぐ更新しましょう。不正な値は、それだけではクラッシュを起こしません。== 1で判定したり、値を配列のインデックスとして使ったりするCの呼び出し側は、気づかないまま誤った分岐に進むことがあります。1.99.0でビルドし、そうした関数を公開しているライブラリーは、すべてビルドし直して再デプロイしてください。
過去2週間のログとテスト結果に、FFIのおかしな挙動がないか確認しましょう。結果が「truthy」かどうかだけを調べるテストでは、16のような値は見つけられなかったはずです。
UEFIや組み込み向けのターゲットをリリースモードでビルドしているなら、1.99.1でwcslenに関するリンクエラーが直るはずです。アップグレードしたらRUSTFLAGSの回避策を外し、最適化が再び動くようにしてください。
macOSでは、fenixのほか、rustupを使わずにrustcを直接呼び出す構成でも、rust-lldが再び動くようになります。これには、rust-lldを通してリンクするWebAssemblyのビルドも含まれます。
CIではツールチェーンのバージョンを固定しましょう。rust-toolchain.tomlファイルを使えば、1.99.0から1.99.1への移行が、明示的でレビュー可能な変更になります。
出典
- Announcing Rust 1.99.1 - Rust Blog
- Rust 1.99.1 Released: Three Critical Bugs Fixed in Record Two-Week Turnaround - Linux Compatible
- Rust 1.99.1 Released: Three Regressions Fixed - PBXScience
関連記事

Rust 1.100、32ビットWindowsターゲットのホストツールを廃止
Rust 1.100は32ビットWindows向けのコンパイラ配布をやめます。i686ターゲットには標準ライブラリ(スタンダードライブラリ)が残るため、64ビットWindowsからのクロスコンパイルは引き続き可能です。

Rust 1.99がC-variadic関数の定義を安定化
2026年10月1日に公開されたRust 1.99.0により、安定版のRustでprintfのようなC-variadic関数、つまり可変長引数(バリアディック)関数を定義できるようになりました。LLVM 23に移行し、ジェネリクスへのno_mangleはエラーになります。
