绒毛级别

rustc 中,绒毛分为五个_级别_

  1. 允许
  2. 警告
  3. 强制警告
  4. 拒绝
  5. 禁止

每个绒毛都有一个默认级别(在本节后面的绒毛列表中解释),并且编译器有一个默认的警告级别。首先,让我们解释一下这些级别的含义,然后我们将讨论配置。

允许

这些绒毛存在,但默认情况下什么也不做。例如,考虑以下源代码

pub fn foo() {}

编译此文件不会产生任何警告

$ rustc lib.rs --crate-type=lib
$

但是这段代码违反了 missing_docs 绒毛。

这些绒毛的存在主要是为了通过配置手动启用,我们将在本节后面讨论。

警告

如果违反了绒毛,“警告”绒毛级别将产生警告。例如,以下代码违反了 unused_variables 绒毛

pub fn foo() {
    let x = 5;
}

这将产生以下警告

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

强制警告

“强制警告”是一个特殊的绒毛级别。它与“警告”相同,因为处于此级别的绒毛会产生警告,但与“警告”级别不同,“强制警告”级别不能被覆盖。如果一个绒毛被设置为“强制警告”,则保证会发出警告:不多也不少。即使通过 cap-lints 限制了整体绒毛级别,也是如此。

拒绝

如果违反了“拒绝”绒毛,则会产生错误。例如,以下代码遇到了 exceeding_bitshifts 绒毛。

fn main() {
    100u8 << 10;
}
$ rustc main.rs
error: bitshift exceeds the type's number of bits
 --> main.rs:2:13
  |
2 |     100u8 << 10;
  |     ^^^^^^^^^^^
  |
  = note: `#[deny(exceeding_bitshifts)]` on by default

绒毛产生的错误与普通的旧错误有什么区别?绒毛可以通过级别进行配置,因此与“允许”绒毛类似,默认情况下为“拒绝”的警告允许您允许它们。类似地,您可能希望将默认情况下为 warn 的绒毛设置为生成错误。此绒毛级别为您提供了这种功能。

禁止

“禁止”是一个特殊的绒毛级别,它对“拒绝”的作用与“强制警告”对“警告”的作用相同。它与“拒绝”相同,因为处于此级别的绒毛会产生错误,但与“拒绝”级别不同,“禁止”级别不能被覆盖为低于错误的任何级别。但是,绒毛级别仍然可以通过 --cap-lints 进行限制(见下文),因此 rustc --cap-lints warn 会使设置为“禁止”的绒毛仅发出警告。

配置警告级别

还记得我们在“允许”绒毛级别中提到的 missing_docs 示例吗?

$ cat lib.rs
pub fn foo() {}
$ rustc lib.rs --crate-type=lib
$

我们可以将此绒毛配置为在更高级别运行,可以使用编译器标志,也可以使用源代码中的属性。

您还可以“限制”绒毛,以便编译器可以选择忽略某些绒毛级别。我们将在最后讨论这个问题。

通过编译器标志

-A-W--force-warn-D-F 标志允许您将一个或多个绒毛转换为允许、警告、强制警告、拒绝或禁止级别,如下所示

$ rustc lib.rs --crate-type=lib -W missing-docs
warning: missing documentation for crate
 --> lib.rs:1:1
  |
1 | pub fn foo() {}
  | ^^^^^^^^^^^^
  |
  = note: requested on the command line with `-W missing-docs`

warning: missing documentation for a function
 --> lib.rs:1:1
  |
1 | pub fn foo() {}
  | ^^^^^^^^^^^^
$ rustc lib.rs --crate-type=lib -D missing-docs
error: missing documentation for crate
 --> lib.rs:1:1
  |
1 | pub fn foo() {}
  | ^^^^^^^^^^^^
  |
  = note: requested on the command line with `-D missing-docs`

error: missing documentation for a function
 --> lib.rs:1:1
  |
1 | pub fn foo() {}
  | ^^^^^^^^^^^^

error: aborting due to 2 previous errors

您还可以多次传递每个标志来更改多个绒毛

$ rustc lib.rs --crate-type=lib -D missing-docs -D unused-variables

当然,您可以将这五个标志混合在一起使用

$ rustc lib.rs --crate-type=lib -D missing-docs -A unused-variables

这些命令行参数的顺序会被考虑在内。以下示例允许 unused-variables 绒毛,因为它是该绒毛的最后一个参数

$ rustc lib.rs --crate-type=lib -D unused-variables -A unused-variables

您可以利用此行为来覆盖一组绒毛中特定绒毛的级别。以下示例拒绝 unused 组中的所有绒毛,但明确允许该组中的 unused-variables 绒毛(禁止仍然优先于所有其他级别,无论顺序如何)

$ rustc lib.rs --crate-type=lib -D unused -A unused-variables

由于 force-warnforbid 不能被覆盖,因此设置其中一个将阻止同一绒毛的任何后续级别生效。

通过属性

您还可以使用 crate 级别的属性修改绒毛级别

$ cat lib.rs
#![warn(missing_docs)]

pub fn foo() {}
$ rustc lib.rs --crate-type=lib
warning: missing documentation for crate
 --> lib.rs:1:1
  |
1 | / #![warn(missing_docs)]
2 | |
3 | | pub fn foo() {}
  | |_______________^
  |
note: lint level defined here
 --> lib.rs:1:9
  |
1 | #![warn(missing_docs)]
  |         ^^^^^^^^^^^^

warning: missing documentation for a function
 --> lib.rs:3:1
  |
3 | pub fn foo() {}
  | ^^^^^^^^^^^^

warnallowdenyforbid 都以这种方式工作。没有办法使用属性将绒毛设置为 force-warn

您还可以在每个属性中传递多个绒毛

#![warn(missing_docs, unused_variables)]

pub fn foo() {}

并一起使用多个属性

#![warn(missing_docs)]
#![deny(unused_variables)]

pub fn foo() {}

限制绒毛

rustc 支持一个标志 --cap-lints LEVEL,用于设置“绒毛限制级别”。这是所有绒毛的最大级别。例如,如果我们采用“拒绝”绒毛级别中的代码示例

fn main() {
    100u8 << 10;
}

并且我们编译它,将绒毛限制为警告

$ rustc lib.rs --cap-lints warn
warning: bitshift exceeds the type's number of bits
 --> lib.rs:2:5
  |
2 |     100u8 << 10;
  |     ^^^^^^^^^^^
  |
  = note: `#[warn(exceeding_bitshifts)]` on by default

warning: this expression will panic at run-time
 --> lib.rs:2:5
  |
2 |     100u8 << 10;
  |     ^^^^^^^^^^^ attempt to shift left with overflow

它现在只会发出警告,而不是错误。我们可以更进一步,允许所有绒毛

$ rustc lib.rs --cap-lints allow
$

Cargo 大量使用了此功能;它在编译您的依赖项时会传递 --cap-lints allow,以便如果它们有任何警告,也不会污染您的构建输出。