Rust 1.97 の新機能 - v0シンボルマングリングのデフォルト化とCargoの警告制御

Rust 1.97 の新機能 - v0シンボルマングリングのデフォルト化とCargoの警告制御

作成日:
読了:約10分
更新日:

当サイトは Amazon.co.jp を宣伝しリンクすることで紹介料を得る手段を提供する、Amazonアソシエイト・プログラムの参加者です。価格・在庫はリンク先の最新情報をご確認ください。

システムプログラミング言語 Rust の新しい安定版 Rust 1.97.0 が、2026年7月9日にリリースされました。今回の目玉は、コンパイラが生成するシンボル名の付け方(マングリング)が v0 スキームでデフォルト化されたことと、Cargo の警告制御が安定版に入ったことです。この記事では、言語・標準ライブラリ・Cargo の変更点を Rust 公式ブログと RELEASES.md を一次ソースに整理します。

NOTE

本記事のバージョン番号・リリース日・機能は、Rust 公式ブログおよび RELEASES.md(releases.rs)で2026年7月時点に確認した内容です。標準ライブラリのメソッドの挙動は公式の std ドキュメントで確認しています。一次ソースで確定できない細部については、その旨を明示します。

概要: まず結論

  • バージョン: Rust 1.97.0(2026年7月9日リリース)
  • コンパイラ: シンボルマングリングが v0 スキームでデフォルトに。リンカのメッセージが既定で警告として表示されるように
  • 標準ライブラリ: 整数のビット操作メソッド群が安定化、char::is_control が const 化
  • Cargo: build.warnings と resolver.lockfile-path の設定が安定化、--manifest-path に短縮形 -m が追加

アップデートは rustup update stable で行えます(後述)。Rust そのものが初めての方は、先にRust と rustup の始め方を読むと本記事の内容も追いやすくなります。

言語・コンパイラの変更

v0シンボルマングリングがデフォルトに

今回の最大の変更は、コンパイラが吐き出すシンボル名のマングリング方式が v0 スキームでデフォルトになったことです。マングリングとは、関数やジェネリック型などの名前を、リンカやデバッガが扱える一意の文字列へ符号化する仕組みです。

従来の(レガシーな)方式にはいくつかの弱点があり、たとえばジェネリックパラメータの値が保持されない、名前の一意性に不整合が出るといった問題がありました。Rust 独自に設計された v0 スキームはこれらを解消し、シンボル名がより正確で衝突しにくくなります。

レガシー方式は今後 nightly ビルドに限定され、将来的な削除が予定されています。JS ツールチェーンや型システムが各所でネイティブ実装・再設計へ進む流れ(Oxc / Oxlint、Bun の Zig から Rust への書き換え)と同じく、Rust 自身も足回りを整理し続けています。

リンカメッセージの可視化

これまでコンパイルが成功するとリンカのメッセージは握りつぶされていましたが、Rust 1.97 からは既定で警告として表示されるようになりました。これらは linker_messages という lint 経由で報告され、通常の警告とは別に個別に設定できます。

その他の言語変更

  • must-use lint の判定で、Result<T, Uninhabited> と ControlFlow<Uninhabited, T> を T と等価に扱うようになりました
  • allow-by-default の dead_code_pub_in_binary lint が追加されました(バイナリクレート内の未使用な pub 項目を検出)
  • ターゲット機能 div32 / lam-bh / lamcas / ld-seq-sa / scq が安定化
  • cfg(target_has_atomic_primitive_alignment) が安定化
  • use 文の末尾に置く self が、より多くのケースで許可されるように

標準ライブラリ・安定化API

整数のビット操作メソッド

標準ライブラリでは、整数型に対するビット操作メソッドがまとまって安定化されました。符号なし・符号付き整数と NonZero<{integer}> の双方で使えます。挙動は公式の std ドキュメントに基づき、次のとおりです。

メソッド戻り値挙動
isolate_highest_one整数最上位の 1 のビットだけを立てた値を返す(0 なら 0)
isolate_lowest_one整数最下位の 1 のビットだけを立てた値を返す(0 なら 0)
highest_oneOption最上位の 1 のビット位置を返す(0 なら None)
lowest_oneOption最下位の 1 のビット位置を返す(0 なら None)
bit_width整数値の表現に必要な最小ビット数を返す(0 なら 0)

実際の使用例です。

Rust 1.97 の整数ビット操作API
fn main() {
    let n: u32 = 0b0110_0100;
 
    // 最上位・最下位の 1 のビットだけを取り出す
    assert_eq!(n.isolate_highest_one(), 0b0100_0000);
    assert_eq!(n.isolate_lowest_one(), 0b0000_0100);
 
    // 1 のビットの位置(インデックス)を Option で得る
    assert_eq!(n.highest_one(), Some(6));
    assert_eq!(n.lowest_one(), Some(2));
    assert_eq!(0_u32.highest_one(), None);
 
    // 値を表現するのに必要な最小ビット数
    assert_eq!(0b111_u32.bit_width(), 3);
    assert_eq!(u32::MAX.bit_width(), 32);
    assert_eq!(0_u32.bit_width(), 0);
}

これまで leading_zeros や trailing_zeros から計算していた処理を、意図の伝わる名前のメソッドで直接書けるようになります。

その他のトレイト実装・const化

  • Default for RepeatN が実装されました
  • Copy for ffi::FromBytesUntilNulError が実装されました
  • UEFI ターゲットで Send for std::fs::File が実装されました
  • char::is_control が const 安定化され、const 文脈で呼べるようになりました

Cargo・ツールの変更

Cargo にも実務で効く変更が入りました。

変更内容
build.warnings の安定化ローカルパッケージの lint 警告の扱いを allow / warn / deny で制御。CI で警告ゼロを強制する用途に便利で、キャッシュを無効化しない
resolver.lockfile-path の安定化依存解決に使うロックファイルのパスを指定できる。読み取り専用のソースディレクトリで作業する場合に有用
-m ショートハンド--manifest-path の短縮形として -m が追加
cargo clean の安全化--target-dir がターゲットディレクトリらしくない場合にエラーを出す
依存の削減crates-io クレートから curl 依存を除去

とくに build.warnings は、これまで CI で RUSTFLAGS="-Dwarnings" を渡していた運用を置き換えられます。設定ファイルに書けるうえ、ビルドキャッシュを無効化しないのが利点です。環境変数 CARGO_BUILD_WARNINGS でも指定できます。

.cargo/config.toml で警告を deny にする
[build]
warnings = "deny"

rustdoc 側でも --emit フラグと --remap-path-prefix が安定化されています。

非互換・注意点

WARNING

v0 シンボルマングリングのデフォルト化により、古いバージョンのデバッガやプロファイラが Rust の吐くシンボルをうまくデマングル(元の名前に復元)できない場合があります。gdb / lldb / perf などを使っている場合は、ツール側を新しめのバージョンへ更新しておくと安全です。

レガシーマングリングは nightly でのみ利用可能になり、将来的に削除される見込みです。恒久的にレガシー方式へ固定する運用は避け、v0 前提へ移行しておくのが無難です。

アップデート方法

rustup を使っていれば、次のコマンドで安定版チャンネルを 1.97.0 へ更新できます。

Rust を 1.97.0 へ更新
rustup update stable
rustc --version

NOTE

追記(2026-10-07): 2026年7月16日に、LLVM 最適化での誤コンパイルを修正するパッチリリース Rust 1.97.1 が出ています。その後も Rust 1.98.0(2026年8月20日)、Rust 1.99.0(2026年10月1日)とリリースが続いているため、rustup update stable で最新の安定版へ更新するのが無難です。

rustup 自体をまだ導入していない場合や、ツールチェーン管理の基本を確認したい場合はRust と rustup の始め方を参照してください。ネイティブ実装への移行という点では、TypeScript のネイティブコンパイラ(Corsa)の動きとも通じるものがあります。

まとめ

Rust 1.97.0 は、派手な新構文こそ少ないものの、コンパイラとツールの足回りを整える実務寄りのリリースです。

  • v0 シンボルマングリングのデフォルト化で、シンボル名がより正確に。古いデバッガ/プロファイラは更新推奨
  • Cargo の build.warnings 安定化で、CI の警告ゼロ強制がキャッシュを壊さずに書けるように
  • 整数のビット操作APIと char::is_control の const 化で、標準ライブラリの表現力が向上

rustup update stable で更新し、まずは CI の警告制御と新しいビット操作メソッドから取り入れてみてください。

プランタンの開発ツールをオープンソース化しました - 日々使っている49本の一覧ページを公開

プランタンの開発ツールをオープンソース化しました - 日々使っている49本の一覧ページを公開

約21分

プランタン(printemps.tokyo)が日々の開発・運用で使っている自作ツールをオープンソース化し、一覧ページ printemps-tokyo.github.io にまとめました。Web解析・AI/LLM・開発ツール・セキュリティ/メール/DNS・画像/動画/出版・仕事効率化・遊び/学びの7分類、全49本(MITライセンス)を、カテゴリ別の表と言語・公開時期の内訳で紹介します。

Git 3.0 で何が変わるのか - SHA-256・reftable・main 既定化と、備えるための自作ツール git3ready

Git 3.0 で何が変わるのか - SHA-256・reftable・main 既定化と、備えるための自作ツール git3ready

約26分

Git の次の破壊的リリース Git 3.0 で予定されている変更を、公式の Documentation/BreakingChanges.adoc をもとに整理します。新規リポジトリの既定が SHA-256・reftable・main になり、safe.bareRepository が explicit に、git whatchanged などが削除され、ビルドに Rust が必須になる予定です。壊れるのは Git 本体ではなく周辺のスクリプト・フック・CI であることを示し、その箇所を洗い出して新しい既定値でテストを試走できる自作 CLI「git3ready」を紹介します。

Python 3.15 の新機能 - lazy imports と UTF-8 デフォルト化で何が変わるか

Python 3.15 の新機能 - lazy imports と UTF-8 デフォルト化で何が変わるか

約27分

2026年10月9日リリース予定(当初予定は10月1日)の Python 3.15 を、公式ドキュメントと PEP を一次ソースに整理します。PEP 810 の明示的な lazy imports、PEP 686 による UTF-8 のデフォルト化、組み込み frozendict(PEP 814)と sentinel(PEP 661)、内包表記でのアンパック(PEP 798)、新しい profiling パッケージ、free-threaded ビルド向け Stable ABI まで、移行前に押さえておきたい差分と注意点をまとめました。

楽天市場のおすすめPR / 楽天アフィリエイト