警告の海を泳ぎきる! CMake で CTEST_CUSTOM_MAXIMUM_NUMBER_OF_WARNINGS を使ってテストを快適に

2024-06-12

CTEST_CUSTOM_MAXIMUM_NUMBER_OF_WARNINGS は、CMake の CTest テストフレームワークで使用される変数です。この変数は、テスト実行中に許容される警告の最大数を設定するために使用されます。デフォルト値は 0 であり、警告が許容されないことを意味します。

使用方法

この変数は、CMake の ctest_configure() コマンドまたは CMakeLists.txt ファイルの ctest_options() コマンドを使用して設定できます。

# ctest_configure() コマンドを使用して設定
ctest_configure(
  -DCTEST_CUSTOM_MAXIMUM_NUMBER_OF_WARNINGS=100
)

# CMakeLists.txt ファイルで設定
ctest_options(
  -DCTEST_CUSTOM_MAXIMUM_NUMBER_OF_WARNINGS=100
)

詳細

CTEST_CUSTOM_MAXIMUM_NUMBER_OF_WARNINGS 変数は、テスト実行中の警告の数を制御するために使用されます。この変数が 0 に設定されている場合、警告は許容されません。この変数が正の値に設定されている場合、その値までの警告は許容されますが、それ以上の警告はエラーとして扱われます。

この変数は、テストの実行中に発生する警告の数を減らすために役立ちます。テストスイートに多くの警告がある場合、それらをすべて表示すると、重要なエラーを見逃してしまう可能性があります。CTEST_CUSTOM_MAXIMUM_NUMBER_OF_WARNINGS 変数を使用して、許容される警告の数を制限することで、最も重要な警告に集中することができます。

注意事項

CTEST_CUSTOM_MAXIMUM_NUMBER_OF_WARNINGS 変数は、テストスイートのすべてのテストに適用されます。特定のテストにのみ適用するには、ctest_test() コマンドの -CTEST_CUSTOM_MAXIMUM_NUMBER_OF_WARNINGS オプションを使用する必要があります。

この変数は、テストの実行中に発生する警告の数を制御するものであり、警告を抑制するものではありません。警告は依然として生成されますが、CTEST_CUSTOM_MAXIMUM_NUMBER_OF_WARNINGS 変数の値を超えた場合はエラーとして扱われます。



    例 1: ctest_configure() コマンドを使用して設定

    cmake_minimum_required(VERSION 3.10)
    
    project(myproject)
    
    add_executable(myprogram main.cpp)
    
    add_test(mytest myprogram)
    
    ctest_configure(
      -DCTEST_CUSTOM_MAXIMUM_NUMBER_OF_WARNINGS=100
    )
    

    このコードは、myproject という名前のプロジェクトを作成し、main.cpp ファイルから myprogram という名前の実行可能ファイルを作成します。また、mytest という名前のテストを作成し、myprogram 実行可能ファイルを実行します。ctest_configure() コマンドは、テスト実行中に許容される警告の最大数を 100 に設定するために使用されます。

    例 2: CMakeLists.txt ファイルで設定

    cmake_minimum_required(VERSION 3.10)
    
    project(myproject)
    
    add_executable(myprogram main.cpp)
    
    add_test(mytest myprogram)
    
    ctest_options(
      -DCTEST_CUSTOM_MAXIMUM_NUMBER_OF_WARNINGS=100
    )
    

    このコードは、例 1 と同じ機能を実行しますが、ctest_options() コマンドを使用して CTEST_CUSTOM_MAXIMUM_NUMBER_OF_WARNINGS 変数を設定します。

    例 3: 特定のテストにのみ適用

    cmake_minimum_required(VERSION 3.10)
    
    project(myproject)
    
    add_executable(myprogram main.cpp)
    
    add_test(mytest1 myprogram)
    add_test(mytest2 myprogram)
    
    ctest_options(
      -DCTEST_CUSTOM_MAXIMUM_NUMBER_OF_WARNINGS=50
    )
    
    ctest_test(mytest1
      -CTEST_CUSTOM_MAXIMUM_NUMBER_OF_WARNINGS=100
    )
    

    このコードは、myproject という名前のプロジェクトを作成し、main.cpp ファイルから myprogram という名前の実行可能ファイルを作成します。また、mytest1mytest2 という名前の 2 つのテストを作成し、myprogram 実行可能ファイルを実行します。ctest_options() コマンドは、テスト実行中に許容される警告の最大数を 50 に設定するために使用されます。ctest_test() コマンドの -CTEST_CUSTOM_MAXIMUM_NUMBER_OF_WARNINGS オプションは、mytest1 テストにのみ許容される警告の最大数を 100 に設定するために使用されます。

    この例は、CTEST_CUSTOM_MAXIMUM_NUMBER_OF_WARNINGS 変数を特定のテストにのみ適用する方法を示しています。



    CTEST_CUSTOM_MAXIMUM_NUMBER_OF_WARNINGS の代替方法

    サプレッションファイルは、特定の警告を抑制するために使用できるファイルです。サプレッションファイルには、抑制する警告のパターンと、抑制する理由を記述するコメントを含めることができます。

    サプレッションファイルを使用するには、以下の手順が必要です。

    1. サプレッションファイルを作成します。
    2. ctest_configure() コマンドまたは CMakeLists.txt ファイルの ctest_options() コマンドを使用して、サプレッションファイルを指定します。

    # サプレッションファイルを作成
    suppressions.txt:
      # 特定の警告を抑制する
      regex: .*warning.*
    
    # CMakeLists.txt ファイルでサプレッションファイルを指定
    ctest_options(
      -DCTEST_SUPPRESSIONS_FILE=suppressions.txt
    )
    

    コンパイラフラグを使用して、特定の警告を抑制することもできます。コンパイラフラグは、コンパイラに特定の警告を無視するように指示するために使用されます。

    コンパイラフラグを使用するには、以下の手順が必要です。

    1. 抑制する警告に対応するコンパイラフラグを特定します。
    2. add_executable() コマンドまたは add_test() コマンドの COMPILE_FLAGS オプションを使用して、コンパイラフラグを指定します。
    # 特定の警告を抑制するコンパイラフラグを指定
    add_executable(myprogram main.cpp -Wno-unused-variable)
    

    テストコードを変更して、警告を発生させないようにすることもできます。これは、警告の原因となっている問題を修正する最善の方法です。

    // 警告を発生させるコード
    int main() {
      int unusedVariable = 10;
      return 0;
    }
    
    // 警告を発生させないコード
    int main() {
      int usedVariable = 10;
      return usedVariable;
    }
    

    ツールを使用する

    LintCodeCoverity などのツールを使用して、コードを静的に分析し、潜在的な問題を特定することもできます。これらのツールは、警告を抑制するだけでなく、コードの品質を向上させるのにも役立ちます。

    CTEST_CUSTOM_MAXIMUM_NUMBER_OF_WARNINGS 変数は、テスト実行中に許容される警告の数を設定するために使用できる便利なツールですが、代替方法もいくつかあります。上記で紹介した代替方法は、状況に応じて適切な方法を選択することで、より効果的にテストを実行することができます。