← 返回信息流
AI 资讯Hacker News·6 天前

Rust 1.96 正式发布

原标题:Announcing Rust 1.96

速览

Rust 编程语言发布了 1.96 版本。该版本通常包含编译器性能提升、标准库改进以及新的语言特性。作为系统级编程语言,Rust 的更新对底层基础设施和 AI 框架的底层依赖有重要意义。

AI 深度解读

Rust 1.96 发布深度解读

背景

Rust 团队近期正式发布了 Rust 1.96.0 稳定版。作为一门旨在让每个人都能构建可靠且高效软件的编程语言,Rust 的每一次版本迭代都备受开发者关注。对于已通过 rustup 安装 Rust 的用户,可以通过运行 rustup update stable 直接升级至 1.96.0 版本。

Rust 1.96.0 的发布标志着标准库在类型系统设计、调试宏便利性以及 WebAssembly 链接行为上的重要演进。此外,该版本还修复了涉及第三方注册表的两项安全漏洞,进一步提升了生态的安全性。

核心内容

1. 引入新的 Range 类型体系

本次更新最显著的变化是引入了基于 RFC3550 的新范围类型。长期以来,开发者期望 Range 及其相关 core::ops 类型具备 Copy 特性,但由于它们直接实现了 Iterator,同时实现 IteratorCopy 会导致设计陷阱(footgun),因此旧版本中并未赋予其 Copy 属性。

Rust 1.96.0 稳定了新的范围类型,这些类型实现了 IntoIterator 而非 Iterator,从而能够安全地实现 Copy。新增的稳定类型包括:

  • core::range::Range
  • core::range::RangeFrom
  • core::range::RangeInclusive
  • core::range::RangeToInclusive
  • 以及对应的迭代器类型(如 RangeIter, RangeFromIter 等)

主要特性与变化:

  • Copy 语义支持:新的范围类型允许开发者在不拆分 startend 的情况下,将切片访问器存储在 Copy 类型中。例如,可以定义一个 Span 结构体并派生 Clone, Copy,从而高效地传递范围信息。
  • 字段公开:与旧版本隐藏耗尽的迭代器状态不同,新的 RangeInclusive 将其字段公开,因为新类型在开始迭代前必须转换为迭代器,暴露状态不再构成风险。
  • 向后兼容与过渡
    • 现有的范围语法(如 0..1)目前仍生成旧的 legacy 类型。
    • 未来的 Rust 版本将引入 core::range::RangeFullcore::range::RangeTo,并将当前的范围类型移至 core::range::legacy::* 作为新范围的“旧版”归宿。
    • 库作者应在公共 API 中使用 impl RangeBounds 以同时接受旧版和新版范围类型。如果需要具体类型,建议优先使用新范围,因为未来这将成为默认行为。

2. 新增断言匹配宏

为了提升调试效率,Rust 1.96.0 引入了两个新宏:assert_matches!debug_assert_matches!

  • 功能:检查值是否匹配给定模式。如果不匹配,宏将 panic 并打印值的 Debug 表示。
  • 优势:这相当于 assert!(matches!(..)) 的简化版,但打印出的错误信息更直观,有助于更快地诊断失败原因。
  • 使用注意:由于这些宏名可能与流行的第三方 crate 冲突,它们未被加入标准预加载(prelude)。开发者需在使用前手动从 corestd 导入:
    use core::assert_matches;
    assert_matches!(get_random_number(), 1..=6);
    

3. WebAssembly 目标链接行为变更

Rust 1.96.0 改变了 WebAssembly 目标的链接行为,这是一个此前已在博客中预告的重要变更。

  • 变更细节:链接器不再默认传递 --allow-undefined 标志。
  • 影响
    • 以前:未定义的符号会被转换为来自 "env" 模块的 WebAssembly 导入,这可能导致链接通过但运行时报错或行为异常。
    • 现在:未定义的符号将直接导致链接错误。这有助于在构建阶段尽早捕获 bug,防止因符号命名或配置错误导致的意外问题。
  • 例外处理:如果确实需要旧行为(例如模拟未定义符号),可以通过设置环境变量 RUSTFLAGS=-Clink-arg=--allow-undefined 或在代码中使用 #[link(wasm_import_module = "env")] 来重新启用。

4. 其他稳定化 API

除了上述重大变更,以下 API 也在 1.96.0 中稳定:

  • From<T> for AssertUnwindSafe<T>
  • From<T> for LazyCell<T, F>
  • From<T> for LazyLock<T, F>

5. 安全漏洞修复

Rust 1.96.0 修复了两个与第三方注册表相关的安全漏洞,但crates.io 用户不受影响

  • CVE-2026-5223(中等严重程度):涉及包含符号链接的 crate tarball 提取过程中的安全问题。
  • CVE-2026-5222(低严重程度):涉及规范化 URL 时的身份验证问题。

关键要点

  • 类型系统改进:新的 core::range 类型实现了 Copy 语义,解决了长期存在的性能与设计痛点,同时通过 RangeBounds trait 保持了向后兼容性。
  • 调试体验提升assert_matches! 宏提供了更清晰的失败信息,简化了模式匹配断言的编写。
  • WebAssembly 严谨性增强:默认禁止未定义符号链接,强制开发者在构建阶段解决符号缺失问题,提高了 Wasm 模块的健壮性。
  • 安全更新:修复了针对非 crates.io 第三方注册表用户的两个 CVE 漏洞,建议相关用户尽快升级。
  • 过渡期提示:现有代码中的范围语法仍使用旧类型,库作者应开始适配新的 core::range 类型以迎接未来的默认变更。

意义与影响

Rust 1.96.0 的发布体现了 Rust 语言在保持高性能和安全性的同时,不断打磨开发者体验(DX)和底层一致性的努力。

  1. 消除长期痛点:引入 Copy 的范围类型解决了 Rust 社区多年来关于 Range 类型是否应可复制的争论。这不仅提升了代码的简洁性,还避免了不必要的克隆开销,特别是在处理切片和字符串视图时。
  2. 强化构建时检查:WebAssembly 链接行为的变更是 Rust 对“尽早失败”(fail-fast)原则的贯彻。通过阻止未定义符号静默转换为导入,Rust 帮助 Wasm 开发者在编译阶段就发现潜在的配置错误,减少了部署后难以调试的问题。
  3. 生态安全性加固:尽管主要影响非 crates.io 用户,但修复注册表相关的漏洞表明 Rust 团队对供应链安全的持续关注。对于使用私有或第三方注册表的企业用户,升级至 1.96.0 是必要的合规与安全措施。

总体而言,Rust 1.96.0 是一个注重细节和长期稳定性的版本,它为库作者提供了更清晰的类型设计指南,为应用开发者提供了更友好的调试工具,并为 WebAssembly 开发者带来了更严格的链接保障。

查看原文 →blog.rust-lang.org