Lints

在软件开发中, "lint" 是一个帮助你改善源代码的工具. Rust 编译器中包含了一些 lints, 并且它在编译你的代码时会运行这些 lints. 这些 lints 可能会产生警告,错误或者什么都没有,这些依赖于你对它的配置.

这里有一个小例子 :

$ cat main.rs
fn main() {
    let x = 5;
}
$ rustc main.rs
warning: unused variable: `x`
 --> main.rs:2:9
  |
2 |     let x = 5;
  |         ^
  |
  = note: `#[warn(unused_variables)]` on by default
  = note: to avoid this warning, consider using `_x` instead

这是 unused_variables lint, 并且它告诉你在代码中引入了你没有使用过的变量. 这不是一种 wrong (错误), 但可能是一个Bug, 因此你得到了一个警告.

Future-incompatible lints

(译者注:即对未来可能不兼容代码的警告) 有时为了修复可能导致现存代码停止编译的问题,需要改进编译器,在这种情况下,为了能顺利向新的改进变迁,会向 Rust 用户( users )发出 Future-incompatible lints 。最初,编译器会继续接受有问题的代码并发出警告,该警告包含问题描述和一个这将在未来成为错误的提示,还有一条跟踪问题的链接,此链接提供了关于该问题的详细信息和反馈问题的机会。这给了用户修复代码以适应修改的时间。一段时间后,该警告可能会变成一个错误。

以下是一个 future-incompatible 的例子:

warning: borrow of packed field is unsafe and requires unsafe function or block (error E0133)
  --> lint_example.rs:11:13
   |
11 |     let y = &x.data.0;
   |             ^^^^^^^^^
   |
   = note: `#[warn(safe_packed_borrows)]` on by default
   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
   = note: for more information, see issue #46043 <https://github.com/rust-lang/rust/issues/46043>
   = note: fields of packed structs might be misaligned: dereferencing a misaligned pointer or even just creating a misaligned reference is undefined behavior

有关更多 future-incompatible 流程和策略的变更,请查阅 RFC 1589