12 The list of clang-tidy checks <checks/list>
13 Clang-tidy IDE/Editor Integrations <Integrations>
14 Getting Involved <Contributing>
16 :program:`clang-tidy` is a clang-based C++ "linter" tool. Its purpose is to
17 provide an extensible framework for diagnosing and fixing typical programming
18 errors, like style violations, interface misuse, or bugs that can be deduced via
19 static analysis. :program:`clang-tidy` is modular and provides a convenient
20 interface for writing new checks.
26 :program:`clang-tidy` is a `LibTooling`_-based tool, and it's easier to work
27 with if you set up a compile command database for your project (for an example
28 of how to do this, see `How To Setup Tooling For LLVM`_). You can also specify
29 compilation options on the command line after ``--``:
31 .. code-block:: console
33 $ clang-tidy test.cpp -- -Imy_project/include -DMY_DEFINES ...
35 :program:`clang-tidy` has its own checks and can also run Clang Static Analyzer
36 checks. Each check has a name and the checks to run can be chosen using the
37 ``-checks=`` option, which specifies a comma-separated list of positive and
38 negative (prefixed with ``-``) globs. Positive globs add subsets of checks, and
39 negative globs remove them. For example,
41 .. code-block:: console
43 $ clang-tidy test.cpp -checks=-*,clang-analyzer-*,-clang-analyzer-cplusplus*
45 will disable all default checks (``-*``) and enable all ``clang-analyzer-*``
46 checks except for ``clang-analyzer-cplusplus*`` ones.
48 The ``-list-checks`` option lists all the enabled checks. When used without
49 ``-checks=``, it shows checks enabled by default. Use ``-checks=*`` to see all
50 available checks or with any other value of ``-checks=`` to see which checks are
51 enabled by this value.
53 .. _checks-groups-table:
55 There are currently the following groups of checks:
57 ====================== =========================================================
58 Name prefix Description
59 ====================== =========================================================
60 ``abseil-`` Checks related to Abseil library.
61 ``altera-`` Checks related to OpenCL programming for FPGAs.
62 ``android-`` Checks related to Android.
63 ``boost-`` Checks related to Boost library.
64 ``bugprone-`` Checks that target bug-prone code constructs.
65 ``cert-`` Checks related to CERT Secure Coding Guidelines.
66 ``clang-analyzer-`` Clang Static Analyzer checks.
67 ``concurrency-`` Checks related to concurrent programming (including
68 threads, fibers, coroutines, etc.).
69 ``cppcoreguidelines-`` Checks related to C++ Core Guidelines.
70 ``darwin-`` Checks related to Darwin coding conventions.
71 ``fuchsia-`` Checks related to Fuchsia coding conventions.
72 ``google-`` Checks related to Google coding conventions.
73 ``hicpp-`` Checks related to High Integrity C++ Coding Standard.
74 ``linuxkernel-`` Checks related to the Linux Kernel coding conventions.
75 ``llvm-`` Checks related to the LLVM coding conventions.
76 ``llvmlibc-`` Checks related to the LLVM-libc coding standards.
77 ``misc-`` Checks that we didn't have a better category for.
78 ``modernize-`` Checks that advocate usage of modern (currently "modern"
79 means "C++11") language constructs.
80 ``mpi-`` Checks related to MPI (Message Passing Interface).
81 ``objc-`` Checks related to Objective-C coding conventions.
82 ``openmp-`` Checks related to OpenMP API.
83 ``performance-`` Checks that target performance-related issues.
84 ``portability-`` Checks that target portability-related issues that don't
85 relate to any particular coding style.
86 ``readability-`` Checks that target readability-related issues that don't
87 relate to any particular coding style.
88 ``zircon-`` Checks related to Zircon kernel coding conventions.
89 ====================== =========================================================
91 Clang diagnostics are treated in a similar way as check diagnostics. Clang
92 diagnostics are displayed by :program:`clang-tidy` and can be filtered out using
93 the ``-checks=`` option. However, the ``-checks=`` option does not affect
94 compilation arguments, so it cannot turn on Clang warnings which are not
95 already turned on in the build configuration. The ``-warnings-as-errors=``
96 option upgrades any warnings emitted under the ``-checks=`` flag to errors (but
97 it does not enable any checks itself).
99 Clang diagnostics have check names starting with ``clang-diagnostic-``.
100 Diagnostics which have a corresponding warning option, are named
101 ``clang-diagnostic-<warning-option>``, e.g. Clang warning controlled by
102 ``-Wliteral-conversion`` will be reported with check name
103 ``clang-diagnostic-literal-conversion``.
105 The ``-fix`` flag instructs :program:`clang-tidy` to fix found errors if
106 supported by corresponding checks.
108 An overview of all the command-line options:
110 .. code-block:: console
113 USAGE: clang-tidy [options] <source0> [... <sourceN>]
119 --help - Display available options (--help-hidden for more)
120 --help-list - Display list of available options (--help-list-hidden for more)
121 --version - Display the version of this program
126 Comma-separated list of globs with optional '-'
127 prefix. Globs are processed in order of
128 appearance in the list. Globs without '-'
129 prefix add checks with matching names to the
130 set, globs with the '-' prefix remove checks
131 with matching names from the set of enabled
132 checks. This option's value is appended to the
133 value of the 'Checks' option in .clang-tidy
136 Specifies a configuration in YAML/JSON format:
137 -config="{Checks: '*',
138 CheckOptions: {x, y}}"
139 When the value is empty, clang-tidy will
140 attempt to find a file named .clang-tidy for
141 each source file in its parent directories.
142 --config-file=<string> -
143 Specify the path of .clang-tidy or custom config file:
144 e.g. --config-file=/some/path/myTidyConfigFile
145 This option internally works exactly the same way as
146 --config option after reading specified config file.
147 Use either --config-file or --config, not both.
149 Dumps configuration in the YAML format to
150 stdout. This option can be used along with a
151 file name (and '--' if the file is outside of a
152 project with configured compilation database).
153 The configuration used for this file will be
155 Use along with -checks=* to include
156 configuration of all checks.
157 --enable-check-profile -
158 Enable per-check timing profiles, and print a
161 For each enabled check explains, where it is
162 enabled, i.e. in clang-tidy binary, command
163 line or a specific configuration file.
164 --export-fixes=<filename> -
165 YAML file to store suggested fixes in. The
166 stored fixes can be applied to the input source
167 code with clang-apply-replacements.
168 --extra-arg=<string> - Additional argument to append to the compiler command line.
169 Can be used several times.
170 --extra-arg-before=<string> - Additional argument to prepend to the compiler command line.
171 Can be used several times.
173 Apply suggested fixes. Without -fix-errors
174 clang-tidy will bail out if any compilation
177 Apply suggested fixes even if compilation
178 errors were found. If compiler errors have
179 attached fix-its, clang-tidy will apply them as
182 If a warning has no fix, but a single fix can
183 be found through an associated diagnostic note,
185 Specifying this flag will implicitly enable the
187 --format-style=<string> -
188 Style for formatting code around applied fixes:
189 - 'none' (default) turns off formatting
190 - 'file' (literally 'file', not a placeholder)
191 uses .clang-format file in the closest parent
193 - '{ <json> }' specifies options inline, e.g.
194 -format-style='{BasedOnStyle: llvm, IndentWidth: 8}'
195 - 'llvm', 'google', 'webkit', 'mozilla'
196 See clang-format documentation for the up-to-date
197 information about formatting styles and options.
198 This option overrides the 'FormatStyle` option in
199 .clang-tidy file, if any.
200 --header-filter=<string> -
201 Regular expression matching the names of the
202 headers to output diagnostics from. Diagnostics
203 from the main file of each translation unit are
205 Can be used together with -line-filter.
206 This option overrides the 'HeaderFilterRegex'
207 option in .clang-tidy file, if any.
208 --line-filter=<string> -
209 List of files with line ranges to filter the
210 warnings. Can be used together with
211 -header-filter. The format of the list is a
212 JSON array of objects:
214 {"name":"file1.cpp","lines":[[1,3],[5,7]]},
218 List all enabled checks and exit. Use with
219 -checks=* to list all available checks.
221 Load the dynamic object ``plugin``. This
222 object should register new static analyzer
223 or clang-tidy passes. Once loaded, the
224 object will add new command line options
225 to run various analyses. To see the new
226 complete list of passes, use the
227 :option:`--list-checks` and
228 :option:`-load` options together.
229 -p <string> - Build path
231 Run clang-tidy in quiet mode. This suppresses
232 printing statistics about ignored warnings and
233 warnings treated as errors if the respective
234 options are specified.
235 --store-check-profile=<prefix> -
236 By default reports are printed in tabulated
237 format to stderr. When this option is passed,
238 these per-TU profiles are instead stored as JSON.
239 --system-headers - Display the errors from system headers.
241 Use colors in diagnostics. If not set, colors
242 will be used if the terminal connected to
243 standard output supports colors.
244 This option overrides the 'UseColor' option in
245 .clang-tidy file, if any.
247 Check the config files to ensure each check and
248 option is recognized.
249 --vfsoverlay=<filename> -
250 Overlay the virtual filesystem described by file
251 over the real file system.
252 --warnings-as-errors=<string> -
253 Upgrades warnings to errors. Same format as
255 This option's value is appended to the value of
256 the 'WarningsAsErrors' option in .clang-tidy
259 -p <build-path> is used to read a compile command database.
261 For example, it can be a CMake build directory in which a file named
262 compile_commands.json exists (use -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
263 CMake option to get this output). When no build path is specified,
264 a search for compile_commands.json will be attempted through all
265 parent paths of the first input file . See:
266 https://clang.llvm.org/docs/HowToSetupToolingForLLVM.html for an
267 example of setting up Clang Tooling on a source tree.
269 <source0> ... specify the paths of source files. These paths are
270 looked up in the compile command database. If the path of a file is
271 absolute, it needs to point into CMake's source tree. If the path is
272 relative, the current working directory needs to be in the CMake
273 source tree and the file must be in a subdirectory of the current
274 working directory. "./" prefixes in the relative files will be
275 automatically removed, but the rest of a relative path must be a
276 suffix of a path in the compile command database.
280 clang-tidy attempts to read configuration for each source file from a
281 .clang-tidy file located in the closest parent directory of the source
282 file. If InheritParentConfig is true in a config file, the configuration file
283 in the parent directory (if any exists) will be taken and current config file
284 will be applied on top of the parent one. If any configuration options have
285 a corresponding command-line option, command-line option takes precedence.
286 The effective configuration can be inspected using -dump-config:
288 $ clang-tidy -dump-config
290 Checks: '-*,some-check'
292 HeaderFilterRegex: ''
294 InheritParentConfig: true
297 some-check.SomeOption: 'some value'
300 .. _clang-tidy-nolint:
302 Suppressing Undesired Diagnostics
303 =================================
305 :program:`clang-tidy` diagnostics are intended to call out code that does not
306 adhere to a coding standard, or is otherwise problematic in some way. However,
307 if the code is known to be correct, it may be useful to silence the warning.
308 Some clang-tidy checks provide a check-specific way to silence the diagnostics,
309 e.g. `bugprone-use-after-move <checks/bugprone-use-after-move.html>`_ can be
310 silenced by re-initializing the variable after it has been moved out,
311 `bugprone-string-integer-assignment
312 <checks/bugprone-string-integer-assignment.html>`_ can be suppressed by
313 explicitly casting the integer to ``char``,
314 `readability-implicit-bool-conversion
315 <checks/readability-implicit-bool-conversion.html>`_ can also be suppressed by
316 using explicit casts, etc.
318 If a specific suppression mechanism is not available for a certain warning, or
319 its use is not desired for some reason, :program:`clang-tidy` has a generic
320 mechanism to suppress diagnostics using ``NOLINT``, ``NOLINTNEXTLINE``, and
321 ``NOLINTBEGIN`` ... ``NOLINTEND`` comments.
323 The ``NOLINT`` comment instructs :program:`clang-tidy` to ignore warnings on the
324 *same line* (it doesn't apply to a function, a block of code or any other
325 language construct; it applies to the line of code it is on). If introducing the
326 comment on the same line would change the formatting in an undesired way, the
327 ``NOLINTNEXTLINE`` comment allows suppressing clang-tidy warnings on the *next
328 line*. The ``NOLINTBEGIN`` and ``NOLINTEND`` comments allow suppressing
329 clang-tidy warnings on *multiple lines* (affecting all lines between the two
332 All comments can be followed by an optional list of check names in parentheses
333 (see below for the formal syntax). The list of check names supports globbing,
334 with the same format and semantics as for enabling checks. Note: negative globs
335 are ignored here, as they would effectively re-activate the warning.
342 // Suppress all the diagnostics for the line
343 Foo(int param); // NOLINT
345 // Consider explaining the motivation to suppress the warning
346 Foo(char param); // NOLINT: Allow implicit conversion from `char`, because <some valid reason>
348 // Silence only the specified checks for the line
349 Foo(double param); // NOLINT(google-explicit-constructor, google-runtime-int)
351 // Silence all checks from the `google` module
352 Foo(bool param); // NOLINT(google*)
354 // Silence all checks ending with `-avoid-c-arrays`
355 int array[10]; // NOLINT(*-avoid-c-arrays)
357 // Silence only the specified diagnostics for the next line
358 // NOLINTNEXTLINE(google-explicit-constructor, google-runtime-int)
361 // Silence all checks from the `google` module for the next line
362 // NOLINTNEXTLINE(google*)
365 // Silence all checks ending with `-avoid-c-arrays` for the next line
366 // NOLINTNEXTLINE(*-avoid-c-arrays)
369 // Silence only the specified checks for all lines between the BEGIN and END
370 // NOLINTBEGIN(google-explicit-constructor, google-runtime-int)
373 // NOLINTEND(google-explicit-constructor, google-runtime-int)
375 // Silence all checks from the `google` module for all lines between the BEGIN and END
376 // NOLINTBEGIN(google*)
378 // NOLINTEND(google*)
380 // Silence all checks ending with `-avoid-c-arrays` for all lines between the BEGIN and END
381 // NOLINTBEGIN(*-avoid-c-arrays)
383 // NOLINTEND(*-avoid-c-arrays)
386 The formal syntax of ``NOLINT``, ``NOLINTNEXTLINE``, and ``NOLINTBEGIN`` ...
387 ``NOLINTEND`` is the following:
393 lint-command lint-args
396 **(** check-name-list **)**
400 check-name-list **,** *check-name*
408 Note that whitespaces between
409 ``NOLINT``/``NOLINTNEXTLINE``/``NOLINTBEGIN``/``NOLINTEND`` and the opening
410 parenthesis are not allowed (in this case the comment will be treated just as
411 ``NOLINT``/``NOLINTNEXTLINE``/``NOLINTBEGIN``/``NOLINTEND``), whereas in the
412 check names list (inside the parentheses), whitespaces can be used and will be
415 All ``NOLINTBEGIN`` comments must be paired by an equal number of ``NOLINTEND``
416 comments. Moreover, a pair of comments must have matching arguments -- for
417 example, ``NOLINTBEGIN(check-name)`` can be paired with
418 ``NOLINTEND(check-name)`` but not with ``NOLINTEND`` `(zero arguments)`.
419 :program:`clang-tidy` will generate a ``clang-tidy-nolint`` error diagnostic if
420 any ``NOLINTBEGIN``/``NOLINTEND`` comment violates these requirements.
422 .. _LibTooling: https://clang.llvm.org/docs/LibTooling.html
423 .. _How To Setup Tooling For LLVM: https://clang.llvm.org/docs/HowToSetupToolingForLLVM.html