rust 1.96.0 更新:语言、编译器、Cargo、Rustdoc、兼容性全面升级,必看完整解读
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 的核心看点有以下几个:
语言层面更灵活
expr metavariable 可传给 cfg,tuple expressions 中 never 类型自动 coercion,宏和类型推导体验更好。底层平台支持继续增强
s390x inline assembly、LoongArch Linux link relaxation、riscv64gc-unknown-fuchsia baseline 更新,说明 Rust 在更多架构上持续完善。标准库和核心 range 能力更成熟
NonZero 范围迭代、多个 range 类型稳定化,意味着常用基础能力进一步正式落地。Cargo 更适合复杂依赖场景
git 与 registry 组合依赖、cfg 条件 rustdocflags、以及安全修复,都值得升级。文档工具更可控
rustdoc 对弃用说明的渲染调整、侧边栏结构优化,提升了文档体验。兼容性变化必须重视
本次包含多个 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 和目标平台的特殊调整。
