概要

Rustプロジェクトは8月20日、最新安定版「Rust 1.98.0」をリリースした。7月3日からベータ版として運用されており、シンボルマングリングの既定値変更や整数ビット演算メソッド追加を行った前バージョン1.97に続く更新となる。今回の目玉は、これまで「呼び出す」ことしかできなかったC言語の可変長引数関数(variadic functions)を、Rust側で「定義」できるようになった点だ。c_variadic機能が安定化され、unsafe extern "C"関数としてargs: ...のような可変長引数を受け取り、VaArgSafeを実装する型(c_intc_double、各種ポインタなど)をnext_argで順次取り出す実装が可能になった。プラグインシステムやロギングフレームワーク、C言語からRustへの段階的移行時に可変長のコールバックを実装する用途での活用が見込まれる。

技術的な詳細

組み込みおよびOS開発者向けには、c_variadic_naked_functionsも同時に安定化された。これは#[unsafe(naked)]属性と可変長パラメータを組み合わせ、アセンブリによる実装で複数のABIをサポートするというもので、標準のc_variadic"C""C-unwind"のみに対応するのに対し、naked variadicでは"aapcs""efiapi""sysv64""win64""cdecl"など多様な呼び出し規約に対応する。これによりARM組み込みボード、UEFIファームウェア、Linux x86-64環境それぞれに合わせた実装が書けるようになる。

もう一つの注目点は、2018年から未解決だったIssue #49505、#[derive(PartialOrd)]マクロのバグ修正だ。従来このマクロは(a > b) || !(b > a) && trueのような冗長な比較ロジックを生成しており、LLVMによる最適化が難しい状態だった。今回、同じ型に対してOrdPartialOrdの両方を導出する最も一般的なパターンにおいて、partial_cmpcmpに直接委譲するよう修正され、生成コードが簡潔になりバイナリサイズも削減される。利用者側の対応は不要で、再ビルドするだけで自動的に適用される。

このほか、x86/x86-64向けにu128/i128型をasm!マクロ内でXMM・YMM・ZMMレジスタ経由で扱えるようになり、AES-NIやSIMD、UUID処理の効率化に寄与する。またPanicHookInfolocation()メソッドが返すライフタイムがOption<Location<'static>>に変更されたため、カスタムパニックフックを利用しているプロジェクトは動作確認が推奨される。Rustdocのビルド速度も2025年12月時点と比較して約28%短縮されたという。廃止された機能としては-Zemscripten-wasm-ehフラグがある。アップグレードは通常通りrustup update stableで行えるが、nightly版の機能フラグを使っていた場合は対応する#![feature(...)]属性の削除、カスタムパニックフックや古いビルドスクリプトの確認が必要となる。