コードベース全体で 1 つの特定の clang-tidy チェックを実行する

最近、文字列の処理に何らかの形で関連する数千行のコードを含むコードの一部を大幅にリファクタリングしました。すべてのコードが char* を処理しました (C スタイルの文字ポインター配列) と const の概念 または所有権は、コードベースのその部分では文字通り不明でした。リファクタリングされたコードは std::string を使用します のですが、レガシーの性質により、多数のメソッドが nullptr を返しました の代わりに空の文字列 ("" など) )。なぜこれが行われたのかは理解できますが、それらすべてのインスタンスを見つけて、実行時エラーしか発生しないという事実は少し残念でした。

幸いなことに clang-tidy その日を救うためにここにいます。私のIDE、CLionでは、 nullptr を返すと警告が表示されます .ただし、それは現在編集中のファイルでのみ行われます。何百万ものファイルについて話しているので、手動で開くつもりはありませんでした。 clang-tidy を実行できます スクリプト run-clang-tidy.py を使用して、コードベース全体で実行することも難しくありません。 、パッケージで提供されます。

このスニペットは、特定の clang-tidy を実行する方法を示しています チェック、私の場合、bugprone-string-constructor 、(cmake および C++) コードベース。

CLion での clang-tidy メッセージは次のとおりです。

動作が未定義のコード例

これは、動作を示すコードの例です:

#include <string>
#include <iostream>

class Example {
public:
    std::string getName() { return nullptr; }
};

int main() {
    Example ex;
    std::cout << "Example: " << ex.getName() << std::endl;
    return 0;
}

上記のコード例を実行しようとすると、実行時エラーが発生します:

terminate called after throwing an instance of 'std::logic_error'
    what():  basic_string::_M_construct null not valid

nullptr に関する意見 と std::string あなたが尋ねる人によって異なりますが、今のところ std::string を構築することはできません nullptr で .

コードベース全体で clang-tidy を実行

clang-tidy であることを確認してください インストール:

apt install clang-tidy

プロジェクト フォルダーに移動します。

cd my/cpp/project

まだ作成していない場合は、ビルド フォルダーを作成します (mkdir build; cd build ) andrun cmake clang-tidy のコンパイル データベースを作成する追加フ​​ラグ付き :

cmake .. -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=Debug 

ビルド フォルダーで、run-clang-tidy を実行します。 .別のコマンドかもしれません(run-clang-tidy.py または run-clang-tidy-VERSIONNUMBER ) ディストリビューションのパッケージ設定に応じて異なります。

run-clang-tidy -extra-arg=-Wno-unknown-warning-option -checks='-*,bugprone-string-constructor' 2>&1 | tee -a clang-tidy-result

これにはしばらく時間がかかります。コマンドが終了したら、結果を確認するか、ファイル clang-tidy-result で確認できます。 .私の場合、未定義の動作が見つかった特定のファイル名と行番号が表示されました。

-extra-arg 私たちのコードの他のコンパイラ拡張フラグのために必要でした。おそらくそれを省略できます.

-checks='-*' すべてのチェックを無効にします。次の,bugprone-string-constructor 実行したい特定の文字列チェックのみを有効にします。カンマで区切って、より具体的なチェックを追加できます。 2 つのチェックのみが有効になっている例:

-checks='-*,bugprone-string-constructor,bugprone-string-integer-assignment'

clang-tidy の最新リスト チェックは LLVM ウェブサイトで見つけることができます。


No