
Rust 1.96.0 于 2026 年 5 月 29 日正式发布这次版本更新覆盖语言特性、编译器支持、标准库能力、Cargo 构建行为、Rustdoc 展示方式以及一批重要兼容性调整与内部改进。对使用 Rust 的开发者来说这不仅是一次常规升级更是一份值得仔细阅读的版本变更清单因为其中既有可直接使用的新能力也有可能影响现有项目的兼容性变化。一、Rust 1.96.0 发布概览Rust 1.96.0 的发布时间是 2026 年 5 月 29 日版本号为 1.96.0。本次更新内容分布非常广覆盖了以下几个大方向LanguageCompilerLibrariesStabilized APIsCargoRustdocCompatibility NotesInternal 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 baselineriscv64gc-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 ToSocketAddrRust 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 LazyCellT, FLazyCellT, F 现在也支持 From。5. From for LazyLockT, FLazyLockT, F 同样支持 From。6. core::range::RangeToInclusive7. core::range::RangeToInclusiveIter8. core::range::RangeFrom9. core::range::RangeFromIter10. core::range::Range11. 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(…)’.rustdocflagsCargo 配置现在新增了 target.‘cfg(…)’.rustdocflags 支持。这个变化让 rustdocflags 的配置更灵活可以按 cfg 条件进行设置。3. 修复 CVE-2026-5222 和 CVE-2026-5223Cargo 本次还修复了两个安全问题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 lintRustdoc 现在不会在 impl items 上触发 missing_doc_code_examples lint。这有助于减少不必要的文档 lint 干扰。3. 侧边栏中分离 methods 和 associated functionsRustdoc 现在在侧边栏中将 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-undefinedrustc 现在不再在 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 privateRust 1.96.0 现在会报错。这是一个可见的编译行为变化。6. 在依赖中报告 uninhabited_static lint并设为 deny-by-defaultuninhabited_static lint 现在会在 dependencies 中报告并且成为 deny-by-default。该变化会影响依赖代码的编译结果。7. 分布式构建中的 windows-gnu 现在包含 non-split debuginfoDistributed builds 现在对 windows-gnu 提供 non-split debuginfo。官方说明这会提升 backtraces 的质量但不会影响 rustc/cargo 在这些目标上的默认输出行为。8. 检查 const generic arguments 在更多位置是否正确 typingRust 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 到 21Rust 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 targetsaarch64 softfloat targets 需要 rustc_abi 为 softfloat对于 JSON targetsaarch64 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 可传给 cfgtuple 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/rustRust 1.96.0 是一次覆盖面很广的版本更新既包含语言和库的能力增强也包含 Cargo、安全修复、Rustdoc 体验优化以及多项兼容性调整。对于开发者来说这次升级的价值非常明确可用能力更多、平台支持更广、工具链行为更清晰但同时也需要认真关注 breaking changes 和目标平台的特殊调整。