#limit #warnings #defined #log #kinds #category

app wcnt

一个用于统计日志文件中的警告数量并与定义的限制进行比较的程序

1个不稳定版本

0.4.0 2019年11月20日

#1026文件系统

Apache-2.0

90KB
2K SLoC

说明

警告计数器(wcnt)是一个小型的命令行工具,用于统计日志文件中的警告数量,并将它们与定义的限制进行比较。在CI环境中,如果您想确保警告的数量不会增加,这非常有用。

警告的类型在Wcnt.toml中定义,该文件应位于项目的根目录。限制在Limits.toml中定义,然后对该文件系统中该目录树中的源文件有效。您可以有多个Limits.toml文件,并将它们放在您认为合适的位置。也许每个组件或子系统一个,或者最适合您的项目。如果系统在搜索设置限制时找不到Limits.toml文件,它将使用0作为限制,因此请确保您指定了限制!

示例 Wcnt.toml

以下是一个示例Wcnt.toml文件,定义了两种类型gccflake8的规则。

[gcc]
regex = "^(?P<file>[^:]+):(?P<line>\\d+):(?P<column>\\d+): warning: (?P<description>.+) \\[(?P<category>.+)\\]"
files = ["**/compilation.log", "**/build.log"]

[flake8]
regex = "^(?P<file>[^:]+):(?P<line>\\d+):(?P<column>\\d+): (?P<category>[^\\s]+) (?P<description>.+)$"
files = ["**/lint.log"]

Wcnt.toml中,您为要搜索的每种“警告类型”定义一个映射,以及如何搜索它。每个必需的设置是regexfilesregex的值必须定义一个file捕获组,这样我们就可以知道哪个文件导致了每个特定的警告,因此,应该使用哪个Limits.toml

捕获组linecolumncategorydescription是可选的,允许系统忽略相同的警告的多个实例(对于头文件很有用)。category键还允许您为不同的类别定义单独的限制。

为了能够使用按类别限制,您的正则表达式必须定义一个category捕获组。否则,系统在解析Limits.toml文件时会终止。这是为了防止产生错误的安全感。

示例 Limits.toml

以下是一个示例Limits.toml文件,其中flake8警告限制在300个,而gcc警告被分为几个不同的类别。您可以使用inf允许任意数量的警告,而_是通配符类别。它匹配您尚未定义的任何类别。在使用按类别限制时,始终包括通配符类别是明智的,否则限制为零。

flake8 = 300 

[gcc]
-Wpedantic = 3
-Wcomment = inf
-Wunused-variable = 2 
_ = 0

注意:按类别定义必须位于文件末尾,因为这是由TOML的工作方式决定的。

如果不使用按类别限制,所有类别都会计入相同的限制中。换句话说,这两种定义限制的方法是等效的。

kind = 1

[kind]
_ = 1

您可以有多个 Limits.toml 文件

来自源文件的每个警告都会计入与之最近的 Limits.toml 文件,沿着文件系统树向上。在下面的示例中,component_acomponent_b 共享 project/src/Limit.toml 中定义的限制,而 component_c 有自己的限制。这对于您有一些需要额外严格或宽松规则的功能组件非常有用,例如新开发的代码,或者一个 vendored 的第三方依赖项或旧代码。

project
├── Wcnt.toml
├── src
│   ├── Limits.toml
│   ├── component_a
│   │   ├── source.c
│   │   ├── interface.h
│   │   └── utility.py
│   ├── component_b
│   │   ├── binary.c
│   │   ├── code.c
│   │   └── interface.h
│   └── component_c
│       ├── Limits.toml
│       ├── rustmodule.rs
│       └── glue.c
└── build
    ├── compilation.log
    └── lint.log

无限限制

如果您对代码库的某个特定部分不希望关注某种警告,您可以将限制指定为 inf,如下所示

[kind]
-Wbothersome = inf

如果您有 vendored 代码或实验性代码,这些代码不需要或不能与生产代码保持相同的标准,但仍然希望以相同的设置进行编译,这将非常有用。

修剪

该工具可以自动更新/降低并修剪您的 Limits.toml 文件。当您没有警告时,使用 --update-limits 标志,以下限制

[gcc]
-Wpedantic = 3
-Wcomment = 3
-Wunused-variable = 2

变为

[gcc]
-Wpedantic = 0
-Wcomment = 0
-Wunused-variable = 0

注意--update-limits 不会修改设置为 inf 的限制。

添加 --prune 后,上述限制减少到

gcc = 0

注意--prune 也不会修改设置为 inf 的限制。

强烈建议您设置一个自动重复的任务,该任务运行 wcnt --update-limits [--prune] 并将结果提交到您的仓库,以确保限制确实随着时间的推移而降低。

部分运行

在某些情况下,您可能不想(或不能)一次获取所有警告。例如,如果您使用 GCC 和 MSVC/XCode 编译 C 代码。然后您可以通过使用 --only 标志传递参数,仅为此或此类警告运行工具。此功能与 --update-limits 集成,并且不会从您的 Limits.toml 文件中删除限制。如果您有自动提交以降低限制的重复性工作,您将必须自己处理任何合并冲突。

从 --help 输出的内容

$ wcnt --help
Warning Counter (wcnt) 0.4.0
Mikael Silvén <[email protected]>
A program to count your warnings inside log files and comparing them against defined limits.

USAGE:
    wcnt [FLAGS] [OPTIONS]

FLAGS:
    -h, --help             Prints help information
    -V, --version          Prints version information
        --update-limits    Update the Limit.toml files with lower values if no violations were found.
        --prune            Also aggressively prune Limits.toml files to more minimal forms (requires --update-limits).
    -v                     Be more verbose. (-vv for very verbose)
        --all              Also print non-violating warnings. (if verbose or very verbose)

OPTIONS:
        --only <KIND>...        Run the check only for these kinds of warnings.
        --start <DIR>           Start search in this directory (instead of cwd)
        --config <Wcnt.toml>    Use this config file. (Instead of <start>/Wcnt.toml)

设计目标

  • Wcnt 尽量不做太多的事情。
  • 它确实试图保持灵活,因此您的构建系统不需要。
  • Wcnt 不应该给人以虚假的安全感。

开放问题

  • 我还没有决定如何处理来自代码库外部的警告。希望您可以使用 -isystem 来处理这些事情。
  • Windows 路径很麻烦,如果您的工具输出 \\?\ 样式的路径,您可能遇到麻烦。
  • 我希望有一个“重映射”功能,这样即使警告使用绝对路径,也可以分析警告,即使它们在您分析它们的不同系统上生成。

安装和构建

在我将 Wcnt 发布到 crates.io 之前,您可以在 Github 发布页面 找到二进制文件。对此表示歉意。

Wcnt 也应该使用 cargo 正常构建。

cargo build --release

许可证

警告计数器(Wcnt)遵循Apache 2.0 (http://www.apache.org/licenses/LICENSE2.0) 许可协议。它可以在免费软件以及封闭源代码应用中使用,包括商业和非商业用途,前提是符合许可协议中的条件。

贡献

任何有意提交以包含在本作品中的贡献都必须也采用Apache2许可。

依赖

~7–17MB
~207K SLoC