专业的编程技术博客社区

网站首页 > 博客文章 正文

Rust 1.81.0 发布(rust 2021 edition)

baijin 2025-03-14 14:43:45 博客文章 14 ℃ 0 评论



2024年9月5日 · Rust 发布团队

Rust 团队很高兴宣布 Rust 的新版本 1.81.0。Rust 是一种赋能每个人构建可靠高效软件的编程语言。

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

$ rustup update stable

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

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

Rust 1.81.0 稳定版中的新特性

core::error::Error

1.81 稳定了 core 中的 Error trait,允许在 #![no_std] 库中使用该 trait。这主要使得更广泛的 Rust 生态系统能够标准化使用相同的 Error trait,无论库针对的是什么环境。

新的排序实现

标准库中的稳定和不稳定排序实现都已更新为新算法,提高了运行时性能和编译时间。

此外,这两种新的排序算法都试图检测不正确的 Ord 实现,这些实现会阻止它们产生有意义的排序结果,现在会在这种情况下发生 panic,而不是返回实际上随机排列的数据。遇到这些 panic 的用户应该审核他们的排序实现,以确保它们满足 PartialOrdOrd 中记录的要求。

#[expect(lint)]

1.81 稳定了一个新的 lint 级别 expect,它允许明确注明应该出现特定的 lint,如果没有出现则发出警告。这个功能的预期用途是暂时静默某个 lint,无论是由于 lint 实现的 bug 还是正在进行的重构,同时希望知道何时不再需要该 lint。

例如,如果您正在移动代码库以遵守通过 Clippy lint(如
undocumented_unsafe_blocks
)强制执行的新限制,您可以在过渡期间使用 #[expect(
clippy::undocumented_unsafe_blocks)]
,确保一旦所有 unsafe 块都有文档,您就可以选择拒绝该 lint 来强制执行它。

Clippy 还有两个 lint 来强制使用这个功能并帮助迁移现有的属性:

  • clippy::allow_attributes 限制 allow 属性,支持使用 #[expect] 或将 #[allow] 属性迁移到 #[expect]
  • clippy::allow_attributes_without_reason 要求 #[allow] 属性提供理由

Lint 原因

更改 lint 级别通常是出于某种特定原因。例如,如果代码在没有浮点支持的环境中运行,您可以使用 Clippy 对此类用法进行 lint,如 #![deny(clippy::float_arithmetic)]。但是,如果项目的新开发人员看到这个 lint 触发,他们需要查找(希望有)一个解释为什么添加它的注释。从 Rust 1.81 开始,他们可以直接在编译器消息中得到通知:

稳定的 API

  • core::error
  • hint::assert_unchecked
  • fs::exists
  • AtomicBool::fetch_not
  • Duration::abs_diff
  • IoSlice::advance
  • IoSlice::advance_slices
  • IoSliceMut::advance
  • IoSliceMut::advance_slices
  • PanicHookInfo
  • PanicInfo::message
  • PanicMessage

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

  • char::from_u32_unchecked(函数)
  • char::from_u32_unchecked(方法)
  • CStr::count_bytes
  • CStr::from_ptr

兼容性说明

分离 panic hook 和 panic handler 参数

我们已将 std::panic::PanicInfo 重命名为 std::panic::PanicHookInfo。旧名称将继续作为别名工作,但从 Rust 1.82.0 开始将导致弃用警告。

core::panic::PanicInfo 将保持不变,因为这现在是一个不同的类型。

在 extern "C" 函数中未捕获的 panic 将中止

这完成了 1.71 中开始的过渡,该版本添加了专用的 -unwind ABI 变体(以及其他变体),用于预期跨 ABI 边界展开的情况。从 1.81 开始,非展开 ABI(例如 "C")现在将在未捕获的展开时中止,解决了长期存在的健全性问题。

依赖展开的程序应该过渡到使用 -unwind 后缀的 ABI 变体。

WASI 0.1 目标命名更改

使用 wasm32-wasi 目标(针对 WASI 0.1)现在将发出编译器警告,并要求用户切换到 wasm32-wasip1 目标。这两个目标是相同的,wasm32-wasi 只是被重命名,这个对 WASI 目标的更改是为了能够在 2025 年 1 月移除 wasm32-wasi

修复 CVE-2024-43402

std::process::Command 现在在 Windows 上调用批处理文件时,能正确转义参数,特别是在存在尾随空白或句点(被 Windows 忽略和去除)的情况下。

有关此更改的更多详细信息,请参阅之前的公告。

其他变更

查看 Rust、Cargo 和 Clippy 中的所有变更。

1.81.0 的贡献者

许多人共同创造了 Rust 1.81.0。没有你们所有人,我们无法做到这一点。感谢大家!

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表