clang-tidy-静的コード解析フレームワーク
原文リンク:https://hokein.github.io/clan...
clang-tidy紹介
clang-tidyはclangベースの静的コード解析フレームワークであり、C++/C/Objective-Cをサポートする.
より強力なlintツールです.ほとんどのlintツールは、問題が発生したコードの場所でしかヒントを与えることができません.その後、人為的に修正する必要があります.一方、clang-tidyは自動修復機能(もちろん、これはどのように修復するかについてはcheck著者が提供する必要がある)を採用し、clang-tidyはモジュール化設計を採用しており、非常に拡張しやすい.ユーザーがclang-tidyに新しい検出機能を追加したい場合は、clang-tidy check実装を作成する必要がある.(clang-tidy checkをどのように作成するかは後述する)、各checkは、Code styleに違反するモードを検出したり、APIが正しく使用されていない方法を検出したりするなどの問題を検出します.
clang-tidy checkは様々な問題を検出することができる:コード仕様に違反するコードパターンを検出する(header guardが満たされず、includeヘッダファイルの順序が間違っている). コンパイル時に発見しにくいコードエラーを探し出す(intをstd::string、変数をヘッダファイルに定義する); deprecatedのAPIを新しいAPIに置き換え、modernizeモジュールの典型的な例は、C++03のコードを自動的にC++11のコードに変換する(for-range-loop,auto,nullptr,overriede,default); Google code styleは、コード内のcode styleに違反した場所を検出するためのcpplintスクリプトを提供しています.clang-tidyも検出コードの中でGoogle code styleに違反した場所(
この2つにはそれぞれメリットとデメリットがあり、clang-tidyはソースコードの構文分析(ソースファイルのコンパイル)を行う必要があるため、ソースファイルのコンパイルコマンドを知る必要があり、依存が大きいファイルに対しては時間がかかります.cpplintはソースファイルのコンパイルを必要とせず、ファイルの内包を正則的にマッチングし、実行が速くなります.
clang-tidyは毎回1つのコンパイルユニット(TranslationUnit、
clang-tidy実装には100+個のcheckがあります.リストを参照してください.checkの種類(check名の接頭辞からどの種類がわかるか)によって、次のように分類されます. boost検出boostライブラリAPI使用問題 cert検出CERTのコード仕様 cpp-core-guidelines検出cpp-core-guidelines google検出google code style llvm検出llvm code style 違反 readabilityは、コードに関連する問題を検出するが、任意のコード仕様に属する は明確ではない. misc他のいくつかのこまごましたcheck mpi検出MPI API問題 modernizeはC++03コードをC++11コードに変換し、C++11の新しい特性 を使用する. performance検出performance関連問題 clang-tidy使用
clang-tidyはコマンドラインツールで、公式サイトでコンパイルしたバイナリパッケージをダウンロードできます.clang-tools-prebuiltのnpmパッケージを書いて、
プロジェクトのyコンパイルユニットを分析し、clang-tidyはまずユニット(このコンパイルユニットのコンパイルコマンド)をコンパイルする方法を知っています.ディレクトリの下からcompliation databaseを検索します.このdatabaseは cmakeの項目であれば、 GYPプロジェクトの場合、 makeプロジェクトの場合、Bearツールを使用します.
一度に1つのファイルしか分析できないのは面倒ですが、プロジェクト全体のすべてのファイルを分析しますか?run_clang_tidy.pyスクリプトは、プロジェクトファイル全体をマルチプロセスで分析するために必要です.
clang-tidy紹介
clang-tidyはclangベースの静的コード解析フレームワークであり、C++/C/Objective-Cをサポートする.
より強力なlintツールです.ほとんどのlintツールは、問題が発生したコードの場所でしかヒントを与えることができません.その後、人為的に修正する必要があります.一方、clang-tidyは自動修復機能(もちろん、これはどのように修復するかについてはcheck著者が提供する必要がある)を採用し、clang-tidyはモジュール化設計を採用しており、非常に拡張しやすい.ユーザーがclang-tidyに新しい検出機能を追加したい場合は、clang-tidy check実装を作成する必要がある.(clang-tidy checkをどのように作成するかは後述する)、各checkは、Code styleに違反するモードを検出したり、APIが正しく使用されていない方法を検出したりするなどの問題を検出します.
clang-tidy checkは様々な問題を検出することができる:
google-*
check)をサポートしていますが、それらの違いは何ですか?cpplintはpythonのスクリプトで、code styleに違反するコードを正規表現でマッチングするので、検出できる機能は正規表現に制限され、code styleに違反するすべての場所を検出することができず、False positiveとTrue positiveもあります.一方、clang-tidyは抽象構文ツリー(AST)に基づいてソースファイルを分析しているのに対し、分析の結果がより正確で、検出できる問題も多い.この2つにはそれぞれメリットとデメリットがあり、clang-tidyはソースコードの構文分析(ソースファイルのコンパイル)を行う必要があるため、ソースファイルのコンパイルコマンドを知る必要があり、依存が大きいファイルに対しては時間がかかります.cpplintはソースファイルのコンパイルを必要とせず、ファイルの内包を正則的にマッチングし、実行が速くなります.
clang-tidyは毎回1つのコンパイルユニット(TranslationUnit、
.cpp
ファイル1つと簡単に理解できる)に対して静的解析を行うため、1つのコンパイルユニットの中のコードの問題しか見つからず、コンパイルユニットにまたがる問題だけに対しては力がない.clang-tidy実装には100+個のcheckがあります.リストを参照してください.checkの種類(check名の接頭辞からどの種類がわかるか)によって、次のように分類されます.
clang-tidyはコマンドラインツールで、公式サイトでコンパイルしたバイナリパッケージをダウンロードできます.clang-tools-prebuiltのnpmパッケージを書いて、
npm install clang-tools-prebuilt
のコマンドでダウンロードできます(MacOS、Linuxのみサポート).// check
$ clang-tidy -list-checks
// simple.cc using declarations. `--` compilation database , ;
$ clang-tidy -checks="-*,misc-unused-using-decls" path/to/simple.cc --
// simple.cc using declarations fix( )
$ clang-tidy -checks="-*,misc-unused-using-decls" -fix path/to/simple.cc --
// a.c using declarations. path/to/project/compile_commands.json
$ clang-tidy -checks="-*,misc-unused-using-decls" path/to/project/a.cc
プロジェクトのyコンパイルユニットを分析し、clang-tidyはまずユニット(このコンパイルユニットのコンパイルコマンド)をコンパイルする方法を知っています.ディレクトリの下からcompliation databaseを検索します.このdatabaseは
compile_commands.json
ファイルで、そのプロジェクトのすべてのコンパイルユニットのコンパイル命令が含まれています.使用する前にこのファイルをエクスポートします.現在、この仕事を手伝ってくれるツールがあります.cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON path/to/llvm/sources
コマンドでエクスポートします.ninja -C out/D -t compdb cc cxx objc objcxx > compile_commands.json
を通過します.一度に1つのファイルしか分析できないのは面倒ですが、プロジェクト全体のすべてのファイルを分析しますか?run_clang_tidy.pyスクリプトは、プロジェクトファイル全体をマルチプロセスで分析するために必要です.