宣布 Rust 1.72.0

2023年8月24日 · Rust 发布团队

Rust 团队很高兴地宣布 Rust 的新版本 1.72.0。Rust 是一种编程语言,旨在帮助每个人构建可靠且高效的软件。

如果您之前通过 rustup 安装了 Rust 版本,您可以使用以下命令获取 1.72.0:

$ rustup update stable

如果您还没有安装,您可以从我们网站的相应页面获取 rustup,并查看 GitHub 上 1.72.0 的详细发行说明

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

1.72.0 稳定版有哪些新内容

Rust 在错误报告中显示可能有用的 cfg-disabled 项

您可以使用 cfg 有条件地启用 Rust 代码,例如仅为某些 crate 功能或仅在特定平台上提供某些函数。以前,以这种方式禁用的项对于编译器来说实际上是不可见的。但是现在,编译器将记住这些项的名称和 cfg 条件,因此它可以报告(例如)如果您尝试调用的函数不可用,因为您需要启用一个 crate 功能。

   Compiling my-project v0.1.0 (/tmp/my-project)
error[E0432]: unresolved import `rustix::io_uring`
   --> src/main.rs:1:5
    |
1   | use rustix::io_uring;
    |     ^^^^^^^^^^^^^^^^ no `io_uring` in the root
    |
note: found an item that was configured out
   --> /home/username/.cargo/registry/src/index.crates.io-6f17d22bba15001f/rustix-0.38.8/src/lib.rs:213:9
    |
213 | pub mod io_uring;
    |         ^^^^^^^^
    = note: the item is gated behind the `io_uring` feature

For more information about this error, try `rustc --explain E0432`.
error: could not compile `my-project` (bin "my-project") due to previous error

常量求值时间现在没有限制

为了防止用户提供的常量求值进入编译时无限循环或在编译时花费无限的时间,Rust 之前限制了作为任何给定常量求值一部分运行的语句的最大数量。然而,特别有创意的 Rust 代码可能会达到这些限制并产生编译器错误。更糟糕的是,代码是否达到限制可能会因用户调用的库而异;如果您调用的库在一个函数中将一条语句拆分为两条,那么您的代码可能会编译失败。

现在,您可以在编译时执行无限量的常量求值。为了避免长时间编译而没有反馈,编译器将在您的编译时代码运行一段时间后始终发出一条消息,并在每次加倍的时间段后重复该消息。默认情况下,编译器还将在大量步骤后发出一个默认拒绝的 lint (const_eval_long_running) 以捕获无限循环,但您可以 allow(const_eval_long_running) 以允许特别长的常量求值。

从 Clippy 提升的 lint

几个来自 Clippy 的 lint 已被拉入 rustc

  • clippy::undropped_manually_drops 已提升为 undropped_manually_drops (deny)

    • ManuallyDrop 不会 drop 其内部值,因此对其调用 std::mem::drop 不会执行任何操作。相反,lint 会建议首先使用 ManuallyDrop::into_inner,或者您可以使用不安全的 ManuallyDrop::drop 来就地运行析构函数。此 lint 默认被拒绝。
  • clippy::invalid_utf8_in_unchecked 已提升为 invalid_from_utf8_unchecked (deny) 和 invalid_from_utf8 (warn)

    • 第一个检查对 std::str::from_utf8_uncheckedstd::str::from_utf8_unchecked_mut 的调用是否使用了无效的 UTF-8 字面量,这违反了它们的安全性先决条件,导致未定义的行为。此 lint 默认被拒绝。
    • 第二个检查对 std::str::from_utf8std::str::from_utf8_mut 的调用是否使用了无效的 UTF-8 字面量,这将始终返回错误。此 lint 默认是一个警告。
  • clippy::cmp_nan 已提升为 invalid_nan_comparisons (warn)

    • 这会检查与 f32::NANf64::NAN 之一作为操作数的比较。NaN 与任何东西(甚至它自己)都没有有意义的比较,因此这些比较始终为 false。此 lint 默认是一个警告,并将建议调用 is_nan() 方法。
  • clippy::cast_ref_to_mut 已提升为 invalid_reference_casting (allow)

    • 这会检查在不使用内部可变性的情况下将 &T 转换为 &mut T 的情况,即使引用未使用,这也是立即的未定义行为。由于潜在的误报,此 lint 当前默认允许,但计划在 1.73 版本中在实现改进后默认拒绝。

稳定的 API

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

其他更改

查看 Rust, Cargo, 和 Clippy 中的所有更改。

未来的 Windows 兼容性

在未来的版本中,我们计划将最低支持的 Windows 版本提高到 10。编译器 MCP 651 中接受的提案是 Rust 1.75 将是最后一个正式支持 Windows 7、8 和 8.1 的版本。当 Rust 1.76 于 2024 年 2 月发布时,将仅支持 Windows 10 及更高版本作为 tier-1 目标。此更改将同时适用于主机编译器和编译目标。

更新:计划提高 Windows 最低支持级别的计划已推迟到 Rust 1.78,预计于 2024 年 5 月发布。

1.72.0 的贡献者

许多人齐心协力创建了 Rust 1.72.0。没有你们大家,我们不可能做到这一点。 谢谢!