生锈1.52.1.

2021-05-10 23:06:00

Rust团队已准备好新版本,1.52.1,围绕一个错误的汇编,在1.52.0中进行了编译错误。 WERECENMEND所有生锈用户,包括目前使用稳定版本的PRIORTO 1.52.0,升级到1.52.1或禁用增量编译。关于HOWTO的指导如下。

如果您有通过Rustup安装的先前版本的RUDE,则rust1.52.1可以轻松:

如果您已将其'它已经有了它,您可以在我们的网站上使用合适的页面来获得RustUp.

此版本在1.52.0上围绕破碎构建工作,这是由新的验证引起的。此验证检测到所有rustVersions 1中存在错误,并且可以在增量构建中触发MIScompilation,因此下降到先前的稳定版本不是修复。

如果在先前版本,则鼓励用户升级到1.52.1或在其LocalEnvironment中禁用增量:请参阅您应该有关如何执行此操作的详细信息。

默认情况下,增量编译默认为发布构建,因此应该影响少量生产库(仅适用于选择的用户)。

从增量编译中的错误可能出现的误解是在基本节省的基本上产生错误的代码,基本上产生格式错误的二进制文件,这意味着在理论中的行为中是可能的。在实践中,我们目前只意识到一个初始的已知的误解,但由于增量导致的错误是令人缺乏追踪的错误:用户经常在一些光线编辑的情况下重建ifthey从他们的二进制文件中看到意外结果,并且这通常会促成修复错误以修复错误)。

如果您在项目上看到不稳定的指纹,请告诉您您应该怎么做,

错误消息看起来像这样,钥匙件是" foundunstable指纹"文本。

线程' rustc'恐慌'断言失败:`(左==右)`左:`某些(指纹(4565771098143344972,786944575526300234))`,右:`某些(指纹(14934403843752251060,62348415826468126))`:找到了&lt的不稳定指纹;庞大的文本描述了RustC内部的Elided>错误:内部编译器错误:意外Panicnote:编译器意外慌乱。这是一个错误。

这是由内部一致性检查引起的错误,如诊断所说,它会产生一个"内部编译器错误" (或冰)。换句话说,它代表了生锈编译器本身的内部结构中的错误。在这种情况下,ICE正在揭示增量编译中的错误,该错误预测1.52.0释放,如果没有被捕获,可能会导致错误组合。

Rust编译器支持"增量编译"已在2016年博客文章中描述。当上打开增量编译时,编译器将输入源打破成碎片,并跟踪这些输入部分如何影响最终的构建产品。然后,当输入更改时,它会检测到此处的伪像并从以前的构建中重复使用伪影,努力支持努力建立需要响应输入源代码的更改的部件。

指纹是用于检测输入时的架构的一部分。更具体地,指纹(以及建立上下文的一些其他状态)是旨在唯一地识别编译器中使用的内部值的128位值。某些编译器内部结果存储在磁盘上("在运行之间的缓存和#34;)。指纹用于验证新计算结果是否从缓存的结果中不变。 (有关此内容的更多详细信息,请参阅RustC开发指南的相关章节。)

指纹稳定性检查是一种安全性断言指纹的内部一致性。有时,编译器被强制重新运行查询,并且最终输出与先前的增量编译会话相同。然后,启用了验证检查该值确实如预期,而不是假设所以。在某些情况下,由于编译器中的错误和实现的错误,这实际上并非如此。

我们最初将这些指纹检查添加为使用Whendeveloping rustC本身的工具,返回2017年。它仅通过不稳定的-Z标志提供,仅适用于夜间和开发构建。

最近,在3月,我们遇到了一种误解我们,默认情况下导致我们打开验证-Ich。 Rust编译团队决定捕捉指纹问题并中止编译,而不是允许潜在的误解(以及随后的不端行为)潜入铁锈程序员'二进制文件。

当我们默认第一次打开指纹检查时,夜间(和测试版)工具链提交的问题存在稳定的问题,并且已经在识别修复上进行了稳定的问题,其中许多已经有了Aleadylanded。

在过去的一周里,我们开始制定计划来提高观察者体验,以便检查诊断会做一个更好的job,告诉程序员在回应中做些什么。不幸的是,这是在假设新验证的假设下,在1.53,Not1.52中发货。

今天'■新版本,1.52.1,通过临时将Rust编译器中的默认值更改为禁用的默认值,除非用户意识到选择。

基本上,对于一些条件,某些编辑汇编循环序列将导致RustC击中"不稳定的指纹"冰。我在这个博客帖子的开始时展示了一个例子。

线程' rustc' &#39恐慌;找到了regiricates_of的不稳定指纹(<描述rustc内部的巨型文本>)' /strustc/.../compiler/rustc_query_system/src/query/plumbing.rs:593:5

当在将磁盘上的增量编译缓存与在当前rustc调用期间计算的值进行比较时,它们都会因不一致而产生的,这意味着它们都会因使用增量编译而出现。

您可以使用DEV或测试配置文件构建,默认为启用增量编译。

如果您的项目未调整默认值,则在运行Cargo Build - 释放或以其他方式在所有RUST版本1上的发布配置文件配置中,并且这些问题不应影响您的royefabuilds。

内部编译器错误要求您报告一个错误,如果可以这样做,我们仍然希望该信息。我们想知道对失败的案例。

但是,无论您是否提交错误,都可以通过以下任一终止问题:

升级到1.52.1,如果您还没有这样做(将为您禁用)或

通过在环境中设置cargo_incremental = 0或构建,迫使禁用增量编译。在config.toml中,在config.toml中设置为false。

我们不建议将1.52.0的用户降级到早期版本的RURE,以响应此问题。如上所述,至少在我们添加指纹检查之前没有捕获的增量编译引起的静默错误组合的一个实例。

如果用户愿意处理增量验证ICE' s,并且Wellesto选择回到1.52.0行为,他们可以将RustC_Force_incremental设置为1在其环境中。然后,Rust编译器将尊重货物传递的-cinecrenceal选项,并且在添加验证之前,事情将如之前工作。请注意,此标志不会启用增量IFIT尚未单独启用(无论是货物还是其他方式)。

如果您目前在1.52.0之前使用工具箱,并希望继续继续,我们建议您禁用增量编译以避免佩特数错营。

在所有Rust构建以来,由于增量降落了,它是许多用户编制时期的主要内容,并且只会随着时间的推移而得到改善。编织此处提出的解决方法和建议是痛苦的,并将努力确保局势尽可能临时。

禁用Rust编译器中的增量编译(除非由重建环境变量询问,rustc_force_incremental = 1)。

如果启用了增量编译,请提高新验证的诊断输出,指示如何通过清除增量状态汇总增量来解决错误。

这是一种缓解,帮助大多数生锈用户升级到一个安全的生锈编译器的升级路径,这与他们的代码中的风险没有风险,而且还提供愿意处理这么做的用户的选择。

我们预计将继续积极投资来修复错误,并且根据对修复的信心,可能会发出1.52.2点释放,返回稳定的通道。希望帮助我们测试的用户可以使用hisightly频道,并将错误_ rust-lang / fort报告与他们的任何同幂相似。

我们目前还没有计划在测试渠道上禁用增量,但该决定尚未牢固致力于。今天,许多修复在1.53β今天不可曝光,因此希望继续使用增量的用户想要切换到该用户。每晚都会始终拥有最新的修复。

长期计划是解决错误!增量编译是生锈编译器能够为所有程序员提供快速编辑编译运行周期的唯一现实方式,因此我们需要解决迄今为止验证的所有问题。 (这份写作中有32个问题,但很多都是重复的。)

我们正在积极投资这一点,并且已经存在了许多错误并已修复。根据修复的状态,未来的StableElexaess(1.53和向上)可能会重新启用增量编译。

生锈团队也将开发计划,以确保我们在未来有更好的跟踪系统,以便在漏洞中防止这样的错误,而且还可以更准确地提高追踪频道的追踪错误的稳定性。