我们使用 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_Fmodernize-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。如需了解详情,请参阅静态分析。