Table des matières

clang-tidy détecte les parties du code qui sont soit bancals, soit pourrait être écrite d'une meilleure façon.

Ne pas utiliser :

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

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

Il est aussi possible de filtrer certains dossiers :

run-clang-tidy-12 '^((?!/path1/|/path2/).)*$'

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

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

badcode;  // NOLINT
 
// NOLINTNEXTLINE
badcode;
 
badcode;  // NOLINT(cert-err-58-cpp)
 
// NOLINTBEGIN(google*)
Foo(bool param);
// NOLINTEND(google*)

Extensions

Writing a basic clang static analysis check Archive du 02/05/2015 le 30/06/2021

Et une version à jour du système de compilation : Tutorial for building tools using LibTooling and LibASTMatchers, Archive du clang 17.0.0 master le 23/05/2023

Getting Involved Archive du clang 17.0.0 master le 24/05/2023

Cache

kokulshan/clang-tidy-cache

Site web

Il faut avoir installé go.

make
CLANG_TIDY_CACHE_BINARY=/usr/bin/clang-tidy-17 CLANG_TIDY_CACHE_DIR=~/.cache/clang-tidy-cache run-clang-tidy-17 -clang-tidy-binary /usr/local/bin/clang-tidy-cache

matus-chochlik/ctcache

Site web

Il suffit de copier les scripts python clang-tidy et clang-tidy-cache dans /usr/local/bin.

CTCACHE_CLANG_TIDY=/usr/bin/clang-tidy CTCACHE_DIR=~/.cache/clang-tidy-cache run-clang-tidy -clang-tidy-binary /usr/local/bin/clang-tidy