lint

我们使用 clang-tidy 对 C++ 代码执行 lint 检查,并力求保持仓库警告简洁。linter 在根级 .clang-tidy 文件中配置。开发者不应在较低的级别创建额外的配置文件,因为这会导致树中的不一致。

如何 lint

fx lint 是一个 Fuchsia 脚本,用于将特定语言的 linter 封装在通用命令行界面中。它会根据您指定的选项收集文件列表,通过匹配 linter 分隔文件,然后执行每个必需的 linter。clang-tidy 用于 C 和 C++ 文件。

如果不使用任何其他参数,fx lint 会对最近的 git 提交中的文件进行 lint 检查,并通过 linter 传递它们:

fx lint

如需将 lint 限制为 C++,请添加双短划线 (--),后跟要匹配的文件格式,例如:

fx lint -- '*.cc' '*.cpp'

如需通过 linter 运行特定的 GN 目标,请使用以下命令:

fx lint --target=<target>

要对当前工作目录下的所有文件执行 lint 请求,请添加 --all。 通常不建议从顶级 fuchsia 目录运行 fx lint --all,因为运行 fx lint --all 可能需要数小时才能完成。确保通过 cd 找到符合分析要求的最佳顶级目录。例如:

(cd <your/subdir>; fx lint --all -- '*.cc')

您还可以添加 --fix,以便自动生成部分(但非全部)警告的修复。

工具本身中介绍了其他选项和示例。如需查看有关 fx lint 的最新文档(包括示例),请运行以下命令:

fx lint --help

禁止显示警告

您可以通过在违规行中添加 // NOLINT(<check_name>)// NOLINTNEXTLINE(<check_name>) 注释来抑制任何警告。此外,您还可以通过修改根级 .clang-tidy 文件,在代码库中完全停用检查。

Checks

我们启用了多项检查类别,并且由于以下原因,这些检查类别中的一些检查已被停用。已启用的检查类别的列表如下所示:

  • bugprone-*
  • clang-diagnostic-*
  • google-*
  • misc-*
  • modernize-
  • performance-*
  • readability-*

此列表会跟踪具体检查停用的原因:

  • clang-diagnostic-unused-command-line-argument - ninja 生成的编译数据库包含链接器参数,该参数最终会未使用,并会对每个文件触发此警告
  • misc-noexcept* - Fuchsia 不使用 C++ 异常
  • misc-non-private-member-variables-in-classes - 我们不允许同时包含私有和公开成员的类/结构体,但所有类/结构体都可以。
  • modernize-deprecated-headers - Fuchsia 使用旧式 C 头文件
  • modernize-use-nodiscard - 通常不用于 Fuchsia 代码库
  • modernize-raw-string-literal - 检查建议转换 \xFF 字面量,我们希望将其保留为转义形式。
  • modernize-return-braced-init-list - 担心返回构造函数参数的大括号初始化列表的可读性,最好明确使用构造函数
  • modernize-use-emplace - 启用了 IgnoreImplicitConstructors 选项,以符合本周 Abseil 提示 #112 (Abseil Tip of the Week #112)。
  • modernize-use-equals-delete - 标记所有 gtest TEST_F
  • modernize-use-trailing-return-type - Fuchsia C++ 代码通常使用 int foo() 样式来定义函数,而不是此检查所建议的 auto foo() -> int 样式。
  • readability-implicit-bool-conversion - Fuchsia C++ 代码通常使用指针和数字的隐式 bool 类型转换
  • readability-isolate-declaration - Zircon 代码通常使用配对声明。
  • readability-uppercase-literal-suffix - Fuchsia C++ 代码选择不对此设置样式。

静态分析

严格来说,它不会执行 lint 请求,但 Clang 静态分析器可以进行深入分析来查找 bug。如需了解详情,请参阅静态分析