Ceci est une ancienne révision du document !
clang-tidy
détecte les parties du code qui sont soit bancals, soit pourrait être écrite d'une meilleure façon.
Ne pas utiliser :
readability-static-accessed-through-instance
dans le cas d'un projetQt
. Dans la déclaration des classes, les champspublic : … public slot :
seront considérés comme des doublons carslot
est enlevé lors du preprocessing.
CMake
S'intègre parfaitement avec CMake.
Il faut commencer par activer l'option set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
.
Puis lancer la génération des Makefile
avec CC="clang" CXX="clang++" cmake -S . -B build
pour générer également le fichier compile_commands.json
. L'utilisation du compilateur clang
n'est pas obligatoire. Elle est simplement là pour vérifier que le code compile bien avec clang
.
L'analyse se lance avec run-clang-tidy
.
Options d'analyse
Le fichier de config peut se générer via clang-tidy --dump-config > .clang-tidy
. Il est conseillé de générer ce fichier à chaque changement de version de clang, certaines options pouvant être supprimées ou renommées.
Exemple du début du fichier .clang-tidy
:
- .clang-tidy
--- Checks: '*,-llvm-header-guard,-modernize-use-trailing-return-type,-cppcoreguidelines-avoid-magic-numbers,-readability-magic-numbers,-fuchsia-default-arguments-calls' WarningsAsErrors: '*' HeaderFilterRegex: '' ...
Clang-Tidy, part 1: Modernize your source code using C++11/C++14 Archive du 16/03/2017 le 13/02/2020
Analyse uniquement certains dossiers
Il est aussi possible de filtrer certains dossiers :
run-clang-tidy-12 '^((?!/path1/|/path2/).)*$'
Spécifier la localisation de clang-tidy
Peut être utile si on souhaite utiliser clang-tidy
pour Android qui est différent de celui du système mais run-clang-tidy
n'est pas fourni dans le SDK Android.
/usr/lib/llvm-14/bin/run-clang-tidy -clang-tidy-binary .../Android/Sdk/ndk/25.1.8937393/toolchains/llvm/prebuilt/linux-x86_64/bin/clang-tidy
Exclure certains fichiers
Il faut modifier le fichier compile_commands.json
avec une commande perl
qui autorise les regex multilignes.
perl -0777 -i.original -pe 's/,\n\{\n.*\n.*_RCS_FILES\.cpp",\n.*_RCS_FILES\.cpp"\n\}//g' compile_commands.json perl -0777 -i.original -pe 's/\{\n.*\n.*_RCS_FILES\.cpp",\n.*_RCS_FILES\.cpp"\n\},\n//g' compile_commands.json
Gestion les erreurs
- Ignorer la vérification sur des lignes de code spécifiques
badcode; // NOLINT // NOLINTNEXTLINE badcode; badcode; // NOLINT(cert-err-58-cpp) // NOLINTBEGIN(google*) Foo(bool param); // NOLINTEND(google*)