clang-tidy-静的コード解析フレームワーク

4120 ワード

原文リンク: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に違反した場所(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名の接頭辞からどの種類がわかるか)によって、次のように分類されます.
  • 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パッケージを書いて、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の項目であれば、cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON path/to/llvm/sourcesコマンドでエクスポートします.
  • GYPプロジェクトの場合、ninja -C out/D -t compdb cc cxx objc objcxx > compile_commands.jsonを通過します.
  • makeプロジェクトの場合、Bearツールを使用します.

  • 一度に1つのファイルしか分析できないのは面倒ですが、プロジェクト全体のすべてのファイルを分析しますか?run_clang_tidy.pyスクリプトは、プロジェクトファイル全体をマルチプロセスで分析するために必要です.