We use clang-tidy to lint C++ code and aim to keep the repository warning-clean. The linter is configured in the root level .clang-tidy file. Developers should not create additional configuration files at a lower level, as this will cause disagreements in the tree.
./cobaltb.py lint is a Cobalt script that wraps language-specific linters in a common command line interface. It gathers a list of files, based on the options you specify, separates them by matching linter, and executes each required linter. clang-tidy is used for C and C++ files.
Without any other arguments, ./cobaltb.py lint lints all source files, and passes them through the linter:
./cobaltb.py lint
To restrict linting to only a specific directory, add the directory as an argument:
./cobaltb.py lint <dir>
Any warning can be suppressed by adding a // NOLINT(<check_name>) or a // NOLINTNEXTLINE(<check_name>) comment to the offending line. It is also possible to disable the check entirely within the repository by editing the root level .clang-tidy file.
There are a number of check categories enabled, and specific checks within them have been disabled for the reasons below. The list of enabled check categories is as follows:
bugprone-*clang-diagnostic-*google-*misc-*modernize-performance-*readability-*This list tracks the reasons for which we disabled in particular checks:
clang-diagnostic-unused-command-line-argument - ninja-generated compilation database contains the linker argument which ends up unused and triggers this warning for every filemisc-noexcept* - Cobalt doesn't use C++ exceptionsmisc-non-private-member-variables-in-classes - We don't allow classes/structs with a mix of private and public members, but all public is fine.modernize-avoid-c-arrays - Cobalt makes use of raw C arrays in some performance critical calculations.modernize-deprecated-headers - Cobalt uses old-style C headersmodernize-raw-string-literal - the check was suggesting to convert \xFF literals, which we'd rather keep in the escaped form.modernize-return-braced-init-list - concerns about readability of returning braced initialization list for constructor arguments, prefer to use a constructor explicitlymodernize-use-equals-delete - flagging all gtest TEST_Fmodernize-use-trailing-return-type - Cobalt C++ code typically uses the int foo() style of defining functions, and not the auto foo() -> int style as recommended by this check.readability-implicit-bool-conversion - Cobalt C++ code commonly uses implicit bool cast of pointers and numbersreadability-isolate-declaration - Zircon code commonly uses paired declarations.readability-uppercase-literal-suffix - Cobalt C++ code chooses not to impose a style on this.