==========
Clang-Tidy
==========

.. contents::

See also:

.. toctree::
   :maxdepth: 1

   The list of clang-tidy checks <checks/list>

:program:`clang-tidy` is a clang-based C++ "linter" tool. Its purpose is to
provide an extensible framework for diagnosing and fixing typical programming
errors, like style violations, interface misuse, or bugs that can be deduced via
static analysis. :program:`clang-tidy` is modular and provides a convenient
interface for writing new checks.


Using clang-tidy
================

:program:`clang-tidy` is a `LibTooling`_-based tool, and it's easier to work
with if you set up a compile command database for your project (for an example
of how to do this see `How To Setup Tooling For LLVM`_). You can also specify
compilation options on the command line after ``--``:

.. code-block:: console

  $ clang-tidy test.cpp -- -Imy_project/include -DMY_DEFINES ...

:program:`clang-tidy` has its own checks and can also run Clang static analyzer
checks. Each check has a name and the checks to run can be chosen using the
``-checks=`` option, which specifies a comma-separated list of positive and
negative (prefixed with ``-``) globs. Positive globs add subsets of checks,
negative globs remove them. For example,

.. code-block:: console

  $ clang-tidy test.cpp -checks=-*,clang-analyzer-*,-clang-analyzer-cplusplus*

will disable all default checks (``-*``) and enable all ``clang-analyzer-*``
checks except for ``clang-analyzer-cplusplus*`` ones.

The ``-list-checks`` option lists all the enabled checks. When used without
``-checks=``, it shows checks enabled by default. Use ``-checks=*`` to see all
available checks or with any other value of ``-checks=`` to see which checks are
enabled by this value.

.. _checks-groups-table:

There are currently the following groups of checks:

====================== =========================================================
Name prefix            Description
====================== =========================================================
``android-``           Checks related to Android.
``boost-``             Checks related to Boost library.
``bugprone-``          Checks that target bugprone code constructs.
``cert-``              Checks related to CERT Secure Coding Guidelines.
``cppcoreguidelines-`` Checks related to C++ Core Guidelines.
``clang-analyzer-``    Clang Static Analyzer checks.
``fuchsia-``           Checks related to Fuchsia coding conventions.
``google-``            Checks related to Google coding conventions.
``hicpp-``             Checks related to High Integrity C++ Coding Standard.
``llvm-``              Checks related to the LLVM coding conventions.
``misc-``              Checks that we didn't have a better category for.
``modernize-``         Checks that advocate usage of modern (currently "modern"
                       means "C++11") language constructs.
``mpi-``               Checks related to MPI (Message Passing Interface).
``objc-``              Checks related to Objective-C coding conventions.
``performance-``       Checks that target performance-related issues.
``portability-``       Checks that target portability-related issues that don't
                       relate to any particular coding style.
``readability-``       Checks that target readability-related issues that don't
                       relate to any particular coding style.
``zircon-``            Checks related to Zircon kernel coding conventions.
====================== =========================================================

Clang diagnostics are treated in a similar way as check diagnostics. Clang
diagnostics are displayed by :program:`clang-tidy` and can be filtered out using
``-checks=`` option. However, the ``-checks=`` option does not affect
compilation arguments, so it can not turn on Clang warnings which are not
already turned on in build configuration. The ``-warnings-as-errors=`` option
upgrades any warnings emitted under the ``-checks=`` flag to errors (but it
does not enable any checks itself).

Clang diagnostics have check names starting with ``clang-diagnostic-``.
Diagnostics which have a corresponding warning option, are named
``clang-diagnostic-<warning-option>``, e.g. Clang warning controlled by
``-Wliteral-conversion`` will be reported with check name
``clang-diagnostic-literal-conversion``.

The ``-fix`` flag instructs :program:`clang-tidy` to fix found errors if
supported by corresponding checks.

An overview of all the command-line options:

.. code-block:: console

  $ clang-tidy -help
  USAGE: clang-tidy [options] <source0> [... <sourceN>]

  OPTIONS:

  Generic Options:

    -help                        - Display available options (-help-hidden for more)
    -help-list                   - Display list of available options (-help-list-hidden for more)
    -version                     - Display the version of this program

  clang-tidy options:

    -analyze-temporary-dtors     -
                                   Enable temporary destructor-aware analysis in
                                   clang-analyzer- checks.
                                   This option overrides the value read from a
                                   .clang-tidy file.
    -checks=<string>             -
                                   Comma-separated list of globs with optional '-'
                                   prefix. Globs are processed in order of
                                   appearance in the list. Globs without '-'
                                   prefix add checks with matching names to the
                                   set, globs with the '-' prefix remove checks
                                   with matching names from the set of enabled
                                   checks. This option's value is appended to the
                                   value of the 'Checks' option in .clang-tidy
                                   file, if any.
    -config=<string>             -
                                   Specifies a configuration in YAML/JSON format:
                                     -config="{Checks: '*',
                                               CheckOptions: [{key: x,
                                                               value: y}]}"
                                   When the value is empty, clang-tidy will
                                   attempt to find a file named .clang-tidy for
                                   each source file in its parent directories.
    -dump-config                 -
                                   Dumps configuration in the YAML format to
                                   stdout. This option can be used along with a
                                   file name (and '--' if the file is outside of a
                                   project with configured compilation database).
                                   The configuration used for this file will be
                                   printed.
                                   Use along with -checks=* to include
                                   configuration of all checks.
    -enable-check-profile        -
                                   Enable per-check timing profiles, and print a
                                   report to stderr.
    -explain-config              -
                                   For each enabled check explains, where it is
                                   enabled, i.e. in clang-tidy binary, command
                                   line or a specific configuration file.
    -export-fixes=<filename>     -
                                   YAML file to store suggested fixes in. The
                                   stored fixes can be applied to the input source
                                   code with clang-apply-replacements.
    -extra-arg=<string>          - Additional argument to append to the compiler command line
    -extra-arg-before=<string>   - Additional argument to prepend to the compiler command line
    -fix                         -
                                   Apply suggested fixes. Without -fix-errors
                                   clang-tidy will bail out if any compilation
                                   errors were found.
    -fix-errors                  -
                                   Apply suggested fixes even if compilation
                                   errors were found. If compiler errors have
                                   attached fix-its, clang-tidy will apply them as
                                   well.
    -format-style=<string>       -
                                   Style for formatting code around applied fixes:
                                     - 'none' (default) turns off formatting
                                     - 'file' (literally 'file', not a placeholder)
                                       uses .clang-format file in the closest parent
                                       directory
                                     - '{ <json> }' specifies options inline, e.g.
                                       -format-style='{BasedOnStyle: llvm, IndentWidth: 8}'
                                     - 'llvm', 'google', 'webkit', 'mozilla'
                                   See clang-format documentation for the up-to-date
                                   information about formatting styles and options.
                                   This option overrides the 'FormatStyle` option in
                                   .clang-tidy file, if any.
    -header-filter=<string>      -
                                   Regular expression matching the names of the
                                   headers to output diagnostics from. Diagnostics
                                   from the main file of each translation unit are
                                   always displayed.
                                   Can be used together with -line-filter.
                                   This option overrides the 'HeaderFilter' option
                                   in .clang-tidy file, if any.
    -line-filter=<string>        -
                                   List of files with line ranges to filter the
                                   warnings. Can be used together with
                                   -header-filter. The format of the list is a
                                   JSON array of objects:
                                     [
                                       {"name":"file1.cpp","lines":[[1,3],[5,7]]},
                                       {"name":"file2.h"}
                                     ]
    -list-checks                 -
                                   List all enabled checks and exit. Use with
                                   -checks=* to list all available checks.
    -p=<string>                  - Build path
    -quiet                       -
                                   Run clang-tidy in quiet mode. This suppresses
                                   printing statistics about ignored warnings and
                                   warnings treated as errors if the respective
                                   options are specified.
    -system-headers              - Display the errors from system headers.
    -warnings-as-errors=<string> -
                                   Upgrades warnings to errors. Same format as
                                   '-checks'.
                                   This option's value is appended to the value of
                                   the 'WarningsAsErrors' option in .clang-tidy
                                   file, if any.

  -p <build-path> is used to read a compile command database.

          For example, it can be a CMake build directory in which a file named
          compile_commands.json exists (use -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
          CMake option to get this output). When no build path is specified,
          a search for compile_commands.json will be attempted through all
          parent paths of the first input file . See:
          http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html for an
          example of setting up Clang Tooling on a source tree.

  <source0> ... specify the paths of source files. These paths are
          looked up in the compile command database. If the path of a file is
          absolute, it needs to point into CMake's source tree. If the path is
          relative, the current working directory needs to be in the CMake
          source tree and the file must be in a subdirectory of the current
          working directory. "./" prefixes in the relative files will be
          automatically removed, but the rest of a relative path must be a
          suffix of a path in the compile command database.


  Configuration files:
    clang-tidy attempts to read configuration for each source file from a
    .clang-tidy file located in the closest parent directory of the source
    file. If any configuration options have a corresponding command-line
    option, command-line option takes precedence. The effective
    configuration can be inspected using -dump-config:

      $ clang-tidy -dump-config
      ---
      Checks:          '-*,some-check'
      WarningsAsErrors: ''
      HeaderFilterRegex: ''
      AnalyzeTemporaryDtors: false
      FormatStyle:     none
      User:            user
      CheckOptions:
        - key:             some-check.SomeOption
          value:           'some value'
      ...

:program:`clang-tidy` diagnostics are intended to call out code that does
not adhere to a coding standard, or is otherwise problematic in some way.
However, if it is known that the code is correct, the check-specific ways
to silence the diagnostics could be used, if they are available (e.g. 
bugprone-use-after-move can be silenced by re-initializing the variable after 
it has been moved out, misc-string-integer-assignment can be suppressed by 
explicitly casting the integer to char, readability-implicit-bool-conversion
can also be suppressed by using explicit casts, etc.). If they are not 
available or if changing the semantics of the code is not desired, 
the ``NOLINT`` or ``NOLINTNEXTLINE`` comments can be used instead. For example:

.. code-block:: c++

  class Foo
  {
    // Silent all the diagnostics for the line
    Foo(int param); // NOLINT

    // Silent only the specified checks for the line
    Foo(double param); // NOLINT(google-explicit-constructor, google-runtime-int)

    // Silent only the specified diagnostics for the next line
    // NOLINTNEXTLINE(google-explicit-constructor, google-runtime-int)
    Foo(bool param); 
  };

The formal syntax of ``NOLINT``/``NOLINTNEXTLINE`` is the following:

.. parsed-literal::

  lint-comment:
    lint-command
    lint-command lint-args

  lint-args:
    **(** check-name-list **)**

  check-name-list:
    *check-name*
    check-name-list **,** *check-name*

  lint-command:
    **NOLINT**
    **NOLINTNEXTLINE**

Note that whitespaces between ``NOLINT``/``NOLINTNEXTLINE`` and the opening
parenthesis are not allowed (in this case the comment will be treated just as
``NOLINT``/``NOLINTNEXTLINE``), whereas in check names list (inside
the parenthesis) whitespaces can be used and will be ignored.

.. _LibTooling: http://clang.llvm.org/docs/LibTooling.html
.. _How To Setup Tooling For LLVM: http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html


Getting Involved
================

:program:`clang-tidy` has several own checks and can run Clang static analyzer
checks, but its power is in the ability to easily write custom checks.

Checks are organized in modules, which can be linked into :program:`clang-tidy`
with minimal or no code changes in :program:`clang-tidy`.

Checks can plug into the analysis on the preprocessor level using `PPCallbacks`_
or on the AST level using `AST Matchers`_. When an error is found, checks can
report them in a way similar to how Clang diagnostics work. A fix-it hint can be
attached to a diagnostic message.

The interface provided by :program:`clang-tidy` makes it easy to write useful
and precise checks in just a few lines of code. If you have an idea for a good
check, the rest of this document explains how to do this.

There are a few tools particularly useful when developing clang-tidy checks:
  * ``add_new_check.py`` is a script to automate the process of adding a new
    check, it will create the check, update the CMake file and create a test;
  * ``rename_check.py`` does what the script name suggests, renames an existing
    check;
  * :program:`clang-query` is invaluable for interactive prototyping of AST
    matchers and exploration of the Clang AST;
  * `clang-check`_ with the ``-ast-dump`` (and optionally ``-ast-dump-filter``)
    provides a convenient way to dump AST of a C++ program.


.. _AST Matchers: http://clang.llvm.org/docs/LibASTMatchers.html
.. _PPCallbacks: http://clang.llvm.org/doxygen/classclang_1_1PPCallbacks.html
.. _clang-check: http://clang.llvm.org/docs/ClangCheck.html


Choosing the Right Place for your Check
---------------------------------------

If you have an idea of a check, you should decide whether it should be
implemented as a:

+ *Clang diagnostic*: if the check is generic enough, targets code patterns that
  most probably are bugs (rather than style or readability issues), can be
  implemented effectively and with extremely low false positive rate, it may
  make a good Clang diagnostic.

+ *Clang static analyzer check*: if the check requires some sort of control flow
  analysis, it should probably be implemented as a static analyzer check.

+ *clang-tidy check* is a good choice for linter-style checks, checks that are
  related to a certain coding style, checks that address code readability, etc.


Preparing your Workspace
------------------------

If you are new to LLVM development, you should read the `Getting Started with
the LLVM System`_, `Using Clang Tools`_ and `How To Setup Tooling For LLVM`_
documents to check out and build LLVM, Clang and Clang Extra Tools with CMake.

Once you are done, change to the ``llvm/tools/clang/tools/extra`` directory, and
let's start!

.. _Getting Started with the LLVM System: http://llvm.org/docs/GettingStarted.html
.. _Using Clang Tools: http://clang.llvm.org/docs/ClangTools.html


The Directory Structure
-----------------------

:program:`clang-tidy` source code resides in the
``llvm/tools/clang/tools/extra`` directory and is structured as follows:

::

  clang-tidy/                       # Clang-tidy core.
  |-- ClangTidy.h                   # Interfaces for users and checks.
  |-- ClangTidyModule.h             # Interface for clang-tidy modules.
  |-- ClangTidyModuleRegistry.h     # Interface for registering of modules.
     ...
  |-- google/                       # Google clang-tidy module.
  |-+
    |-- GoogleTidyModule.cpp
    |-- GoogleTidyModule.h
          ...
  |-- llvm/                         # LLVM clang-tidy module.
  |-+
    |-- LLVMTidyModule.cpp
    |-- LLVMTidyModule.h
          ...
  |-- objc/                         # Objective-C clang-tidy module.
  |-+
    |-- ObjCTidyModule.cpp
    |-- ObjCTidyModule.h
          ...
  |-- tool/                         # Sources of the clang-tidy binary.
          ...
  test/clang-tidy/                  # Integration tests.
      ...
  unittests/clang-tidy/             # Unit tests.
  |-- ClangTidyTest.h
  |-- GoogleModuleTest.cpp
  |-- LLVMModuleTest.cpp
  |-- ObjCModuleTest.cpp
      ...


Writing a clang-tidy Check
--------------------------

So you have an idea of a useful check for :program:`clang-tidy`.

First, if you're not familiar with LLVM development, read through the `Getting
Started with LLVM`_ document for instructions on setting up your workflow and
the `LLVM Coding Standards`_ document to familiarize yourself with the coding
style used in the project. For code reviews we mostly use `LLVM Phabricator`_.

.. _Getting Started with LLVM: http://llvm.org/docs/GettingStarted.html
.. _LLVM Coding Standards: http://llvm.org/docs/CodingStandards.html
.. _LLVM Phabricator: http://llvm.org/docs/Phabricator.html

Next, you need to decide which module the check belongs to. Modules
are located in subdirectories of `clang-tidy/
<http://reviews.llvm.org/diffusion/L/browse/clang-tools-extra/trunk/clang-tidy/>`_
and contain checks targeting a certain aspect of code quality (performance,
readability, etc.), certain coding style or standard (Google, LLVM, CERT, etc.)
or a widely used API (e.g. MPI). Their names are same as user-facing check
groups names described :ref:`above <checks-groups-table>`.

After choosing the module and the name for the check, run the
``clang-tidy/add_new_check.py`` script to create the skeleton of the check and
plug it to :program:`clang-tidy`. It's the recommended way of adding new checks.

If we want to create a `readability-awesome-function-names`, we would run:

.. code-block:: console

  $ clang-tidy/add_new_check.py readability awesome-function-names


The ``add_new_check.py`` script will:
  * create the class for your check inside the specified module's directory and
    register it in the module and in the build system;
  * create a lit test file in the ``test/clang-tidy/`` directory;
  * create a documentation file and include it into the
    ``docs/clang-tidy/checks/list.rst``.

Let's see in more detail at the check class definition:

.. code-block:: c++

  ...

  #include "../ClangTidy.h"

  namespace clang {
  namespace tidy {
  namespace readability {

  ...
  class AwesomeFunctionNamesCheck : public ClangTidyCheck {
  public:
    AwesomeFunctionNamesCheck(StringRef Name, ClangTidyContext *Context)
        : ClangTidyCheck(Name, Context) {}
    void registerMatchers(ast_matchers::MatchFinder *Finder) override;
    void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
  };

  } // namespace readability
  } // namespace tidy
  } // namespace clang

  ...

Constructor of the check receives the ``Name`` and ``Context`` parameters, and
must forward them to the ``ClangTidyCheck`` constructor.

In our case the check needs to operate on the AST level and it overrides the
``registerMatchers`` and ``check`` methods. If we wanted to analyze code on the
preprocessor level, we'd need instead to override the ``registerPPCallbacks``
method.

In the ``registerMatchers`` method we create an AST Matcher (see `AST Matchers`_
for more information) that will find the pattern in the AST that we want to
inspect. The results of the matching are passed to the ``check`` method, which
can further inspect them and report diagnostics.

.. code-block:: c++

  using namespace ast_matchers;

  void AwesomeFunctionNamesCheck::registerMatchers(MatchFinder *Finder) {
    Finder->addMatcher(functionDecl().bind("x"), this);
  }

  void AwesomeFunctionNamesCheck::check(const MatchFinder::MatchResult &Result) {
    const auto *MatchedDecl = Result.Nodes.getNodeAs<FunctionDecl>("x");
    if (MatchedDecl->getName().startswith("awesome_"))
      return;
    diag(MatchedDecl->getLocation(), "function %0 is insufficiently awesome")
        << MatchedDecl
        << FixItHint::CreateInsertion(MatchedDecl->getLocation(), "awesome_");
  }

(If you want to see an example of a useful check, look at
`clang-tidy/google/ExplicitConstructorCheck.h
<http://reviews.llvm.org/diffusion/L/browse/clang-tools-extra/trunk/clang-tidy/google/ExplicitConstructorCheck.h>`_
and `clang-tidy/google/ExplicitConstructorCheck.cpp
<http://reviews.llvm.org/diffusion/L/browse/clang-tools-extra/trunk/clang-tidy/google/ExplicitConstructorCheck.cpp>`_).


Registering your Check
----------------------

(The ``add_new_check.py`` takes care of registering the check in an existing
module. If you want to create a new module or know the details, read on.)

The check should be registered in the corresponding module with a distinct name:

.. code-block:: c++

  class MyModule : public ClangTidyModule {
   public:
    void addCheckFactories(ClangTidyCheckFactories &CheckFactories) override {
      CheckFactories.registerCheck<ExplicitConstructorCheck>(
          "my-explicit-constructor");
    }
  };

Now we need to register the module in the ``ClangTidyModuleRegistry`` using a
statically initialized variable:

.. code-block:: c++

  static ClangTidyModuleRegistry::Add<MyModule> X("my-module",
                                                  "Adds my lint checks.");


When using LLVM build system, we need to use the following hack to ensure the
module is linked into the :program:`clang-tidy` binary:

Add this near the ``ClangTidyModuleRegistry::Add<MyModule>`` variable:

.. code-block:: c++

  // This anchor is used to force the linker to link in the generated object file
  // and thus register the MyModule.
  volatile int MyModuleAnchorSource = 0;

And this to the main translation unit of the :program:`clang-tidy` binary (or
the binary you link the ``clang-tidy`` library in)
``clang-tidy/tool/ClangTidyMain.cpp``:

.. code-block:: c++

  // This anchor is used to force the linker to link the MyModule.
  extern volatile int MyModuleAnchorSource;
  static int MyModuleAnchorDestination = MyModuleAnchorSource;


Configuring Checks
------------------

If a check needs configuration options, it can access check-specific options
using the ``Options.get<Type>("SomeOption", DefaultValue)`` call in the check
constructor. In this case the check should also override the
``ClangTidyCheck::storeOptions`` method to make the options provided by the
check discoverable. This method lets :program:`clang-tidy` know which options
the check implements and what the current values are (e.g. for the
``-dump-config`` command line option).

.. code-block:: c++

  class MyCheck : public ClangTidyCheck {
    const unsigned SomeOption1;
    const std::string SomeOption2;

  public:
    MyCheck(StringRef Name, ClangTidyContext *Context)
      : ClangTidyCheck(Name, Context),
        SomeOption(Options.get("SomeOption1", -1U)),
        SomeOption(Options.get("SomeOption2", "some default")) {}

    void storeOptions(ClangTidyOptions::OptionMap &Opts) override {
      Options.store(Opts, "SomeOption1", SomeOption1);
      Options.store(Opts, "SomeOption2", SomeOption2);
    }
    ...

Assuming the check is registered with the name "my-check", the option can then
be set in a ``.clang-tidy`` file in the following way:

.. code-block:: yaml

  CheckOptions:
    - key: my-check.SomeOption1
      value: 123
    - key: my-check.SomeOption2
      value: 'some other value'

If you need to specify check options on a command line, you can use the inline
YAML format:

.. code-block:: console

  $ clang-tidy -config="{CheckOptions: [{key: a, value: b}, {key: x, value: y}]}" ...


Testing Checks
--------------

To run tests for :program:`clang-tidy` use the command:

.. code-block:: console

  $ ninja check-clang-tools

:program:`clang-tidy` checks can be tested using either unit tests or
`lit`_ tests. Unit tests may be more convenient to test complex replacements
with strict checks. `Lit`_ tests allow using partial text matching and regular
expressions which makes them more suitable for writing compact tests for
diagnostic messages.

The ``check_clang_tidy.py`` script provides an easy way to test both
diagnostic messages and fix-its. It filters out ``CHECK`` lines from the test
file, runs :program:`clang-tidy` and verifies messages and fixes with two
separate `FileCheck`_ invocations: once with FileCheck's directive
prefix set to ``CHECK-MESSAGES``, validating the diagnostic messages,
and once with the directive prefix set to ``CHECK-FIXES``, running
against the fixed code (i.e., the code after generated fix-its are
applied). In particular, ``CHECK-FIXES:`` can be used to check
that code was not modified by fix-its, by checking that it is present
unchanged in the fixed code. The full set of `FileCheck`_ directives
is available (e.g., ``CHECK-MESSAGES-SAME:``, ``CHECK-MESSAGES-NOT:``), though
typically the basic ``CHECK`` forms (``CHECK-MESSAGES`` and ``CHECK-FIXES``)
are sufficient for clang-tidy tests. Note that the `FileCheck`_
documentation mostly assumes the default prefix (``CHECK``), and hence
describes the directive as ``CHECK:``, ``CHECK-SAME:``, ``CHECK-NOT:``, etc.
Replace ``CHECK`` by either ``CHECK-FIXES`` or ``CHECK-MESSAGES`` for
clang-tidy tests.

An additional check enabled by ``check_clang_tidy.py`` ensures that
if `CHECK-MESSAGES:` is used in a file then every warning or error
must have an associated CHECK in that file.

To use the ``check_clang_tidy.py`` script, put a .cpp file with the
appropriate ``RUN`` line in the ``test/clang-tidy`` directory. Use
``CHECK-MESSAGES:`` and ``CHECK-FIXES:`` lines to write checks against
diagnostic messages and fixed code.

It's advised to make the checks as specific as possible to avoid checks matching
to incorrect parts of the input. Use ``[[@LINE+X]]``/``[[@LINE-X]]``
substitutions and distinct function and variable names in the test code.

Here's an example of a test using the ``check_clang_tidy.py`` script (the full
source code is at `test/clang-tidy/google-readability-casting.cpp`_):

.. code-block:: c++

  // RUN: %check_clang_tidy %s google-readability-casting %t

  void f(int a) {
    int b = (int)a;
    // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: redundant cast to the same type [google-readability-casting]
    // CHECK-FIXES: int b = a;
  }

There are many dark corners in the C++ language, and it may be difficult to make
your check work perfectly in all cases, especially if it issues fix-it hints. The
most frequent pitfalls are macros and templates:

1. code written in a macro body/template definition may have a different meaning
   depending on the macro expansion/template instantiation;
2. multiple macro expansions/template instantiations may result in the same code
   being inspected by the check multiple times (possibly, with different
   meanings, see 1), and the same warning (or a slightly different one) may be
   issued by the check multiple times; :program:`clang-tidy` will deduplicate
   _identical_ warnings, but if the warnings are slightly different, all of them
   will be shown to the user (and used for applying fixes, if any);
3. making replacements to a macro body/template definition may be fine for some
   macro expansions/template instantiations, but easily break some other
   expansions/instantiations.

.. _lit: http://llvm.org/docs/CommandGuide/lit.html
.. _FileCheck: http://llvm.org/docs/CommandGuide/FileCheck.html
.. _test/clang-tidy/google-readability-casting.cpp: http://reviews.llvm.org/diffusion/L/browse/clang-tools-extra/trunk/test/clang-tidy/google-readability-casting.cpp


Running clang-tidy on LLVM
--------------------------

To test a check it's best to try it out on a larger code base. LLVM and Clang
are the natural targets as you already have the source code around. The most
convenient way to run :program:`clang-tidy` is with a compile command database;
CMake can automatically generate one, for a description of how to enable it see
`How To Setup Tooling For LLVM`_. Once ``compile_commands.json`` is in place and
a working version of :program:`clang-tidy` is in ``PATH`` the entire code base
can be analyzed with ``clang-tidy/tool/run-clang-tidy.py``. The script executes
:program:`clang-tidy` with the default set of checks on every translation unit
in the compile command database and displays the resulting warnings and errors.
The script provides multiple configuration flags.

* The default set of checks can be overridden using the ``-checks`` argument,
  taking the identical format as :program:`clang-tidy` does. For example
  ``-checks=-*,modernize-use-override`` will run the ``modernize-use-override``
  check only.

* To restrict the files examined you can provide one or more regex arguments
  that the file names are matched against.
  ``run-clang-tidy.py clang-tidy/.*Check\.cpp`` will only analyze clang-tidy
  checks. It may also be necessary to restrict the header files warnings are
  displayed from using the ``-header-filter`` flag. It has the same behavior
  as the corresponding :program:`clang-tidy` flag.

* To apply suggested fixes ``-fix`` can be passed as an argument. This gathers
  all changes in a temporary directory and applies them. Passing ``-format``
  will run clang-format over changed lines.

