发布 Rust 1.84.0

2025 年 1 月 9 日 · Rust 发布团队

Rust 团队很高兴发布新版本 Rust 1.84.0。Rust 是一门赋予每个人构建可靠且高效软件能力的编程语言。

如果您之前通过 rustup 安装了 Rust,可以通过以下方式获取 1.84.0:

$ rustup update stable

如果您尚未安装,可以从我们网站的相应页面获取 rustup,并查看 1.84.0 的详细发布说明

如果您想通过测试未来版本来帮助我们,可以考虑在本地更新以使用 beta 通道 (rustup default beta) 或 nightly 通道 (rustup default nightly)。请随时报告您可能遇到的任何错误!

1.84.0 stable 版本包含什么

Cargo 在选择依赖版本时会考虑 Rust 版本

1.84.0 稳定了最低支持 Rust 版本 (MSRV) 感知的解析器,它优先选择与项目声明的 MSRV 兼容的依赖版本。通过 MSRV 感知的版本选择,维护者支持旧工具链的工作量减少了,无需手动为每个依赖选择旧版本。

您可以通过 .cargo/config.toml 选择启用 MSRV 感知的解析器

[resolver]
incompatible-rust-versions = "fallback"

然后在添加依赖时

$ cargo add clap
    Updating crates.io index
warning: ignoring clap@4.5.23 (which requires rustc 1.74) to maintain demo's rust-version of 1.60
      Adding clap v4.0.32 to dependencies
    Updating crates.io index
     Locking 33 packages to latest Rust 1.60 compatible versions
      Adding clap v4.0.32 (available: v4.5.23, requires Rust 1.74)

CI 中验证最新依赖时,您可以覆盖此设置

$ CARGO_RESOLVER_INCOMPATIBLE_RUST_VERSIONS=allow cargo update
    Updating crates.io index
     Locking 12 packages to latest compatible versions
    Updating clap v4.0.32 -> v4.5.23

您也可以通过在 Cargo.toml manifest 文件中设置 package.resolver = "3" 来选择启用,但这需要将您的 MSRV 提高到 1.84。新解析器将默认启用用于使用 2024 版的项目(该版本将在 1.85 中稳定)。

这为库作者在决定采用新 Rust 工具链功能的策略时提供了更大的灵活性。以前,采用新 Rust 工具链中功能的库会迫使使用旧 Rust 版本的下游用户升级其工具链,或手动选择与其工具链兼容的旧版本库(并避免运行 cargo update)。现在,这些用户将能够自动使用与其旧工具链兼容的旧版本库。

有关决定 MSRV 策略时的更多注意事项,请参阅文档

开始迁移到新的 trait 解析器

Rust 编译器正在迁移到新的 trait 解析器实现。下一代 trait 解析器是 Rust 类型系统核心组件的重新实现。它不仅负责检查 trait 约束(例如 Vec<T>: Clone)是否成立,还被类型系统的许多其他部分使用,例如规范化(弄清楚 <Vec<T> as IntoIterator>::Item 的底层类型)以及类型相等性检查(检查 TU 是否相同)。

在 1.84 中,新的解析器用于检查 trait 实现的一致性。在高层次上,一致性负责确保在考虑尚未编写或来自其他 crate 的可见代码时,对于给定类型最多只有一个 trait 实现。

这次稳定修复了旧实现的一些主要理论上的正确性问题,可能导致以前未报告的“trait 实现冲突...”错误。根据通过 Crater 对现有代码的评估,我们预计受影响的模式将非常罕见。这次稳定也提高了我们证明实现**不**重叠的能力,在某些情况下允许编写更多代码。

更多详情,请参阅之前的博客文章稳定报告

严格的 provenance API

在 Rust 中,指针不仅仅是“整数”或“地址”。例如,“释放后使用(use after free)”是未定义行为,即使您“运气好”,在您读写之前已释放的内存被重新分配了。再举一个例子,通过从 &i32 引用派生的指针进行写入是未定义行为,即使通过不同的指针写入同一地址是合法的。这里的潜在模式是,**计算指针的方式很重要**,而不仅仅是计算产生的地址。因此,我们说指针具有 **provenance**:为了完全描述 Rust 中与指针相关的未定义行为,我们不仅需要知道指针指向的地址,还需要跟踪它是从哪个(或哪些)其他指针“派生”出来的。

大多数情况下,程序员无需过多担心 provenance,指针如何派生出来也是非常清楚的。然而,当将指针强制转换为整数然后又转换回来时,结果指针的 provenance 是不明确的。通过此版本,Rust 正在添加一组 API,在许多情况下可以替代使用整数与指针之间的强制转换,从而避免此类转换固有的歧义。特别是,使用对齐指针的最低位存储额外信息的模式现在可以在不将指针强制转换为整数或又转换回来的情况下实现。这使得代码更容易理解,编译器更容易分析,并且也有益于像 MiriCHERI 这样的工具和架构,它们旨在检测和诊断指针误用。

更多详情,请参阅标准库中关于 provenance 的文档

稳定化的 API

这些 API 现在在 const 上下文中稳定

其他变更

查看 RustCargoClippy 中的所有变更。

1.84.0 的贡献者

许多人共同努力创建了 Rust 1.84.0。没有大家,我们无法做到。感谢大家!