使用方法

本章描述如何使用 Clippy 以充分利用它。Clippy 可以作为 cargo 子命令使用,或者像 rustc 一样,直接使用 clippy-driver 二进制文件。

注意: 本章假设您已经安装了 Clippy。如果您不确定,请查看安装章节。

Cargo 子命令

运行 Clippy 最简单和最常见的方式是通过 cargo。要做到这一点,只需运行

cargo clippy

Lint 配置

上面的命令将运行默认的 lint 集,这些 lint 集包含在 lint 组 clippy::all 中。您可能希望使用更多的 lint,或者您可能不同意每个 Clippy lint,为此,有一些方法可以配置 lint 级别。

注意: Clippy 的目的是在您的代码中大量使用 #[allow(..)]。因此,如果您不同意某个 lint,请不要觉得对部分代码或整个项目禁用它们感到不舒服。

命令行

您可以通过添加 -A/W/D clippy::lint_name 在命令行上配置 lint 级别,如下所示

cargo clippy -- -Aclippy::style -Wclippy::double_neg -Dclippy::perf

对于CI,所有警告都可以升级为错误,这将导致构建失败,并使 Clippy 以非 0 的代码退出。

cargo clippy -- -Dwarnings

注意: 添加 -D warnings 将导致您的构建在代码中发现任何警告时失败。这包括 rustc 发现的警告(例如 dead_code 等)。

有关配置 lint 级别的更多信息,请参阅 rustc 文档

更多 lint

Clippy 有一些默认允许的 lint 组。这意味着您必须手动启用这些组中的 lint。

有关所有 lint 的完整列表,包括其描述和示例,请参阅Clippy 的 lint 列表。下面描述了两个最重要的默认允许的组

clippy::pedantic

第一个组是 pedantic 组。此组包含真正主观的 lint,为了防止假阴性,可能有一些故意的假阳性。因此,虽然此组已准备好在生产中使用,但您可以期望在代码中添加多个 #[allow(..)]。如果您发现任何假阳性,仍然欢迎您向我们报告以进行未来的改进。

仅供参考:Clippy 使用整个组来 lint 自身。

clippy::restriction

第二个组是 restriction 组。此组包含以某种方式“限制”语言的 lint。例如,此组中的 clippy::unwrap lint 将不允许您在代码中使用 .unwrap()。您可能需要浏览此组中的 lint,并启用适合您需要的 lint。

注意: 您不应该启用整个 lint 组,而是从此组中挑选 lint。此组中的某些 lint 甚至会与其他的 Clippy lint 相矛盾!

过多的 lint

Clippy 最主观的默认警告组是 clippy::style 组。有些人喜欢完全禁用此组,然后从此组中挑选他们喜欢的一些 lint。当然,对于 Clippy 的任何其他 lint 组,也可以这样做。

注意: 我们尝试使默认警告组没有假阳性(FP)。如果您发现某个 lint 错误地触发,请在问题中报告它(如果该 FP 还没有问题)。

源代码

您可以在源代码中配置 lint 级别,就像配置 rustc lint 一样

#![allow(clippy::style)]

#[warn(clippy::double_neg)]
fn main() {
    let x = 1;
    let y = --x;
    //      ^^ warning: double negation
}

自动应用 Clippy 建议

Clippy 可以像编译器一样自动应用一些 lint 建议。请注意,--fix 意味着 --all-targets,因此它可以修复尽可能多的代码。

cargo clippy --fix

工作区

所有常用的工作区选项都应该与 Clippy 一起使用。例如,以下命令将在您的工作区中的 example crate 上运行 Clippy

cargo clippy -p example

cargo check 一样,这包括工作区的成员依赖项,例如路径依赖项。如果您只想在给定的 crate 上运行 Clippy,请使用 --no-deps 选项,如下所示

cargo clippy -p example -- --no-deps

不使用 cargo 使用 Clippy:clippy-driver

Clippy 也可以在不使用 cargo 的项目中使用。为此,请使用与 rustc 相同的参数运行 clippy-driver。例如

clippy-driver --edition 2018 -Cpanic=abort foo.rs

注意: clippy-driver 旨在运行 Clippy,不应作为 rustc 的通用替代品使用。例如,clippy-driver 可能会产生未按预期优化的工件。