NiQin (blog: 苍劲的驽马) shared the aphorism --
I returned and saw under the sun, that the race is not to the swift, nor the battle to the strong, neither yet bread to the wise, nor yet riches to men of understanding, nor yet favour to men of skill; but time and chance happeneth to them all. -- 《圣经》

[Rust] Rust 1.52.1 已正式发布,及其新特性详述

💥 内容涉及著作权,均归属作者本人。若非作者注明,默认欢迎转载:请注明出处,及相关链接。

Summary: Rust 团队新发布的 Rust 1.52.1,解决了一个增量编译中的 bug,这个 bug 在 1.52.0 中,会导致一个编译器错误。建议所有用户升级!本篇文章的目的是: 解释错误的具体表征; 在高层次上,解释检查(check)的作用; 解释 Rust 1.52.0 中,检查的具体展现; 在你的项目上,如果出现不稳定(unstable)的编译器指纹,告诉你如何做; 关于此问题,描述 Rust 团队的解决计划。

Topics: rust rust-官方博客 cargo

Rust 官方博客(中文版)仓库为 github.com/zzy/blog.rust-lang.org-zh-cn,欢迎您的参与,一起丰富中文网络的 Rust 资源。

2021 年 5 月 10 日,Felix Klock 和 Mark Rousskov 代表 Rust 编译器团队发布文章 Announcing Rust 1.52.1,官宣发布 Rust 1.52.1。

以下为官方公告原文——

Rust 团队新发布的 Rust 1.52.1,解决了一个增量编译中的 bug,这个 bug 在 1.52.0 中,会导致一个编译器错误。我们建议所有 Rust 用户(包括使用 1.52.0 及之前稳定版本的用户)升级到 1.52.1,或者也可以禁用增量编译。如下是升级指导。

如果你已通过 rustup 安装了 Rust 的早期版本,那么更新到 Rust 1.52.1 相当容易:

rustup update stable

如果您还未安装过 Rust,可以从 Rust 官网页面获取 rustup

如果官方途径安装速度较慢,可以配置 Rust 工具链的国内源,请参阅《配置 Rust 工具链的国内源》。

概要说明

此次发布,是针对 1.52.0 版本上的问题构建的,这些问题因新添加的验测而起。此次验测工作检测到的 bug,存在于 Rust 1.24 之后的版本中(因为增量编译是自 Rust 1.24 启用)。并且可能触发增量构建中的错误编译,因此降级到以前的稳定版本,并非解决方案。

因此,建议所有用户升级到 1.52.1,或在本地环境中禁用增量(如果使用 1.52.0 及之前版本):有关如何禁用增量的详细信息,请参阅小节:Rust 程序员该做的事情

增量编译,在缺省情况下是关闭的,因此很少有生产环境的构建会受到影响(仅对选择启用的用户有影响)。

增量编译中的错误,可能会导致错误的编译!从而在最终的工件中,生成不正确的代码,既是会生成格式错误的二进制文件。这意味着,理论上,任何行为都是可能的。在实践中,我们目前只发现了一个特定的已知错误,但由于增量错误是出了名的难以追踪:如果用户从二进制文件中看到意外的结果,他们通常会在进行轻度重构后重新构建。这时,通常会进行充分的重新编译,可以修复错误。

本篇文章的目的是:

  1. 解释错误的具体表征
  2. 在高层次上,解释检查(check)的作用
  3. 解释 Rust 1.52.0 中,检查的具体展现
  4. 在你的项目上,如果出现不稳定(unstable)的编译器指纹,告诉你如何做
  5. 关于此问题,描述 Rust 团队的解决计划

错误的具体表征?

错误消息是类似于这样的展现,关键部分文本是:“found unstable fingerprints”。

thread 'rustc' panicked at 'assertion failed: `(left == right)`
  left: `Some(Fingerprint(4565771098143344972, 7869445775526300234))`,
  right: `Some(Fingerprint(14934403843752251060, 623484215826468126))`: found unstable fingerprints for <massive text describing rustc internals elided>

error: internal compiler error: unexpected panic

note: the compiler unexpectedly panicked. this is a bug.

这是内部一致性检查导致的错误,如诊断中所述,它会产生“内部编译器错误”,也称作 ICE。换句话说,它代表了 Rust 编译器内部的一个 bug。具体在本例中,既是 ICE 揭示了关于增量编译的一个 bug。在早于 1.52.0 的版本中,或许没有捕获到它,但可能会导致错误编译。

什么是编译器指纹(fingerprints),为什么我们要对其检查?

Rust 编译器支持“增量编译”,在 2016 年的博客文章中,对有描述。当增量式编译开启时,编译器会将输入源分割成多个片段,并追踪这些输入片段如何影响最终的构建产品。然后,当输入发生变化时,它会检测到这一点并重用以前构建的工件,努力让构建需要的响应输入,仅在源代码发生变化的部分上花费精力。

编译器指纹(fingerprints)是我们体系结构的一部分,用来检测输入变化。更具体地说,编译器指纹(fingerprints,以及建立上下文的一些其它状态)是一个 128 位的值,用于唯一标识编译器中使用的内部值。某些编译器内部结果,在运行时缓存(cached)在磁盘上。编译器指纹(fingerprints)用于验证新计算的结果,是否与缓存的结果相同(有关这方面的详细信息,请参阅《rustc 开发指南》的相关章节)。

编译器指纹(fingerprints)的稳定性检查,是维护编译器指纹(fingerprints)内部一致性的保障措施。有时,编译器被迫重新运行检查,并期望输出与以前会话的增量编译输出相同。新启用的验证,将检查该值是否确实如预期的那样,而不是假设是这样。但在某些情况下,由于编译器实现中的错误,实际情况并非如此。

历史回溯

我们将编译器指纹(fingerprints)检查作为 rustc 开发工具的最初时间,是在 2017 年。它是作为一个不稳定的(unstable)标志 -Z 提供的,只对 nightly 版和开发版的构建可用。

最近,在 3 月份,我们遇到了一个错误编译,导致我们在默认情况下打开了 verify-ich。Rust 编译器团队认为:最好是捕获编译器指纹(fingerprints)问题并中止编译,而不是允许潜在的错误编译(以及随后的错误行为),以防止错误潜入二进制文件中。

当我们第一次默认开启编译器指纹(fingerprints)检查时,nightly 和 beta 版工具链的用户,会不断提交问题(issues),并且在修复方面也取得了稳步进展。其中一些已经解决。

上周,我们已经开始编制改善用户体验的计划,这样检查发出的诊断就可以更好地告诉程序员应该做什么。不幸的是,这样做的前提是:新的验证本将在 1.53 中发布,而非 1.52。

但最近发布的版本 Rust 1.52.0(请参阅 Rust 1.52.0 已正式发布,及其新特性详述),启用了 verify-ich

今天的新版本 Rust 1.52.1,解决了因新添加的验证而导致的问题。此版本中,临时将 Rust 编译器中的默认值更改为禁用增量编译,除非用户有意选择启用。

为什么会出现此问题?

从本质上讲,对于某些 crate,特定的编辑-编译(edit-compile)周期序列,将导致 rustc 遇到“不稳定指纹(unstable fingerprints)”的内部编译错误(ICE)。如文章开头展示的例子所示。

我们再来看看另一个例子的编译错误:

thread 'rustc' panicked at 'found unstable fingerprints for predicates_of(<massive text describing rustc internals elided>)', /rustc/.../compiler/rustc_query_system/src/query/plumbing.rs:593:5

它们具有相同原因,将存储在磁盘上的增量编译缓存与当前 rustc 调用期间计算的值进行比较时,出现了不一致情况。这意味着,它们都是由于使用增量编译造成的。

如下方法可以开启增量编译:

  1. 使用默认启用增量编译的 devtest 配置文件进行构建。
  2. 设置环境变量 CARGO_INCREMENTAL=1
  3. 设置 Cargo config 文件,启用 build.incremental
  4. 设置 Cargo.toml,启用 incremental

如果项目中没有调整默认值,那么当运行 cargo build --release 时,或在 release 配置文件中,所有 Rust 1.x 都将禁用增量编译。这些问题,不应该影响你的版本发布。

Rust 程序员该做的事情

如果你遇到内部编译器错误,请你报告此 bug。我们仍然需要该方面的信息,想知道失败的案例。

但是,无论你是否提交 bug,你都可以通过以下方式解决问题:

  1. 升级到 1.52.1,将会为你禁用增量编译。或者
  2. 删除增量编译缓存(例如,运行 cargo clean),或者
  3. 通过在环境变量中设置 CARGO_INCREMENTAL=0,或在 config.toml 中指定 build.incrementalfalse,强制禁用增量编译。

我们推荐用户都将 1.52.0 升级为 to 1.52.1,这样做即可禁用增量编译。

我们不建议 Rust 1.52.0 的用户,为了应对这个问题而降级到 Rust 的早期版本。如上所述,至少有一个实例,由于增量编译导致了错误编译。在我们添加编译器指纹(fingerprints)检查之前,错误未被捕获。

Rust 1.52.1 的用户,如果希望自行处理增量验证的 ICE(译注:内部编译错误)问题,并希望选择返回版本 1.52.0。则可以在环境变量中,设置 RUSTC_FORCE_INCREMENTAL=1。如此,Rust 编译器将执行 Cargo 传递的选项 -Cincremental,尽管添加了验证,但仍将以前版本一样工作。请注意,Rust 1.52.1 中,如果此标志尚未单独启用(无论是通过 Cargo 还是其它方式),则不会启用增量。

如果你当前正在使用 1.52.0 之前的工具链,并且希望继续这样做,我们建议你禁用增量编译,以避免出现无提示的错误编译。

自从增量编译启用以来,在所有的 Rust 构建中,编译时间对许多用户来说,都是一个重大的改进,而且会随着时间的推移而逐步改进。我们承认,这里提出的解决办法和建议,多用户来说是痛苦的,我们将努力保证这只是暂时的解决方案。

Rust 团队如何解决此问题?

译注:计划方面,和上文多有重复,即是配置环境变量和设置指定文件的反复。所以未再详细翻译,所有翻译开源在 github.com/zzy/blog.rust-lang.org-zh-cn,欢迎你补充和完善。

短期计划

既是我们发布了此 1.52.1 版本。

长期计划

修复错误。

谢谢您的阅读!


Related Articles

  1. [Rust] iRust.net:基于 Rust-Web 技术栈,及 image-rs、fluent-rs、rhai-script ……
  2. [WebAssembly] yew SSR 服务器端渲染
  3. [Rust] async-std 创建者对于最近“项目是否已死?”,移除对其支持等的答复
  4. [Rust] Rust 1.56.0 版本和 Rust 2021 版次发布,新特性一览,及项目的迁移、升级
  5. [WebAssembly] Rust 和 Wasm 的融合,使用 yew 构建 WebAssembly 博客应用的体验报告
  6. [Rust] Rust 官方周报 399 期(2021-07-14)
  7. [WebAssembly] Rust 和 Wasm 的融合,使用 yew 构建 web 前端(5)- 构建 HTTP 请求、与外部服务器通信的两种方法
  8. [Rust] Rust 官方周报 398 期(2021-07-07)
  9. [Rust] Rust 官方周报 397 期(2021-06-30)
  10. [Rust] Rust 官方周报 396 期(2021-06-23)
  11. [Rust] Rust 官方周报 395 期(2021-06-16)
  12. [Rust] Rust 1.53.0 明日发布,关键新特性一瞥
  13. [Rust] 使用 tide、handlebars、rhai、graphql 开发 Rust web 前端(3)- rhai 脚本、静态/资源文件、环境变量等
  14. [Rust] 使用 tide、handlebars、rhai、graphql 开发 Rust web 前端(2)- 获取并解析 GraphQL 数据
  15. [Rust] 使用 tide、handlebars、rhai、graphql 开发 Rust web 前端(1)- crate 选择及环境搭建
  16. [Rust] Rust 官方周报 394 期(2021-06-09)
  17. [Rust] Rust web 前端库/框架评测,以及和 js 前端库/框架的比较
  18. [WebAssembly] Rust 和 Wasm 的融合,使用 yew 构建 web 前端(4)- 获取 GraphQL 数据并解析
  19. [WebAssembly] Rust 和 Wasm 的融合,使用 yew 构建 web 前端(3)- 资源文件及小重构
  20. [WebAssembly] Rust 和 Wasm 的融合,使用 yew 构建 WebAssembly 标准的 web 前端(2)- 组件和路由
  21. [WebAssembly] Rust 和 Wasm 的融合,使用 yew 构建 WebAssembly 标准的 web 前端(1)- 起步及 crate 选择
  22. [Rust] Rust 官方周报 393 期(2021-06-02)
  23. [Rust] Rust 官方周报 392 期(2021-05-26)
  24. [Rust] Rust 中,对网址进行异步快照,并添加水印效果的实践
  25. [Rust] Rust 官方周报 391 期(2021-05-19)
  26. [Rust] Rust,风雨六载,砥砺奋进
  27. [Rust] 为什么我们应当将 Rust 用于嵌入式开发?
  28. [Rust] Rust 官方周报 390 期(2021-05-12)
  29. [Rust] Rust + Android 的集成开发设计
  30. [Rust] Rust 1.52.1 已正式发布,及其新特性详述
  31. [Rust] 让我们用 Rust 重写那些伟大的软件吧
  32. [Rust] Rust 1.52.0 已正式发布,及其新特性详述
  33. [Rust] Rust 官方周报 389 期(2021-05-05)
  34. [GraphQL] 基于 actix-web + async-graphql + rbatis + postgresql / mysql 构建异步 Rust GraphQL 服务(4) - 变更服务,以及小重构
  35. [Rust] Rust 1.52.0 稳定版预发布测试中,关键新特性一瞥
  36. [Rust] Rust 生态中,最不知名的贡献者和轶事
  37. [Rust] Rust 基金会迎来新的白金会员:Facebook
  38. [Rust] Rustup 1.24.1 已官宣发布,及其新特性详述
  39. [Rust] Rust 官方周报 388 期(2021-04-28)
  40. [Rust] Rust 官方周报 387 期(2021-04-21)
  41. [GraphQL] 构建 Rust 异步 GraphQL 服务:基于 tide + async-graphql + mongodb(4)- 变更服务,以及第二次重构
  42. [Rust] Rustup 1.24.0 已官宣发布,及其新特性详述
  43. [Rust] basedrop:Rust 生态中,适用于实时音频的垃圾收集器
  44. [Rust] Rust 编译器团队对成员 Aaron Hill 的祝贺
  45. [Rust] Jacob Hoffman-Andrews 加入 Rustdoc 团队
  46. [机器人] 为什么应将 Rust 引入机器人平台?以及机器人平台的 Rust 资源推荐
  47. [Rust] rust-lang.org、crates.io,以及 docs.rs 的管理,已由 Mozilla 转移到 Rust 基金会
  48. [Rust] Rust 官方周报 386 期(2021-04-14)
  49. [Rust] Rust 编译器(Compiler)团队 4 月份计划 - Rust Compiler April Steering Cycle
  50. [GraphQL] 基于 actix-web + async-graphql + rbatis + postgresql / mysql 构建异步 Rust GraphQL 服务(3) - 重构
  51. [Rust] 头脑风暴进行中:Async Rust 的未来熠熠生辉
  52. [GraphQL] 基于 actix-web + async-graphql + rbatis + postgresql / mysql 构建异步 Rust GraphQL 服务(2) - 查询服务
  53. [GraphQL] 基于 actix-web + async-graphql + rbatis + postgresql / mysql 构建异步 Rust GraphQL 服务 - 起步及 crate 选择
  54. [Rust] Rust 2021 版本特性预览,以及工作计划
  55. [Rust] Rust 用在生产环境的 42 家公司
  56. [Rust] 构建最精简的 Rust Docker 镜像
  57. [Rust] Rust 官方周报 385 期(2021-04-07)
  58. [Rust] 使用 Rust 做异步数据采集的实践
  59. [Rust] Android 支持 Rust 编程语言,以避免内存缺陷
  60. [Rust] Android 平台基础支持转向 Rust
  61. [Rust] Android 团队宣布 Android 开源项目(AOSP),已支持 Rust 语言来开发 Android 系统本身
  62. [Rust] RustyHermit——基于 Rust 实现的下一代容器 Unikernel
  63. [Rust] Rustic:完善的纯粹 Rust 技术栈实现的国际象棋引擎,多平台支持(甚至包括嵌入式设备树莓派 Raspberry Pi、Buster)
  64. [Rust] Rust 迭代器(Iterator trait )的要诀和技巧
  65. [Rust] 使用 Rust 极致提升 Python 性能:图表和绘图提升 24 倍,数据计算提升 10 倍
  66. [Rust] 【2021-04-03】Rust 核心团队人员变动
  67. [Rust] Rust web 框架现状【2021 年 1 季度】
  68. [Rust] Rust 官方周报 384 期(2021-03-31)
  69. [Rust] Rust 中的解析器组合因子(parser combinators)
  70. [生活] 毕马威(KPMG)调查报告:人工智能的实际采用,在新冠疫情(COVID-19)期间大幅提升
  71. [Python] HPy - 为 Python 扩展提供更优秀的 C API
  72. [Rust] 2021 年,学习 Rust 的网络资源推荐(2)
  73. [Rust] 2021 年,学习 Rust 的网络资源推荐
  74. [生活] 况属高风晚,山山黄叶飞——彭州葛仙山露营随笔
  75. [Rust] Rust 1.51.0 已正式发布,及其新特性详述
  76. [Rust] 为 Async Rust 构建共享的愿景文档—— Rust 社区的讲“故事”,可获奖
  77. [Rust] Rust 纪元第 382 周最佳 crate:ibig 的实践,以及和 num crate 的比较
  78. [Rust] Rust 1.51.0 稳定版本改进介绍
  79. [Rust] Rust 中将 markdown 渲染为 html
  80. [生活] 国民应用 App 的用户隐私数据窥探
  81. [GraphQL] 构建 Rust 异步 GraphQL 服务:基于 tide + async-graphql + mongodb(3)- 重构
  82. [GraphQL] 构建 Rust 异步 GraphQL 服务:基于 tide + async-graphql + mongodb(2)- 查询服务
  83. [GraphQL] 构建 Rust 异步 GraphQL 服务:基于 tide + async-graphql + mongodb(1)- 起步及 crate 选择
  84. [Rust] Rust 操控大疆可编程 tello 无人机

Topics

rust(84)

graphql(17)

rust-官方周报(17)

webassembly(16)

wasm(10)

tide(9)

async-graphql(9)

yew(9)

rust-web(8)

rust-官方博客(8)

this-week-in-rust(6)

mysql(5)

actix-web(5)

rbatis(5)

android(4)

mongodb(3)

json-web-token(3)

jwt(3)

cargo(3)

技术延伸(3)

rust-wasm(3)

trunk(3)

handlebars(3)

rhai(3)

async-std(3)

用户隐私(2)

学习资料(2)

python(2)

ai(2)

人工智能(2)

postgresql(2)

rust-compiler(2)

rust-基金会(2)

rust-foundation(2)

rustup(2)

rust-toolchain(2)

rust-工具链(2)

rust-游戏开发(2)

rust-区块链(2)

rust-2021(2)

graphql-client(2)

surf(2)

rust-game(2)

rusthub(2)

tello(1)

drone(1)

无人机(1)

隐私数据(1)

markdown(1)

html(1)

crate(1)

async(1)

异步(1)

旅游(1)

不忘生活(1)

葛仙山(1)

hpy(1)

python-扩展(1)

正则表达式(1)

解析器组合因子(1)

组合器(1)

regular-expression(1)

parser-combinator(1)

regex(1)

官方更新(1)

rust-工作招聘(1)

rust-技术资料(1)

rust-周最佳-crate(1)

rust-web-框架(1)

rust-web-framework(1)

rust-核心团队(1)

rust-core-team(1)

rust-language-team(1)

pyo3(1)

rust-python-集成(1)

python-性能改进(1)

迭代器(1)

iterator-trait(1)

国际象棋(1)

chess(1)

游戏引擎(1)

game-engine(1)

虚拟化(1)

unikernel(1)

rustyhermit(1)

linux(1)

virtualization(1)

sandboxing(1)

沙箱技术(1)

数据采集(1)

异步数据采集(1)

docker(1)

镜像(1)

生产环境(1)

rust-评价(1)

rust-2021-edition(1)

rust-2021-版本(1)

graphql-查询(1)

vision-doc(1)

愿景文档(1)

代码重构(1)

steering-cycle(1)

方向周期(1)

隐私声明(1)

机器人(1)

robotics(1)

rustdoc(1)

rust-编译器(1)

实时音频(1)

real-time-audio(1)

变更服务(1)

mutation(1)

查询服务(1)

query(1)

rust-贡献者(1)

rust-轶事(1)

rust-稳定版(1)

rust-预发布(1)

rust-测试(1)

安全编程(1)

可信计算(1)

安全代码(1)

secure-code(1)

rust-android-integrate(1)

rust-embedded(1)

rust-嵌入式(1)

rust-生产环境(1)

rust-production(1)

网页快照(1)

网页截图(1)

水印效果(1)

图片水印(1)

yew-router(1)

css(1)

web-前端(1)

wasm-bindgen(1)

区块链(1)

blockchain(1)

dotenv(1)

标识符(1)

rust-1.53.0(1)

rust-1.56.0(1)

rust-项目升级(1)

异步运行时(1)

ssr(1)

tokio(1)

warp(1)

reqwest(1)

graphql-rust(1)


Elsewhere

- Open Source
  1. github/zzy
  2. github/sansx
- Learning & Studying
  1. Rust 学习资料 - iRust.net