rust 1.96.0 更新:语言、编译器、Cargo、Rustdoc、兼容性全面升级,必看完整解读
2026/5/30 7:28:49 网站建设 项目流程

Rust 1.96.0 于 2026 年 5 月 29 日正式发布,这次版本更新覆盖语言特性、编译器支持、标准库能力、Cargo 构建行为、Rustdoc 展示方式以及一批重要兼容性调整与内部改进。对使用 Rust 的开发者来说,这不仅是一次常规升级,更是一份值得仔细阅读的版本变更清单,因为其中既有可直接使用的新能力,也有可能影响现有项目的兼容性变化。


一、Rust 1.96.0 发布概览

Rust 1.96.0 的发布时间是 2026 年 5 月 29 日,版本号为 1.96.0。本次更新内容分布非常广,覆盖了以下几个大方向:

  • Language
  • Compiler
  • Libraries
  • Stabilized APIs
  • Cargo
  • Rustdoc
  • Compatibility Notes
  • Internal Changes

可以看到,这次更新并不是单点增强,而是对语言表达能力、平台支持、库能力和工具链行为的整体提升。同时,其中还包含若干兼容性注意事项,说明升级时需要结合项目情况进行检查。


二、Language:语言层面的改进

本次 Rust 1.96.0 在语言层面带来了 5 项更新。

1. 允许将 expr metavariable 传递给 cfg

这项改进允许把 expr metavariable 传给 cfg。对于宏和条件编译相关场景来说,这意味着表达式层面的元变量在 cfg 使用上更灵活,能够支持更多宏展开和条件判断场景。

2. 在 tuple expressions 中始终自动强制转换 never 类型

这项变化解决了 tuple expressions 中 never 类型推导和转换上的问题。现在,never 类型会在 tuple expressions 中始终被自动 coercion,从而减少一些边界场景下的类型推导困扰。

3. 避免在罕见情况下对函数参数给出错误的推导指导

这项修复针对的是少见场景中的类型推导提示错误。官方说明是避免在罕见情况下对函数参数给出不正确的 inference guidance。虽然属于比较细节的改进,但它直接影响编译器在某些复杂代码中的诊断和推导体验。

4. inline assembly 支持 s390x 向量寄存器

Rust 1.96.0 现在支持在 inline assembly 中使用 s390x vector registers。这增强了底层编程和平台相关开发的能力,尤其对需要编写汇编的高性能或系统级场景很重要。

5. 允许将 ManuallyDrop 类型的常量用作模式匹配

现在可以把 type 为 ManuallyDrop 的常量作为 pattern 使用,这修复了 1.94.0 中引入的一个回归。对依赖常量模式匹配的代码来说,这是一个恢复正确行为的重要修复。


三、Compiler:编译器更新

Rust 1.96.0 在编译器层面也有两项明确更新。

1. 为 LoongArch Linux targets 启用 link relaxation feature

编译器现在会为 LoongArch Linux targets 启用 link relaxation feature。这属于目标平台相关的底层增强,影响链接过程和生成结果。

2. 更新 riscv64gc-unknown-fuchsia baseline

riscv64gc-unknown-fuchsia 的 baseline 已更新为 RVA22 + vector。这个变化意味着该目标的基线能力得到提升,并与新的指令集/向量能力保持一致。


四、Libraries:标准库与库层面的变化

Libraries 部分是本次更新非常重要的一块,共包含 3 项内容。

1. 支持遍历 NonZero 整数范围

Rust 1.96.0 现在支持迭代 NonZero integers 的 ranges。也就是说,NonZero 类型不再只是用于表达非零约束,它在范围迭代中也具备了直接支持,这会让相关代码更自然。

2. 调整 “valid for read/write” 的定义

官方对 “valid for read/write” 的定义进行了重构:现在把 null 排除在该定义之外,并将 null 作为个别方法中的异常处理。这个变化属于语义层面的整理,目的是让定义更清晰、更一致。

3. 修复 SGX delayed host lookup via ToSocketAddr

Rust 1.96.0 修复了 SGX 场景下通过 ToSocketAddr 进行 delayed host lookup 的问题。对于涉及 SGX 的网络解析或地址转换逻辑,这是一个明确的修复项。


五、Stabilized APIs:稳定化 API

本次 Rust 1.96.0 稳定了多个 API,覆盖宏、类型转换以及 range 相关类型。

1. assert_matches!

2. debug_assert_matches!

这两个宏已经稳定。它们用于更方便地做模式匹配式断言,能够提升测试和调试代码的可读性。

3. From for AssertUnwindSafe

现在 AssertUnwindSafe 支持 From。这意味着可以更方便地从 T 转换为 AssertUnwindSafe。

4. From for LazyCell<T, F>

LazyCell<T, F> 现在也支持 From。

5. From for LazyLock<T, F>

LazyLock<T, F> 同样支持 From。

6. core::range::RangeToInclusive

7. core::range::RangeToInclusiveIter

8. core::range::RangeFrom

9. core::range::RangeFromIter

10. core::range::Range

11. core::range::RangeIter

这些 range 相关类型与迭代器接口已经稳定。对范围表达、迭代逻辑和相关泛型代码而言,这意味着核心 range 设施进一步正式可用。


六、Cargo:构建工具更新

Cargo 在 Rust 1.96.0 中有 3 项重要变化,其中还有安全修复。

1. 允许依赖同时指定 git 仓库和备用 registry

现在一个依赖可以同时指定 git repository 和 alternate registry。官方说明是:与 crates.io 类似,local 构建时会使用 git repository,而发布时会使用 registry 版本。

这项能力对依赖管理场景非常有用,尤其是既要本地跟随 git,又要发布时走 registry 的项目。

2. 配置中支持 target.‘cfg(…)’.rustdocflags

Cargo 配置现在新增了 target.‘cfg(…)’.rustdocflags 支持。这个变化让 rustdocflags 的配置更灵活,可以按 cfg 条件进行设置。

3. 修复 CVE-2026-5222 和 CVE-2026-5223

Cargo 本次还修复了两个安全问题:CVE-2026-5222 和 CVE-2026-5223。对于生产环境和供应链安全来说,这是升级 Rust 1.96.0 的重要理由之一。


七、Rustdoc:文档工具更新

Rustdoc 在 1.96.0 中有 3 项变化,重点在文档渲染和侧边栏展示。

1. 弃用说明现在像普通文档一样渲染

Rustdoc 对 deprecation notes 的渲染方式进行了调整。以前它们使用 css white-space: pre-wrap; 并且会去掉渲染 HTML 中的

元素,这会带来一些问题和不直观的行为。

现在的行为更可预测。但官方也特别说明:一些多行 deprecation notes 可能会以单行方式渲染。如果这不是你想要的效果,可以使用标准 markdown 的换行方式,也就是两个空格加一个换行 “\n”。

2. 不再在 impl items 上发出 missing_doc_code_examples lint

Rustdoc 现在不会在 impl items 上触发 missing_doc_code_examples lint。这有助于减少不必要的文档 lint 干扰。

3. 侧边栏中分离 methods 和 associated functions

Rustdoc 现在在侧边栏中将 methods 和 associated functions 分开显示。这个调整提升了文档浏览的结构清晰度。


八、Compatibility Notes:兼容性注意事项

这部分是升级 Rust 1.96.0 时必须重点查看的内容,因为它们可能影响已有项目编译或行为。

1. 修复 #[repr(Int)] enums 在某些特殊场景下的布局

在某些涉及 uninhabited zero-sized types 字段的边界情况下,#[repr(Int)] enums 的 layout 已修复。说明这属于布局层面的兼容性修正。

2. 禁止 unsize-coercing 到 Pin,当 Foo 不实现 Deref 时

以前某些场景下可能允许 unsize coercion into Pin,即使 Foo 没有实现 Deref。现在这种 coercion 被禁止,因为它会产生一个没有有用 public API 的类型。

3. rustc 在 wasm targets 上停止传递 --allow-undefined

rustc 现在不再在 wasm targets 上传递 --allow-undefined。这是一个行为变化,可能影响相关目标的链接过程。

4. gate accidentally stabilized #![reexport_test_harness_main] attribute

原本意外稳定的 #![reexport_test_harness_main] attribute 现在被 gate 起来了。也就是说,这个属性不再维持意外稳定状态。

5. 返回位置 impl trait in traits 类型过于私有时会报错

对于 return-position-impl-trait-in-traits,如果其 types are too private,Rust 1.96.0 现在会报错。这是一个可见的编译行为变化。

6. 在依赖中报告 uninhabited_static lint,并设为 deny-by-default

uninhabited_static lint 现在会在 dependencies 中报告,并且成为 deny-by-default。该变化会影响依赖代码的编译结果。

7. 分布式构建中的 windows-gnu 现在包含 non-split debuginfo

Distributed builds 现在对 windows-gnu 提供 non-split debuginfo。官方说明这会提升 backtraces 的质量,但不会影响 rustc/cargo 在这些目标上的默认输出行为。

8. 检查 const generic arguments 在更多位置是否正确 typing

Rust 1.96.0 现在会在更多位置检查 const generic arguments 是否 correctly typed。这会让 const 泛型相关错误更早暴露。

9. 移除 -Csoft-float

本版本移除了 -Csoft-float。这是明确的兼容性变化,使用相关参数的项目需要注意。

10. 不再允许导入 struct 时使用 ::{self [as name]}

例如struct S {}; use S::{self as Other};这样的写法现在不再被允许,因为{self}imports 需要 module parent。这是一个语法/导入规则变化。

11. export_name、link_name、link_section 若重复出现,第一次的属性优先

对于 export_name、link_name 和 link_section 属性,如果同一属性出现多次,现在由第一个属性生效。这个优先级变化会影响属性重复场景下的链接行为。

12. 更新最低外部 LLVM 到 21

Rust 1.96.0 将 minimum external LLVM 更新到 21。这意味着外部 LLVM 版本要求提升,相关构建环境需要匹配。

13. avr targets 上 c_double 改为 f32

在 avr targets 上,由于 C 的 double 类型默认是 32-bit,所以现在将 c_double 改为 f32,以匹配 C 的 double。官方也明确说明这是一个 breaking change,但这是必要的修正。


九、Internal Changes:内部变更

最后是内部变化,这些变更不影响任何 public interfaces,但对 rustc 和相关工具的性能或内部机制有重要改进。

1. JSON targets:aarch64 softfloat targets 需要 rustc_abi 为 softfloat

对于 JSON targets,aarch64 softfloat targets 现在必须将 rustc_abi 设置为 “softfloat”。这是 target 配置层面的更严格要求。

2. target specs:对 LLVM ABI values 更严格检查,并与 cfg(target_abi) 关联

target specs 现在会对 LLVM ABI values 做更严格的检查,同时把这一点与 cfg(target_abi) 关联起来。这项改进有助于让目标规格更加一致和可靠。


十、这次版本更新的整体看点

综合来看,Rust 1.96.0 的核心看点有以下几个:

  1. 语言层面更灵活
    expr metavariable 可传给 cfg,tuple expressions 中 never 类型自动 coercion,宏和类型推导体验更好。

  2. 底层平台支持继续增强
    s390x inline assembly、LoongArch Linux link relaxation、riscv64gc-unknown-fuchsia baseline 更新,说明 Rust 在更多架构上持续完善。

  3. 标准库和核心 range 能力更成熟
    NonZero 范围迭代、多个 range 类型稳定化,意味着常用基础能力进一步正式落地。

  4. Cargo 更适合复杂依赖场景
    git 与 registry 组合依赖、cfg 条件 rustdocflags、以及安全修复,都值得升级。

  5. 文档工具更可控
    rustdoc 对弃用说明的渲染调整、侧边栏结构优化,提升了文档体验。

  6. 兼容性变化必须重视
    本次包含多个 breaking 或行为变化,尤其是 wasm、avr、Pin coercion、重复属性优先级、LLVM 最低版本等,都需要实际项目检查。


十一、升级建议

如果你正在维护 Rust 项目,升级到 1.96.0 前建议重点检查以下内容是否受影响:

  • 是否使用了 wasm 目标相关链接行为
  • 是否依赖 -Csoft-float
  • 是否使用 avr targets
  • 是否存在重复的 export_name / link_name / link_section 属性
  • 是否依赖以前允许但现在禁止的 struct 导入写法
  • 是否涉及 Pin 的 unsize coercion
  • 是否使用 return-position-impl-trait-in-traits 且类型可见性较复杂
  • 是否有依赖 uninhabited_static 相关 lint
  • 是否涉及 external LLVM 版本环境
  • 是否使用 JSON targets 配置 aarch64 softfloat
  • 是否使用 rustdoc 的弃用说明多行显示

如果上述场景命中,建议先在测试环境验证,再切换到正式版本。


十二、结语

代码地址:github.com/rust-lang/rust

Rust 1.96.0 是一次覆盖面很广的版本更新,既包含语言和库的能力增强,也包含 Cargo、安全修复、Rustdoc 体验优化以及多项兼容性调整。对于开发者来说,这次升级的价值非常明确:可用能力更多、平台支持更广、工具链行为更清晰,但同时也需要认真关注 breaking changes 和目标平台的特殊调整。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询