ニュース

Rust 1.96.0:新たなCopy範囲型、assert_matches!、そしてより厳格なWasmリンク

Rust 1.96.0が、待望のCopy範囲型、assert_matches!マクロを導入し、WebAssemblyのシンボル処理を厳格化。Cargoはサードパーティレジストリ向けの2件のCVEも修正。

July 5, 2026· 1 min read
Rust 1.96.0:新たなCopy範囲型、assert_matches!、そしてより厳格なWasmリンク

Rust 1.96.0がリリースされた。現場のエンジニアが実際に気にする変更がいくつか含まれている。目玉は、新たなcore::range型(Copy)、パターンマッチ診断を改善するassert_matches!マクロ、そして未定義シンボルを早期に捕捉するWebAssemblyリンクの破壊的変更だ。

Copy範囲型がついに登場

従来のRange型はIteratorを直接実装しているため、同時にCopyにできない——長年の落とし穴だ。RFC 3550はクリーンな分割を提案した:新たなcore::range::RangeRangeFromRangeInclusiveは代わりにIntoIteratorを実装するため、Copyにできる。これにより、スライスアクセサをCopyな構造体に格納する際、開始と終了のフィールドを分割する必要がなくなる。新しいRangeInclusiveは、使い果たしたイテレータ状態を隠していたレガシーバージョンとは異なり、フィールドを公開する。0..1のような構文は今のところレガシー型を生成するが、将来のエディションで新しい型に切り替わる。ライブラリを書くなら、公開APIではimpl RangeBoundsを優先し、可能な限り新しい具象型を使うこと。

assert_matches! と debug_assert_matches!

これらのマクロは本質的にassert!(matches!(..))の糖衣構文だが、失敗時に実際の値を表示する——デバッグにおける大きな改善だ。プレリュードには含まれていない(人気のサードパーティクレートとの衝突を避けるため)。明示的にインポートする必要がある:use core::assert_matches;。すぐに採用すべきだ。

WebAssemblyターゲット:デフォルトで --allow-undefined なしに

1.96.0以降、WebAssemblyターゲットはリンカに--allow-undefinedを渡さなくなる。未定義シンボルは、静かに"env"モジュールからのインポートになる代わりに、リンカエラーを引き起こす。これにより、ビルドの設定ミスや偶発的なシンボル名の衝突を早期に捕捉できる。古い動作が必要な場合は、RUSTFLAGS=-Clink-arg=--allow-undefinedで再び有効にするか、シンボルブロックに#[link(wasm_import_module = "env")]を注釈することで対応できる。この変更は以前に告知され、今回から有効となる。

Cargoが2件のCVEを修正

2件の低/中程度の脆弱性が修正された:CVE-2026-5223(tarball内のシンボリックリンク展開)とCVE-2026-5222(正規化されたURLでの認証)。どちらもサードパーティレジストリのユーザにのみ影響する。crates.ioのユーザは安全だ。

安定化されたAPI

  • assert_matches!debug_assert_matches!
  • From<T> for AssertUnwindSafe<T>
  • From<T> for LazyCell<T, F>LazyLock<T, F>
  • 新しい core::range::RangeRangeFromRangeInclusive、およびそれらのイテレータ

詳細はリリースノートを参照。