10月31日、「Rust 1.91.0がリリースされた」。

この記事では、Rust 1.91.0における主要な変更点――特にWindows on ARM (aarch64-pc-windows-msvc) のTier 1昇格と、新たに追加されたローポインタ関連のLint警告――について紹介する。
aarch64-pc-windows-msvcがTier 1プラットフォームに昇格
Rustは多数のプラットフォームをサポートしているが、そのサポートレベルは「Tier」と呼ばれる階層制度によって分類されている。
- Tier 3: コンパイラが技術的にビルドをサポートしているが、テストやバイナリ配布は保証されない。
- Tier 2: ビルドおよびバイナリ配布は保証されるが、テストは実行されないため動作保証は限定的。
- Tier 1: すべての変更に対して完全なテストスイートを実行し、事前ビルド済みバイナリも提供される最上位サポート。
今回の1.91.0では、「aarch64-pc-windows-msvc」(Windows上の64ビットARM環境)がTier 1に昇格した。これにより、Windows on ARM環境でも最も高い品質保証とサポートが得られるようになった。
ローカル変数からのダングリングローポインタへのLint追加
Rustの所有権システムと借用チェッカは、参照に関してはライフタイムを追跡してダングリング参照(無効なポインタ参照)を防いでいるが、生ポインタ(raw pointer)については追跡対象外であった。
今回のリリースでは、関数からローカル変数への生ポインタを返すコードに対して、デフォルトで警告(lint)を出すようになった。
次のようなコードがその対象となる。
fn f() -> *const u8 {
    let x = 0;
    &x
}
このコードは実行時に危険な操作を行うわけではないが、関数終了時に変数xが破棄されるため、返されたポインタは無効となる。Rust 1.91.0では次のような警告が表示される。
warning: a dangling pointer will be produced because the local variable `x` will be dropped
 --> src/lib.rs:3:5
  |
1 | fn f() -> *const u8 {
  |           --------- return type of the function is `*const u8`
2 |     let x = 0;
  |         - `x` is part the function and will be dropped at the end of the function
3 |     &x
  |     ^^
  |
  = note: pointers do not have a lifetime; after returning, the `u8` will be deallocated
    at the end of the function because nothing is referencing it as far as the type system is concerned
  = note: `#[warn(dangling_pointers_from_locals)]` on by default
この警告は安全でない動作を未然に防ぐためのものであり、今後のリリースではローポインタおよびunsafeコードの安全性を高めるための機能拡充が予定されている。
その他 * Rust本体、Cargo、およびClippyにも関連する変更が含まれている。
詳細はAnnouncing Rust 1.91.0を参照していただきたい。
