diff options
author | Alexander Kornienko <alexfh@google.com> | 2015-08-27 18:10:07 +0000 |
---|---|---|
committer | Alexander Kornienko <alexfh@google.com> | 2015-08-27 18:10:07 +0000 |
commit | aabfadef84cdcc6aef529348a287e0130f7aee6d (patch) | |
tree | c1f69930d251e6b4af7d9d2cc9a17967eb63ff9f /clang-tools-extra/docs/clang-tidy | |
parent | 5ce1a84f9a0ae21848b2b7842ae90c2a37d6f6e3 (diff) | |
download | bcm5719-llvm-aabfadef84cdcc6aef529348a287e0130f7aee6d.tar.gz bcm5719-llvm-aabfadef84cdcc6aef529348a287e0130f7aee6d.zip |
[clang-tidy] Move clang-tidy docs to a separate directory. Create doc files for checks
The doc files for checks have been generated from the corresponding header files
using the docs/clang-tidy/tools/dump_check_docs.py script. Committing the script
as well, but the intention is to move all the user-facing docs from header files
to the rST files and add links to .h files appropriately.
llvm-svn: 246173
Diffstat (limited to 'clang-tools-extra/docs/clang-tidy')
53 files changed, 1276 insertions, 0 deletions
diff --git a/clang-tools-extra/docs/clang-tidy/checks/google-build-explicit-make-pair.rst b/clang-tools-extra/docs/clang-tidy/checks/google-build-explicit-make-pair.rst new file mode 100644 index 00000000000..2bdd506fdf1 --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/google-build-explicit-make-pair.rst @@ -0,0 +1,10 @@ +google-build-explicit-make-pair +=============================== + + +Check that ``make_pair``'s template arguments are deduced. + +G++ 4.6 in C++11 mode fails badly if ``make_pair``'s template arguments are +specified explicitly, and such use isn't intended in any case. + +Corresponding cpplint.py check name: 'build/explicit_make_pair'. diff --git a/clang-tools-extra/docs/clang-tidy/checks/google-build-namespaces.rst b/clang-tools-extra/docs/clang-tidy/checks/google-build-namespaces.rst new file mode 100644 index 00000000000..ded979bad6d --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/google-build-namespaces.rst @@ -0,0 +1,9 @@ +google-build-namespaces +======================= + + +Finds anonymous namespaces in headers. + +http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml?showone=Namespaces#Namespaces + +Corresponding cpplint.py check name: 'build/namespaces'. diff --git a/clang-tools-extra/docs/clang-tidy/checks/google-build-using-namespace.rst b/clang-tools-extra/docs/clang-tidy/checks/google-build-using-namespace.rst new file mode 100644 index 00000000000..4e1a56e9281 --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/google-build-using-namespace.rst @@ -0,0 +1,19 @@ +google-build-using-namespace +============================ + + +Finds using namespace directives. + +http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml?showone=Namespaces#Namespaces + +The check implements the following rule of the Google C++ Style Guide: + + You may not use a using-directive to make all names from a namespace + available. + + .. code:: c++ + + // Forbidden -- This pollutes the namespace. + using namespace foo; + +Corresponding cpplint.py check name: ``build/namespaces``. diff --git a/clang-tools-extra/docs/clang-tidy/checks/google-explicit-constructor.rst b/clang-tools-extra/docs/clang-tidy/checks/google-explicit-constructor.rst new file mode 100644 index 00000000000..e72bcbf07dc --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/google-explicit-constructor.rst @@ -0,0 +1,7 @@ +google-explicit-constructor +=========================== + + +Checks that all single-argument constructors are explicit. + +See http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Explicit_Constructors diff --git a/clang-tools-extra/docs/clang-tidy/checks/google-global-names-in-headers.rst b/clang-tools-extra/docs/clang-tidy/checks/google-global-names-in-headers.rst new file mode 100644 index 00000000000..3b6815e13fc --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/google-global-names-in-headers.rst @@ -0,0 +1,6 @@ +google-global-names-in-headers +============================== + + +Flag global namespace pollution in header files. +Right now it only triggers on using declarations and directives. diff --git a/clang-tools-extra/docs/clang-tidy/checks/google-readability-braces-around-statements.rst b/clang-tools-extra/docs/clang-tidy/checks/google-readability-braces-around-statements.rst new file mode 100644 index 00000000000..0461d75e499 --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/google-readability-braces-around-statements.rst @@ -0,0 +1,29 @@ +google-readability-braces-around-statements +=========================================== + + +Checks that bodies of ``if`` statements and loops (``for``, ``range-for``, +``do-while``, and ``while``) are inside braces + +Before: + +.. code:: c++ + + if (condition) + statement; + +After: + +.. code:: c++ + + if (condition) { + statement; + } + +Additionally, one can define an option ``ShortStatementLines`` defining the +minimal number of lines that the statement should have in order to trigger +this check. + +The number of lines is counted from the end of condition or initial keyword +(``do``/``else``) until the last line of the inner statement. Default value 0 +means that braces will be added to all statements (not having them already). diff --git a/clang-tools-extra/docs/clang-tidy/checks/google-readability-casting.rst b/clang-tools-extra/docs/clang-tidy/checks/google-readability-casting.rst new file mode 100644 index 00000000000..424e184a01e --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/google-readability-casting.rst @@ -0,0 +1,13 @@ +google-readability-casting +========================== + + +Finds usages of C-style casts. + +http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml?showone=Casting#Casting + +Corresponding cpplint.py check name: 'readability/casting'. + +This check is similar to ``-Wold-style-cast``, but it suggests automated fixes +in some cases. The reported locations should not be different from the +ones generated by ``-Wold-style-cast``. diff --git a/clang-tools-extra/docs/clang-tidy/checks/google-readability-function-size.rst b/clang-tools-extra/docs/clang-tidy/checks/google-readability-function-size.rst new file mode 100644 index 00000000000..d49e81e5e9d --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/google-readability-function-size.rst @@ -0,0 +1,15 @@ +google-readability-function-size +================================ + + +Checks for large functions based on various metrics. + +These options are supported: + + * ``LineThreshold`` - flag functions exceeding this number of lines. The + default is ``-1`` (ignore the number of lines). + * ``StatementThreshold`` - flag functions exceeding this number of + statements. This may differ significantly from the number of lines for + macro-heavy code. The default is ``800``. + * ``BranchThreshold`` - flag functions exceeding this number of control + statements. The default is ``-1`` (ignore the number of branches). diff --git a/clang-tools-extra/docs/clang-tidy/checks/google-readability-namespace-comments.rst b/clang-tools-extra/docs/clang-tidy/checks/google-readability-namespace-comments.rst new file mode 100644 index 00000000000..cb76ea7e1ac --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/google-readability-namespace-comments.rst @@ -0,0 +1,9 @@ +google-readability-namespace-comments +===================================== + + +Checks that long namespaces have a closing comment. + +http://llvm.org/docs/CodingStandards.html#namespace-indentation + +http://google-styleguide.googlecode.com/svn/trunk/cppguide.html#Namespaces diff --git a/clang-tools-extra/docs/clang-tidy/checks/google-readability-redundant-smartptr-get.rst b/clang-tools-extra/docs/clang-tidy/checks/google-readability-redundant-smartptr-get.rst new file mode 100644 index 00000000000..8dba2338477 --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/google-readability-redundant-smartptr-get.rst @@ -0,0 +1,14 @@ +google-readability-redundant-smartptr-get +========================================= + + +Find and remove redundant calls to smart pointer's ``.get()`` method. + +Examples: + +.. code:: c++ + + ptr.get()->Foo() ==> ptr->Foo() + *ptr.get() ==> *ptr + *ptr->get() ==> **ptr + diff --git a/clang-tools-extra/docs/clang-tidy/checks/google-readability-todo.rst b/clang-tools-extra/docs/clang-tidy/checks/google-readability-todo.rst new file mode 100644 index 00000000000..e07f1bc1d83 --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/google-readability-todo.rst @@ -0,0 +1,7 @@ +google-readability-todo +======================= + + +Finds TODO comments without a username or bug number. + +Corresponding cpplint.py check: 'readability/todo' diff --git a/clang-tools-extra/docs/clang-tidy/checks/google-runtime-int.rst b/clang-tools-extra/docs/clang-tidy/checks/google-runtime-int.rst new file mode 100644 index 00000000000..4a82f792740 --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/google-runtime-int.rst @@ -0,0 +1,8 @@ +google-runtime-int +================== + + +Finds uses of ``short``, ``long`` and ``long long`` and suggest replacing them +with ``u?intXX(_t)?``. + +Correspondig cpplint.py check: 'runtime/int'. diff --git a/clang-tools-extra/docs/clang-tidy/checks/google-runtime-member-string-references.rst b/clang-tools-extra/docs/clang-tidy/checks/google-runtime-member-string-references.rst new file mode 100644 index 00000000000..f0f1fc09b02 --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/google-runtime-member-string-references.rst @@ -0,0 +1,25 @@ +google-runtime-member-string-references +======================================= + + +Finds members of type ``const string&``. + +const string reference members are generally considered unsafe as they can +be created from a temporary quite easily. + +.. code:: c++ + + struct S { + S(const string &Str) : Str(Str) {} + const string &Str; + }; + S instance("string"); + +In the constructor call a string temporary is created from ``const char *`` +and destroyed immediately after the call. This leaves around a dangling +reference. + +This check emit warnings for both ``std::string`` and ``::string`` const +reference members. + +Corresponding cpplint.py check name: 'runtime/member_string_reference'. diff --git a/clang-tools-extra/docs/clang-tidy/checks/google-runtime-memset.rst b/clang-tools-extra/docs/clang-tidy/checks/google-runtime-memset.rst new file mode 100644 index 00000000000..637cee1550a --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/google-runtime-memset.rst @@ -0,0 +1,10 @@ +google-runtime-memset +===================== + + +Finds calls to memset with a literal zero in the length argument. + +This is most likely unintended and the length and value arguments are +swapped. + +Corresponding cpplint.py check name: 'runtime/memset'. diff --git a/clang-tools-extra/docs/clang-tidy/checks/google-runtime-operator.rst b/clang-tools-extra/docs/clang-tidy/checks/google-runtime-operator.rst new file mode 100644 index 00000000000..acfbb43af75 --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/google-runtime-operator.rst @@ -0,0 +1,9 @@ +google-runtime-operator +======================= + + +Finds overloads of unary ``operator &``. + +http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml?showone=Operator_Overloading#Operator_Overloading + +Corresponding cpplint.py check name: 'runtime/operator'. diff --git a/clang-tools-extra/docs/clang-tidy/checks/list.rst b/clang-tools-extra/docs/clang-tidy/checks/list.rst new file mode 100644 index 00000000000..1f10dcb9082 --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/list.rst @@ -0,0 +1,54 @@ +List of clang-tidy Checks +========================= + +.. toctree:: + google-build-explicit-make-pair + google-build-namespaces + google-build-using-namespace + google-explicit-constructor + google-global-names-in-headers + google-readability-braces-around-statements + google-readability-casting + google-readability-function-size + google-readability-namespace-comments + google-readability-redundant-smartptr-get + google-readability-todo + google-runtime-int + google-runtime-member-string-references + google-runtime-memset + google-runtime-operator + llvm-header-guard + llvm-include-order + llvm-namespace-comment + llvm-twine-local + misc-argument-comment + misc-assert-side-effect + misc-assign-operator-signature + misc-bool-pointer-implicit-conversion + misc-inaccurate-erase + misc-inefficient-algorithm + misc-macro-parentheses + misc-macro-repeated-side-effects + misc-move-constructor-init + misc-noexcept-move-constructor + misc-static-assert + misc-swapped-arguments + misc-undelegated-constructor + misc-uniqueptr-reset-release + misc-unused-alias-decls + misc-unused-parameters + misc-unused-raii + misc-use-override + modernize-loop-convert + modernize-pass-by-value + modernize-use-nullptr + readability-braces-around-statements + readability-container-size-empty + readability-else-after-return + readability-function-size + readability-identifier-naming + readability-named-parameter + readability-redundant-smartptr-get + readability-redundant-string-cstr + readability-shrink-to-fit + readability-simplify-boolean-expr
\ No newline at end of file diff --git a/clang-tools-extra/docs/clang-tidy/checks/llvm-header-guard.rst b/clang-tools-extra/docs/clang-tidy/checks/llvm-header-guard.rst new file mode 100644 index 00000000000..cc4f8d7b231 --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/llvm-header-guard.rst @@ -0,0 +1,4 @@ +llvm-header-guard +================= + +TODO: add docs diff --git a/clang-tools-extra/docs/clang-tidy/checks/llvm-include-order.rst b/clang-tools-extra/docs/clang-tidy/checks/llvm-include-order.rst new file mode 100644 index 00000000000..562ff515529 --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/llvm-include-order.rst @@ -0,0 +1,7 @@ +llvm-include-order +================== + + +Checks the correct order of ``#includes``. + +See http://llvm.org/docs/CodingStandards.html#include-style diff --git a/clang-tools-extra/docs/clang-tidy/checks/llvm-namespace-comment.rst b/clang-tools-extra/docs/clang-tidy/checks/llvm-namespace-comment.rst new file mode 100644 index 00000000000..8138da71acc --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/llvm-namespace-comment.rst @@ -0,0 +1,9 @@ +llvm-namespace-comment +====================== + + +Checks that long namespaces have a closing comment. + +http://llvm.org/docs/CodingStandards.html#namespace-indentation + +http://google-styleguide.googlecode.com/svn/trunk/cppguide.html#Namespaces diff --git a/clang-tools-extra/docs/clang-tidy/checks/llvm-twine-local.rst b/clang-tools-extra/docs/clang-tidy/checks/llvm-twine-local.rst new file mode 100644 index 00000000000..9fb7fec1300 --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/llvm-twine-local.rst @@ -0,0 +1,6 @@ +llvm-twine-local +================ + + +Looks for local ``Twine`` variables which are prone to use after frees and +should be generally avoided. diff --git a/clang-tools-extra/docs/clang-tidy/checks/misc-argument-comment.rst b/clang-tools-extra/docs/clang-tidy/checks/misc-argument-comment.rst new file mode 100644 index 00000000000..d3d51218475 --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/misc-argument-comment.rst @@ -0,0 +1,18 @@ +misc-argument-comment +===================== + + +Checks that argument comments match parameter names. + +The check understands argument comments in the form ``/*parameter_name=*/`` +that are placed right before the argument. + +.. code:: c++ + + void f(bool foo); + + ... + f(/*bar=*/true); + // warning: argument name 'bar' in comment does not match parameter name 'foo' + +The check tries to detect typos and suggest automated fixes for them. diff --git a/clang-tools-extra/docs/clang-tidy/checks/misc-assert-side-effect.rst b/clang-tools-extra/docs/clang-tidy/checks/misc-assert-side-effect.rst new file mode 100644 index 00000000000..dd17732a4cf --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/misc-assert-side-effect.rst @@ -0,0 +1,17 @@ +misc-assert-side-effect +======================= + + +Finds ``assert()`` with side effect. + +The condition of ``assert()`` is evaluated only in debug builds so a +condition with side effect can cause different behavior in debug / release +builds. + +There are two options: + + - ``AssertMacros``: A comma-separated list of the names of assert macros to + be checked. + - ``CheckFunctionCalls``: Whether to treat non-const member and non-member + functions as they produce side effects. Disabled by default because it + can increase the number of false positive warnings. diff --git a/clang-tools-extra/docs/clang-tidy/checks/misc-assign-operator-signature.rst b/clang-tools-extra/docs/clang-tidy/checks/misc-assign-operator-signature.rst new file mode 100644 index 00000000000..71d6c7b6d22 --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/misc-assign-operator-signature.rst @@ -0,0 +1,10 @@ +misc-assign-operator-signature +============================== + + +Finds declarations of assign operators with the wrong return and/or argument +types. + + * The return type must be ``Class&``. + * Works with move-assign and assign by value. + * Private and deleted operators are ignored. diff --git a/clang-tools-extra/docs/clang-tidy/checks/misc-bool-pointer-implicit-conversion.rst b/clang-tools-extra/docs/clang-tidy/checks/misc-bool-pointer-implicit-conversion.rst new file mode 100644 index 00000000000..66fa2ad9a58 --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/misc-bool-pointer-implicit-conversion.rst @@ -0,0 +1,16 @@ +misc-bool-pointer-implicit-conversion +===================================== + + +Checks for conditions based on implicit conversion from a bool pointer to +bool. + +Example: + +.. code:: c++ + + bool *p; + if (p) { + // Never used in a pointer-specific way. + } + diff --git a/clang-tools-extra/docs/clang-tidy/checks/misc-inaccurate-erase.rst b/clang-tools-extra/docs/clang-tidy/checks/misc-inaccurate-erase.rst new file mode 100644 index 00000000000..5d8a8a2378b --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/misc-inaccurate-erase.rst @@ -0,0 +1,11 @@ +misc-inaccurate-erase +===================== + + +Checks for inaccurate use of the ``erase()`` method. + +Algorithms like ``remove()`` do not actually remove any element from the +container but return an iterator to the first redundant element at the end +of the container. These redundant elements must be removed using the +``erase()`` method. This check warns when not all of the elements will be +removed due to using an inappropriate overload. diff --git a/clang-tools-extra/docs/clang-tidy/checks/misc-inefficient-algorithm.rst b/clang-tools-extra/docs/clang-tidy/checks/misc-inefficient-algorithm.rst new file mode 100644 index 00000000000..7ef038068c4 --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/misc-inefficient-algorithm.rst @@ -0,0 +1,9 @@ +misc-inefficient-algorithm +========================== + + +Warns on inefficient use of STL algorithms on associative containers. + +Associative containers implements some of the algorithms as methods which +should be preferred to the algorithms in the algorithm header. The methods +can take advanatage of the order of the elements. diff --git a/clang-tools-extra/docs/clang-tidy/checks/misc-macro-parentheses.rst b/clang-tools-extra/docs/clang-tidy/checks/misc-macro-parentheses.rst new file mode 100644 index 00000000000..b066272c448 --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/misc-macro-parentheses.rst @@ -0,0 +1,17 @@ +misc-macro-parentheses +====================== + + +Finds macros that can have unexpected behaviour due to missing parentheses. + +Macros are expanded by the preprocessor as-is. As a result, there can be +unexpected behaviour; operators may be evaluated in unexpected order and +unary operators may become binary operators, etc. + +When the replacement list has an expression, it is recommended to surround +it with parentheses. This ensures that the macro result is evaluated +completely before it is used. + +It is also recommended to surround macro arguments in the replacement list +with parentheses. This ensures that the argument value is calculated +properly. diff --git a/clang-tools-extra/docs/clang-tidy/checks/misc-macro-repeated-side-effects.rst b/clang-tools-extra/docs/clang-tidy/checks/misc-macro-repeated-side-effects.rst new file mode 100644 index 00000000000..0a1a8d1e978 --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/misc-macro-repeated-side-effects.rst @@ -0,0 +1,5 @@ +misc-macro-repeated-side-effects +================================ + + +Checks for repeated argument with side effects in macros. diff --git a/clang-tools-extra/docs/clang-tidy/checks/misc-move-constructor-init.rst b/clang-tools-extra/docs/clang-tidy/checks/misc-move-constructor-init.rst new file mode 100644 index 00000000000..d105714676b --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/misc-move-constructor-init.rst @@ -0,0 +1,7 @@ +misc-move-constructor-init +========================== + + +The check flags user-defined move constructors that have a ctor-initializer +initializing a member or base class through a copy constructor instead of a +move constructor. diff --git a/clang-tools-extra/docs/clang-tidy/checks/misc-noexcept-move-constructor.rst b/clang-tools-extra/docs/clang-tidy/checks/misc-noexcept-move-constructor.rst new file mode 100644 index 00000000000..9d6438fbca8 --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/misc-noexcept-move-constructor.rst @@ -0,0 +1,11 @@ +misc-noexcept-move-constructor +============================== + + +The check flags user-defined move constructors and assignment operators not +marked with ``noexcept`` or marked with ``noexcept(expr)`` where ``expr`` +evaluates to ``false`` (but is not a ``false`` literal itself). + +Move constructors of all the types used with STL containers, for example, +need to be declared ``noexcept``. Otherwise STL will choose copy constructors +instead. The same is valid for move assignment operations. diff --git a/clang-tools-extra/docs/clang-tidy/checks/misc-static-assert.rst b/clang-tools-extra/docs/clang-tidy/checks/misc-static-assert.rst new file mode 100644 index 00000000000..5ee3322eebc --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/misc-static-assert.rst @@ -0,0 +1,9 @@ +misc-static-assert +================== + + +Replaces ``assert()`` with ``static_assert()`` if the condition is evaluatable +at compile time. + +The condition of ``static_assert()`` is evaluated at compile time which is +safer and more efficient. diff --git a/clang-tools-extra/docs/clang-tidy/checks/misc-swapped-arguments.rst b/clang-tools-extra/docs/clang-tidy/checks/misc-swapped-arguments.rst new file mode 100644 index 00000000000..5979d13711e --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/misc-swapped-arguments.rst @@ -0,0 +1,5 @@ +misc-swapped-arguments +====================== + + +Finds potentially swapped arguments by looking at implicit conversions. diff --git a/clang-tools-extra/docs/clang-tidy/checks/misc-undelegated-constructor.rst b/clang-tools-extra/docs/clang-tidy/checks/misc-undelegated-constructor.rst new file mode 100644 index 00000000000..d4c567184e5 --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/misc-undelegated-constructor.rst @@ -0,0 +1,9 @@ +misc-undelegated-constructor +============================ + + +Finds creation of temporary objects in constructors that look like a +function call to another constructor of the same class. + +The user most likely meant to use a delegating constructor or base class +initializer. diff --git a/clang-tools-extra/docs/clang-tidy/checks/misc-uniqueptr-reset-release.rst b/clang-tools-extra/docs/clang-tidy/checks/misc-uniqueptr-reset-release.rst new file mode 100644 index 00000000000..92c64d763b3 --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/misc-uniqueptr-reset-release.rst @@ -0,0 +1,15 @@ +misc-uniqueptr-reset-release +============================ + + +Find and replace ``unique_ptr::reset(release())`` with ``std::move()``. + +Example: + +.. code:: c++ + + std::unique_ptr<Foo> x, y; + x.reset(y.release()); -> x = std::move(y); + +If ``y`` is already rvalue, ``std::move()`` is not added. ``x`` and ``y`` can also +be ``std::unique_ptr<Foo>*``. diff --git a/clang-tools-extra/docs/clang-tidy/checks/misc-unused-alias-decls.rst b/clang-tools-extra/docs/clang-tidy/checks/misc-unused-alias-decls.rst new file mode 100644 index 00000000000..272eb3776ee --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/misc-unused-alias-decls.rst @@ -0,0 +1,5 @@ +misc-unused-alias-decls +======================= + + +Finds unused namespace alias declarations. diff --git a/clang-tools-extra/docs/clang-tidy/checks/misc-unused-parameters.rst b/clang-tools-extra/docs/clang-tidy/checks/misc-unused-parameters.rst new file mode 100644 index 00000000000..36aae57fd36 --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/misc-unused-parameters.rst @@ -0,0 +1,6 @@ +misc-unused-parameters +====================== + + +Finds unused parameters and fixes them, so that ``-Wunused-parameter`` can be +turned on. diff --git a/clang-tools-extra/docs/clang-tidy/checks/misc-unused-raii.rst b/clang-tools-extra/docs/clang-tidy/checks/misc-unused-raii.rst new file mode 100644 index 00000000000..99e50ec755d --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/misc-unused-raii.rst @@ -0,0 +1,28 @@ +misc-unused-raii +================ + + +Finds temporaries that look like RAII objects. + +The canonical example for this is a scoped lock. + +.. code:: c++ + + { + scoped_lock(&global_mutex); + critical_section(); + } + +The destructor of the scoped_lock is called before the ``critical_section`` is +entered, leaving it unprotected. + +We apply a number of heuristics to reduce the false positive count of this +check: + + * Ignore code expanded from macros. Testing frameworks make heavy use of + this. + * Ignore types with no user-declared constructor. Those are very unlikely + to be RAII objects. + * Ignore objects at the end of a compound statement (doesn't change + behavior). + * Ignore objects returned from a call. diff --git a/clang-tools-extra/docs/clang-tidy/checks/misc-use-override.rst b/clang-tools-extra/docs/clang-tidy/checks/misc-use-override.rst new file mode 100644 index 00000000000..d579507f954 --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/misc-use-override.rst @@ -0,0 +1,5 @@ +misc-use-override +================= + + +Use C++11's ``override`` and remove ``virtual`` where applicable. diff --git a/clang-tools-extra/docs/clang-tidy/checks/modernize-loop-convert.rst b/clang-tools-extra/docs/clang-tidy/checks/modernize-loop-convert.rst new file mode 100644 index 00000000000..0bd0cfec5d8 --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/modernize-loop-convert.rst @@ -0,0 +1,4 @@ +modernize-loop-convert +====================== + + diff --git a/clang-tools-extra/docs/clang-tidy/checks/modernize-pass-by-value.rst b/clang-tools-extra/docs/clang-tidy/checks/modernize-pass-by-value.rst new file mode 100644 index 00000000000..56a0fc303a1 --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/modernize-pass-by-value.rst @@ -0,0 +1,4 @@ +modernize-pass-by-value +======================= + + diff --git a/clang-tools-extra/docs/clang-tidy/checks/modernize-use-nullptr.rst b/clang-tools-extra/docs/clang-tidy/checks/modernize-use-nullptr.rst new file mode 100644 index 00000000000..1c181773270 --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/modernize-use-nullptr.rst @@ -0,0 +1,4 @@ +modernize-use-nullptr +===================== + + diff --git a/clang-tools-extra/docs/clang-tidy/checks/readability-braces-around-statements.rst b/clang-tools-extra/docs/clang-tidy/checks/readability-braces-around-statements.rst new file mode 100644 index 00000000000..c12aed1765c --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/readability-braces-around-statements.rst @@ -0,0 +1,29 @@ +readability-braces-around-statements +==================================== + + +Checks that bodies of ``if`` statements and loops (``for``, ``range-for``, +``do-while``, and ``while``) are inside braces + +Before: + +.. code:: c++ + + if (condition) + statement; + +After: + +.. code:: c++ + + if (condition) { + statement; + } + +Additionally, one can define an option ``ShortStatementLines`` defining the +minimal number of lines that the statement should have in order to trigger +this check. + +The number of lines is counted from the end of condition or initial keyword +(``do``/``else``) until the last line of the inner statement. Default value 0 +means that braces will be added to all statements (not having them already). diff --git a/clang-tools-extra/docs/clang-tidy/checks/readability-container-size-empty.rst b/clang-tools-extra/docs/clang-tidy/checks/readability-container-size-empty.rst new file mode 100644 index 00000000000..86562df6a68 --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/readability-container-size-empty.rst @@ -0,0 +1,14 @@ +readability-container-size-empty +================================ + + +Checks whether a call to the ``size()`` method can be replaced with a call to +``empty()``. + +The emptiness of a container should be checked using the ``empty()`` method +instead of the ``size()`` method. It is not guaranteed that ``size()`` is a +constant-time function, and it is generally more efficient and also shows +clearer intent to use ``empty()``. Furthermore some containers may implement +the ``empty()`` method but not implement the ``size()`` method. Using ``empty()`` +whenever possible makes it easier to switch to another container in the +future. diff --git a/clang-tools-extra/docs/clang-tidy/checks/readability-else-after-return.rst b/clang-tools-extra/docs/clang-tidy/checks/readability-else-after-return.rst new file mode 100644 index 00000000000..54a3f6642b4 --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/readability-else-after-return.rst @@ -0,0 +1,7 @@ +readability-else-after-return +============================= + + +Flags the usages of ``else`` after ``return``. + +http://llvm.org/docs/CodingStandards.html#don-t-use-else-after-a-return diff --git a/clang-tools-extra/docs/clang-tidy/checks/readability-function-size.rst b/clang-tools-extra/docs/clang-tidy/checks/readability-function-size.rst new file mode 100644 index 00000000000..7d5650903d8 --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/readability-function-size.rst @@ -0,0 +1,15 @@ +readability-function-size +========================= + + +Checks for large functions based on various metrics. + +These options are supported: + + * ``LineThreshold`` - flag functions exceeding this number of lines. The + default is ``-1`` (ignore the number of lines). + * ``StatementThreshold`` - flag functions exceeding this number of + statements. This may differ significantly from the number of lines for + macro-heavy code. The default is ``800``. + * ``BranchThreshold`` - flag functions exceeding this number of control + statements. The default is ``-1`` (ignore the number of branches). diff --git a/clang-tools-extra/docs/clang-tidy/checks/readability-identifier-naming.rst b/clang-tools-extra/docs/clang-tidy/checks/readability-identifier-naming.rst new file mode 100644 index 00000000000..66319a593c9 --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/readability-identifier-naming.rst @@ -0,0 +1,17 @@ +readability-identifier-naming +============================= + + +Checks for identifiers naming style mismatch. + +This check will try to enforce coding guidelines on the identifiers naming. +It supports ``lower_case``, ``UPPER_CASE``, ``camelBack`` and ``CamelCase`` casing +and tries to convert from one to another if a mismatch is detected. + +It also supports a fixed prefix and suffix that will be prepended or +appended to the identifiers, regardless of the casing. + +Many configuration options are available, in order to be able to create +different rules for different kind of identifier. In general, the +rules are falling back to a more generic rule if the specific case is not +configured. diff --git a/clang-tools-extra/docs/clang-tidy/checks/readability-named-parameter.rst b/clang-tools-extra/docs/clang-tidy/checks/readability-named-parameter.rst new file mode 100644 index 00000000000..bfcabdd9dcb --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/readability-named-parameter.rst @@ -0,0 +1,15 @@ +readability-named-parameter +=========================== + + +Find functions with unnamed arguments. + +The check implements the following rule originating in the Google C++ Style +Guide: + +http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml?showone=Function_Declarations_and_Definitions#Function_Declarations_and_Definitions + +All parameters should be named, with identical names in the declaration and +implementation. + +Corresponding cpplint.py check name: 'readability/function'. diff --git a/clang-tools-extra/docs/clang-tidy/checks/readability-redundant-smartptr-get.rst b/clang-tools-extra/docs/clang-tidy/checks/readability-redundant-smartptr-get.rst new file mode 100644 index 00000000000..c01fbb4bc6a --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/readability-redundant-smartptr-get.rst @@ -0,0 +1,14 @@ +readability-redundant-smartptr-get +================================== + + +Find and remove redundant calls to smart pointer's ``.get()`` method. + +Examples: + +.. code:: c++ + + ptr.get()->Foo() ==> ptr->Foo() + *ptr.get() ==> *ptr + *ptr->get() ==> **ptr + diff --git a/clang-tools-extra/docs/clang-tidy/checks/readability-redundant-string-cstr.rst b/clang-tools-extra/docs/clang-tidy/checks/readability-redundant-string-cstr.rst new file mode 100644 index 00000000000..25b6b086590 --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/readability-redundant-string-cstr.rst @@ -0,0 +1,5 @@ +readability-redundant-string-cstr +================================= + + +Finds unnecessary calls to ``std::string::c_str()``. diff --git a/clang-tools-extra/docs/clang-tidy/checks/readability-shrink-to-fit.rst b/clang-tools-extra/docs/clang-tidy/checks/readability-shrink-to-fit.rst new file mode 100644 index 00000000000..6bc192e10c2 --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/readability-shrink-to-fit.rst @@ -0,0 +1,10 @@ +readability-shrink-to-fit +========================= + + +Replace copy and swap tricks on shrinkable containers with the +``shrink_to_fit()`` method call. + +The ``shrink_to_fit()`` method is more readable and more effective than +the copy and swap trick to reduce the capacity of a shrinkable container. +Note that, the ``shrink_to_fit()`` method is only available in C++11 and up. diff --git a/clang-tools-extra/docs/clang-tidy/checks/readability-simplify-boolean-expr.rst b/clang-tools-extra/docs/clang-tidy/checks/readability-simplify-boolean-expr.rst new file mode 100644 index 00000000000..0abdb040052 --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/readability-simplify-boolean-expr.rst @@ -0,0 +1,76 @@ +readability-simplify-boolean-expr +================================= + + +Looks for boolean expressions involving boolean constants and simplifies +them to use the appropriate boolean expression directly. + +Examples: + +=========================================== ================ +Initial expression Result +------------------------------------------- ---------------- +``if (b == true)`` ``if (b)`` +``if (b == false)`` ``if (!b)`` +``if (b && true)`` ``if (b)`` +``if (b && false)`` ``if (false)`` +``if (b || true)`` ``if (true)`` +``if (b || false)`` ``if (b)`` +``e ? true : false`` ``e`` +``e ? false : true`` ``!e`` +``if (true) t(); else f();`` ``t();`` +``if (false) t(); else f();`` ``f();`` +``if (e) return true; else return false;`` ``return e;`` +``if (e) return false; else return true;`` ``return !e;`` +``if (e) b = true; else b = false;`` ``b = e;`` +``if (e) b = false; else b = true;`` ``b = !e;`` +``if (e) return true; return false;`` ``return e;`` +``if (e) return false; return true;`` ``return !e;`` +=========================================== ================ + +The resulting expression ``e`` is modified as follows: + 1. Unnecessary parentheses around the expression are removed. + 2. Negated applications of ``!`` are eliminated. + 3. Negated applications of comparison operators are changed to use the + opposite condition. + 4. Implicit conversions of pointer to ``bool`` are replaced with explicit + comparisons to ``nullptr``. + 5. Implicit casts to ``bool`` are replaced with explicit casts to ``bool``. + 6. Object expressions with ``explicit operator bool`` conversion operators + are replaced with explicit casts to ``bool``. + +Examples: + 1. The ternary assignment ``bool b = (i < 0) ? true : false;`` has redundant + parentheses and becomes ``bool b = i < 0;``. + + 2. The conditional return ``if (!b) return false; return true;`` has an + implied double negation and becomes ``return b;``. + + 3. The conditional return ``if (i < 0) return false; return true;`` becomes + ``return i >= 0;``. + + The conditional return ``if (i != 0) return false; return true;`` becomes + ``return i == 0;``. + + 4. The conditional return ``if (p) return true; return false;`` has an + implicit conversion of a pointer to ``bool`` and becomes + ``return p != nullptr;``. + + The ternary assignment ``bool b = (i & 1) ? true : false;`` has an + implicit conversion of ``i & 1`` to ``bool`` and becomes + ``bool b = static_cast<bool>(i & 1);``. + + 5. The conditional return ``if (i & 1) return true; else return false;`` has + an implicit conversion of an integer quantity ``i & 1`` to ``bool`` and + becomes ``return static_cast<bool>(i & 1);`` + + 6. Given ``struct X { explicit operator bool(); };``, and an instance ``x`` of + ``struct X``, the conditional return ``if (x) return true; return false;`` + becomes ``return static_cast<bool>(x);`` + +When a conditional boolean return or assignment appears at the end of a +chain of ``if``, ``else if`` statements, the conditional statement is left +unchanged unless the option ``ChainedConditionalReturn`` or +``ChainedConditionalAssignment``, respectively, is specified as non-zero. +The default value for both options is zero. + diff --git a/clang-tools-extra/docs/clang-tidy/index.rst b/clang-tools-extra/docs/clang-tidy/index.rst new file mode 100644 index 00000000000..cc76bb7134e --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/index.rst @@ -0,0 +1,510 @@ +========== +Clang-Tidy +========== + +.. toctree:: + :maxdepth: 1 + + 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-alpha* + +will disable all default checks (``-*``) and enable all ``clang-analyzer-*`` +checks except for ``clang-analyzer-alpha*`` 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. + +There are currently the following groups of checks: + +* Checks related to the LLVM coding conventions have names starting with + ``llvm-``. + +* Checks related to the Google coding conventions have names starting with + ``google-``. + +* Checks with names starting with ``misc-`` don't relate to any particular + coding style. + +* Clang static analyzer checks are named starting with ``clang-analyzer-``. + +Clang diagnostics are treated in a similar way as check diagnostics. Clang +diagnostics are displayed by 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. + +Clang diagnostics have check names starting with ``clang-diagnostic-``. +Diagnostics which have a corresponding warning option, are named +``clang-diagostic-<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: + + General 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 read + from a .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 + should 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. + -enable-check-profile - Enable per-check timing profiles, and print a report to stderr. + -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. + -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 value read from a + .clang-tidy file. + -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 + -system-headers - Display the errors from system headers. + + -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' + HeaderFilterRegex: '' + AnalyzeTemporaryDtors: false + User: user + CheckOptions: + - key: some-check.SomeOption + value: 'some value' + ... + +.. _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 clang-tidy. + +Checks can plug 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 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. + +.. _AST Matchers: http://clang.llvm.org/docs/LibASTMatchers.html +.. _PPCallbacks: http://clang.llvm.org/doxygen/classclang_1_1PPCallbacks.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 + ... + |-- tool/ # Sources of the clang-tidy binary. + ... + test/clang-tidy/ # Integration tests. + ... + unittests/clang-tidy/ # Unit tests. + |-- ClangTidyTest.h + |-- GoogleModuleTest.cpp + |-- LLVMModuleTest.cpp + ... + + +Writing a clang-tidy Check +-------------------------- + +So you have an idea of a useful check for :program:`clang-tidy`. + +You need to decide which module the check belongs to. If the check verifies +conformance of the code to a certain coding style, it probably deserves a +separate module and a directory in ``clang-tidy/`` (there are LLVM and Google +modules already). + +After choosing the module, you need to create a class for your check: + +.. code-block:: c++ + + #include "../ClangTidy.h" + + namespace clang { + namespace tidy { + + class MyCheck : public ClangTidyCheck { + }; + + } // namespace tidy + } // namespace clang + +Next, you need to decide whether it should operate on the preprocessor level or +on the AST level. Let's imagine that we need to work with the AST in our check. +In this case we need to override two methods: + +.. code-block:: c++ + + ... + class ExplicitConstructorCheck : public ClangTidyCheck { + public: + ExplicitConstructorCheck(StringRef Name, ClangTidyContext *Context) + : ClangTidyCheck(Name, Context) {} + void registerMatchers(ast_matchers::MatchFinder *Finder) override; + void check(ast_matchers::MatchFinder::MatchResult &Result) override; + }; + +Constructor of the check receives the ``Name`` and ``Context`` parameters, and +must forward them to the ``ClangTidyCheck`` constructor. + +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 ExplicitConstructorCheck::registerMatchers(MatchFinder *Finder) { + Finder->addMatcher(constructorDecl().bind("ctor"), this); + } + + void ExplicitConstructorCheck::check(const MatchFinder::MatchResult &Result) { + const CXXConstructorDecl *Ctor = + Result.Nodes.getNodeAs<CXXConstructorDecl>("ctor"); + // Do not be confused: isExplicit means 'explicit' keyword is present, + // isImplicit means that it's a compiler-generated constructor. + if (Ctor->isOutOfLine() || Ctor->isExplicit() || Ctor->isImplicit()) + return; + if (Ctor->getNumParams() == 0 || Ctor->getMinRequiredArguments() > 1) + return; + SourceLocation Loc = Ctor->getLocation(); + diag(Loc, "Single-argument constructors must be explicit") + << FixItHint::CreateInsertion(Loc, "explicit "); + } + +(The full code for this check resides in +``clang-tidy/google/ExplicitConstructorCheck.{h,cpp}``). + + +Registering your Check +---------------------- + +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 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 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:: bash + + $ clang-tidy -config="{CheckOptions: [{key: a, value: b}, {key: x, value: y}]}" ... + + +Testing Checks +-------------- + +: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. To use the 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: + +.. code-block:: bash + + // RUN: %python %S/check_clang_tidy.py %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; + } + +.. _lit: http://llvm.org/docs/CommandGuide/lit.html +.. _FileCheck: http://llvm.org/docs/CommandGuide/FileCheck.html + + +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 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=-*,misc-use-override`` will run the ``misc-use-override`` + checker 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 + checkers. 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. + diff --git a/clang-tools-extra/docs/clang-tidy/tools/dump_check_docs.py b/clang-tools-extra/docs/clang-tidy/tools/dump_check_docs.py new file mode 100755 index 00000000000..5f376e76eec --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/tools/dump_check_docs.py @@ -0,0 +1,79 @@ +#!/usr/bin/python + +r""" +Create stubs for check documentation files. +""" + +import os +import re +import sys + +def main(): + clang_tidy_dir = os.path.normpath( + os.path.join(os.path.dirname(sys.argv[0]), '..', '..', '..', + 'clang-tidy')) + + checks_doc_dir = os.path.normpath( + os.path.join(clang_tidy_dir, '..', 'docs', 'clang-tidy', 'checks')) + + registered_checks = {} + defined_checks = {} + + for dir_name, subdir_list, file_list in os.walk(clang_tidy_dir): + print('Processing directory ' + dir_name + '...') + for file_name in file_list: + full_name = os.path.join(dir_name, file_name) + if file_name.endswith('Module.cpp'): + print('Module ' + file_name) + with open(full_name, 'r') as f: + text = f.read() + for class_name, check_name in re.findall( + r'\.\s*registerCheck\s*<\s*([A-Za-z0-9:]+)\s*>\(\s*"([a-z0-9-]+)"', + text): + registered_checks[check_name] = class_name + elif file_name.endswith('.h'): + print(' ' + file_name + '...') + with open(full_name, 'r') as f: + text = f.read() + for comment, _, _, class_name in re.findall( + r'((([\r\n]//)[^\r\n]*)*)\s+class (\w+)\s*:' + + '\s*public\s+ClangTidyCheck\s*\{', text): + defined_checks[class_name] = comment + + print('Registered checks [%s]: [%s]' % + (len(registered_checks), registered_checks)) + print('Check implementations: %s' % len(defined_checks)) + + checks = registered_checks.keys() + checks.sort() + + for check_name in checks: + doc_file_name = os.path.join(checks_doc_dir, check_name + '.rst') + #if os.path.exists(doc_file_name): + # print('Skipping existing file %s...') + # continue + print('Updating %s...' % doc_file_name) + with open(doc_file_name, 'w') as f: + class_name = re.sub(r'.*:', '', registered_checks[check_name]) + f.write(check_name + '\n' + ('=' * len(check_name)) + '\n\n') + if class_name in defined_checks: + text = defined_checks[class_name] + text = re.sub(r'\n//+ ?(\\brief )?', r'\n', text) + text = re.sub(r'(\n *)\\code\n', r'\1.. code:: c++\n\n', text) + text = re.sub(r'(\n *)\\endcode(\n|$)', r'\n', text) + text = re.sub(r'`', r'``', text) + f.write(text + '\n') + else: + f.write('TODO: add docs\n') + + with open(os.path.join(checks_doc_dir, 'list.rst'), 'w') as f: + f.write( +r"""List of clang-tidy Checks +========================= + +.. toctree:: + """ + '\n '.join(checks)) + + +if __name__ == '__main__': + main() |