# Lint

We use clang-tidy to lint C++ code and aim to keep the repository warning-clean.
The linter is configured in the [.clang-tidy](/.clang-tidy) file.

## How to lint

`fx lint` is a Fuchsia 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, `fx lint` lints the files in your
most recent git commit, and passes them through the linter:

```
fx lint
```

To restrict linting to C++, add a double-dash (--) followed by the
file pattern(s) to match, such as:

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

To run a specific GN target through the linter, use:

```
fx lint --target=<target>
```

In order to lint all files under the current working directory, add `--all`.
Running `fx lint --all` from the top-level `fuchsia` directory is generally not
recommended, and will likely take several hours to complete. Be certain you
`cd` to the best top level directory for your analysis requirements. For example:

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

You can also add `--fix` in order to automatically generate fixes for some (but
not all) of the warnings.

Additional options and examples are documented in the tool itself. For the most up
to date documentation on `fx lint`, including examples, run:

```
fx lint --help
```

## Suppressing warnings

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
[.clang-tidy](/.clang-tidy) file.

## Checks

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 file
 - `misc-noexcept*` - Fuchsia doesn't use C++ exceptions
 - `modernize-deprecated-headers` - Fuchsia uses old-style C headers
 - `modernize-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 explicitly
 - `modernize-use-equals-delete` - flagging all gtest TEST_F
 - `modernize-use-trailing-return-type` - Fuchsia 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` - Fuchsia C++ code commonly uses implicit
   bool cast of pointers and numbers
 - `readability-isolate-declaration` - Zircon code commonly uses paired declarations.
 - `readability-uppercase-literal-suffix` - Fuchsia C++ code chooses not to impose
   a style on this.

[checks]: https://clang.llvm.org/extra/clang-tidy/checks/list.html
