绒毛级别
在 rustc
中,绒毛分为五个_级别_
- 允许
- 警告
- 强制警告
- 拒绝
- 禁止
每个绒毛都有一个默认级别(在本节后面的绒毛列表中解释),并且编译器有一个默认的警告级别。首先,让我们解释一下这些级别的含义,然后我们将讨论配置。
允许
这些绒毛存在,但默认情况下什么也不做。例如,考虑以下源代码
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-warn
和 forbid
不能被覆盖,因此设置其中一个将阻止同一绒毛的任何后续级别生效。
通过属性
您还可以使用 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() {}
| ^^^^^^^^^^^^
warn
、allow
、deny
和 forbid
都以这种方式工作。没有办法使用属性将绒毛设置为 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
,以便如果它们有任何警告,也不会污染您的构建输出。