宣布 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 禁用的项

您可以使用 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_dropsundropped_manually_drops(拒绝)

    • ManuallyDrop 不会丢弃其内部值,因此在它上面调用 std::mem::drop 不会有任何作用。相反,lint 会建议首先使用 ManuallyDrop::into_inner,或者您可以使用不安全的 ManuallyDrop::drop 在原地运行析构函数。此 lint 默认被拒绝。
  • clippy::invalid_utf8_in_uncheckedinvalid_from_utf8_unchecked(拒绝)和 invalid_from_utf8(警告)

    • 第一个检查对 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_naninvalid_nan_comparisons(警告)

    • 这检查了与 f32::NANf64::NAN 作为其中一个操作数的比较。NaN 无法与任何东西进行有意义的比较 - 甚至不能与自身进行比较 - 因此这些比较始终为假。此 lint 默认是一个警告,并将建议改为调用 is_nan() 方法。
  • clippy::cast_ref_to_mutinvalid_reference_casting(允许)

    • 这检查了 &T&mut T 的强制转换,而没有使用内部可变性,这会导致立即未定义的行为,即使引用未被使用。此 lint 目前默认允许,因为存在潜在的误报,但计划在 1.73 中实现改进后默认拒绝。

稳定的 API

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

其他更改

查看RustCargoClippy 中的所有更改。

未来的 Windows 兼容性

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

更新:计划将 Windows 的最低支持级别提高到 1.78,该版本将于 2024 年 5 月发布。

1.72.0 的贡献者

许多人共同创建了 Rust 1.72.0。没有你们,我们无法做到。 感谢!