如何用Clippy检测Rust代码

623次阅读  |  发布于1年以前

如果你在一个开发团队中工作,需要经常与彼此的代码交互,那么你就知道编写干净和符合编程习惯的代码是多么重要。

有时,开发人员通过学习语法来学习一种新的编程语言。然后,他们用它来构建非常棒的系统,但是,如果不按照该语言的编程习惯编写,对团队其他人是一种糟糕的体验。检测代码是检查编程习惯的最佳方法之一,所以让我们看看如何在Rust中做到这一点。

本文将具体讨论Rust中代码检测的重要性和结果,研究如何在Rust代码库中进行检测。然后,我们安装Clippy并演示如何使用它来检测Rust代码。

什么是代码检测?

检测是通过检查代码来检测潜在的错误、bug和不遵循编程语言标准约定的样式。

检测在动态语言(如Python和JavaScript)中更流行,因为静态类型语言具有执行大多数检测操作的编译器。检测代码的工具称为linter,它执行以下操作:

在项目早期引入检测很重要,因为检测旧的遗留代码库可能很困难(甚至不可能)。

检测如何改进Rust代码?

Rust编译器在构建时考虑了静态代码分析,它有自己内置的lint检查集合,在编译期间评估代码。

要查看这些内置lints(被称为默认允许的lints)的列表,运行以下命令:

rustc -W help

这些lints分为以下几组,称为检测级别:

要使用Rust编译器的内置检测功能对Rust程序运行检查,请使用以下命令:

cargo check

在编译或检查期间抛出错误的Rust代码在警告中提供了lint类别:

在这里,警告显示了warn级别。我们可以通过在代码顶部添加lint级别属性来防止lint抛出警告,如下所示:

#![allow(unused_variables)]

这允许Rust编译器用(unused_variables)覆盖所有代码。如果我们运行检查或尝试再次编译,这个特殊的警告将不存在。

覆盖lints在测试或创建应用程序原型而不需要遵循惯用标准的情况下非常有用。当你想要运行通常会在编译时抛出检测错误的代码块时,这特别有用。

我们已经对Rust的内置编译器有了更好的理解,现在让我们来学习更多关于Clippy的知识。

Clippy是什么?

Clippy是一个库,提供超过550个lint,分为10个lint级别:

现在,让我们看看如何安装和运行Clippy。

安装和运行Clippy

Rust工具链的新版本预装了Clippy。如果你想手动安装Clippy,你可以使用rustup工具链安装程序:

rustup update
rustup component add clippy

Clippy可以作为项目文件夹中的cargo子命令运行:

cargo clippy

Clippy检查并编译项目文件夹中的依赖项和代码,如下所示:

使用Clippy进行代码分析

一些Rust代码可以在编译时没有编译错误,但这并不意味着代码是干净的。Clippy可以在你的代码中捕捉你或Rust编译器无法检测到的次优实践。例如,下面的代码可以正常编译,但它实际上有一个问题:

fn add(x: i32, y: i32) -> i32 {
    return x + y
}

fn main() {
    println!("Summation result is: {}", add(3, 7));
}
// Returns: 10

现在,让我们使用Clippy来检查和发现问题:

cargo clippy

检查的结果返回以下警告:

提示从代码中删除return语句,只留下x + y。如果再次执行cargo clippy,将不会发现任何问题。

虽然这是一个非常简单的示例,但是Clippy功能强大,能够捕捉真正严重的错误。在Rust项目中应该总是使用Clippy。

配置Clippy

你不需要接受Clippy提供的每一个lint。事实上,当你不同意一个lint时,你可以自由地在你的代码中添加几个#![allow(…)]lint属性。还可以使用特定的子命令定制Clippy,使其具有你喜欢的某些行为。

例如,可以使用-D选项来启用或禁用特定的检测,或者使用-W选项来控制Clippy生成的警告级别。此外,还可以使用-A选项在项目中的所有依赖项上运行Clippy,而不仅仅是你自己的代码。

要允许特定的lint运行,使用-A选项:

cargo clippy -- -A clippy::lint_name

如果想对特定的lint发出警告,可以使用-W选项,如下所示:

cargo clippy -- -W clippy::lint_name

你也可以在lint分类中尝试这些属性。例如,你可以运行Clippy,并对所有启用的lints发出警告:

cargo clippy --W clippy::correctness

持续集成

在生产环境中,建议在持续集成(CI)上运行Clippy。如果你使用GitHub Actions,那么将这段代码附加到你的配置脚本:

on: push
name: Clippy check

# Make sure CI fails on all warnings, including Clippy lints
env:
  RUSTFLAGS: "-Dwarnings"

jobs:
  clippy_check:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Run Clippy
        run: cargo clippy --all-targets --all-features

-Dwarnings标志阻止CI进行处理。环境变量RUSTFLAGS被设置为-Dwarnings以使所有cargo命令服从Clippy警告。

如果你的CI提供商是Travis CI,你可以添加这个:

language: rust
rust:
  - stable
  - beta
before_script:
  - rustup component add clippy
script:
  - cargo clippy
  # if you want the build job to fail when encountering warnings, use
  - cargo clippy -- -D warnings
  # in order to also check tests and non-default crate features, use
  - cargo clippy --all-targets --all-features -- -D warnings
  - cargo test
  # etc.

进一步的建议

在本文中,我们研究了检测和检测级别,并讨论了检测如何改进Rust代码。演示了如何安装Clippy并使用它来检查代码是否符合规范,还演示了如何在持续集成中包含Clippy。

在使用Clippy时,应该记住两件事。首先,你可以不时地反对Clippy的建议。其次,Clippy不会以任何方式使内置编译器的安全性和错误检查工具变得可替换或无用。相反,Clippy提供了一个广泛的附加lint集合,可以用来使Rust代码更高效。

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8