最近、文字列の処理に何らかの形で関連する数千行のコードを含むコードの一部を大幅にリファクタリングしました。すべてのコードが 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 ウェブサイトで見つけることができます。