0
0

lcov の Branch Data [ + - ] はどっちが TRUE でどっちが FALSE か実際の出力を確認した

Posted at

はじめに

カバレッジの計測結果を視覚的にわかりやすく表示するツール locv を使用して関数テストをしている際、網羅していない分岐条件が判らなくなる。マニュアルやブログを探してもよくわからなかったので簡単なソースコードを作成して出力を確認をした。

環境

項目 バージョン
OS Ubuntu 22.04.4 LTS (WSL version 2)
google test Release v1.13.0
g++ g++ 11.4.0
lcov LCOV version 1.14
gcov gcov 11.4.0

実行コマンド

以下のコマンドを実行して出力される HTML 形式のファイルを確認する。

g++ -fprofile-arcs -ftest-coverage main.cpp -pthread -lgtest_main -lgtest -lgmock
./a.out 
gcov -b a-main.gcda 
lcov -d . -c --rc lcov_branch_coverage=1 -o a-main.info
genhtml a-main.info --branch-coverage -o ./coverage
rm *.gcov *.gcda *.gcno *.info 

実行結果

表示 意味
+ taken(条件を満たした)
- not taken(条件を満たしていない)
# not executed(実行されていない)

条件が1個の場合

        :    bool A;
        :
        :    A = true;
[ +  - ]:    if( A )
        :    {
        :    }
        :    
        :    A = false;
[ -  + ]:    if( A )
        :    {
        :    }

条件が2個の場合 (A && B)

条件文を単一行で記載した場合

              :    bool A, B;
              :
              :    A = true;  B = true;
[ +  -  +  - ]:    if( ( A ) && ( B ) )
              :    {
              :    }
              :
              :    A = true;  B = false;
[ +  -  -  + ]:    if( ( A ) && ( B ) )
              :    {
              :    }
              :
              :    A = false; B = true;
[ -  +  -  - ]:    if( ( A ) && ( B ) )
              :    {
              :    }
              :
              :    A = false; B = false;
[ -  +  -  - ]:    if( ( A ) && ( B ) )
              :    {
              :    }

条件文を複数行で記載した場合

        :    bool A, B;
        :
        :    A = true;  B = true;
[ +  - ]:    if( ( A )
[ +  - ]:     && ( B ) )
        :    {
        :    }
        :
        :    A = true;  B = false;
[ +  - ]:    if( ( A )
[ -  + ]:     && ( B ) )
        :    {
        :    }
        :
        :    A = false; B = true;
[ -  + ]:    if( ( A )
[ #  # ]:     && ( B ) )
        :    {
        :    }
        :
        :    A = false; B = false;
[ -  + ]:    if( ( A )
[ #  # ]:     && ( B ) )
        :    {
        :    }

条件が2個の場合 (A || B)

条件文を単一行で記載した場合

              :    bool A, B;
              :
              :    A = true;  B = true;
[ -  +  -  - ]:    if( ( A ) || ( B ) )
              :    {
              :    }
              :
              :    A = true;  B = false;
[ -  +  -  - ]:    if( ( A ) || ( B ) )
              :    {
              :    }
              :
              :    A = false; B = true;
[ +  -  +  - ]:    if( ( A ) || ( B ) )
              :    {
              :    }
              :
              :    A = false; B = false;
[ +  -  -  + ]:    if( ( A ) || ( B ) )
              :    {
              :    }

条件文を複数行で記載した場合

        :    bool A, B;
        :
        :    A = true;  B = true;
[ -  + ]:    if( ( A )
[ #  # ]:     || ( B ) )
        :    {
        :    }
        :
        :    A = true;  B = false;
[ -  + ]:    if( ( A )
[ #  # ]:     || ( B ) )
        :    {
        :    }
        :
        :    A = false; B = true;
[ +  - ]:    if( ( A )
[ +  - ]:     || ( B ) )
        :    {
        :    }
        :
        :    A = false; B = false;
[ +  - ]:    if( ( A )
[ -  + ]:     || ( B ) )
        :    {
        :    }

条件が3個の場合 (A && (B || C))

              :    bool A, B, C;
              :
              :    A = true;  B = true;  C = true;
      [ +  - ]:    if( ( A )
[ -  +  -  - ]:     && ( ( B ) || (C) ) )
              :    {
              :    }
              :
              :    A = true;  B = true;  C = false;
      [ +  - ]:    if( ( A )
[ -  +  -  - ]:     && ( ( B ) || (C) ) )
              :    {
              :    }
              :
              :    A = true;  B = false; C = true;
      [ +  - ]:    if( ( A )
[ +  -  +  - ]:     && ( ( B ) || (C) ) )
              :    {
              :    }
              :
              :    A = true;  B = false; C = false;
      [ +  - ]:    if( ( A )
[ +  -  -  + ]:     && ( ( B ) || (C) ) )
              :    {
              :    }
              :
              :    A = false; B = true;  C = true;
      [ -  + ]:    if( ( A )
[ #  #  #  # ]:     && ( ( B ) || (C) ) )
              :    {
              :    }
              :
              :    A = false; B = true;  C = false;
      [ -  + ]:    if( ( A )
[ #  #  #  # ]:     && ( ( B ) || (C) ) )
              :    {
              :    }
              :
              :    A = false; B = false; C = true;
      [ -  + ]:    if( ( A )
[ #  #  #  # ]:     && ( ( B ) || (C) ) )
              :    {
              :    }
              :
              :    A = false; B = false; C = false;
      [ -  + ]:    if( ( A )
[ #  #  #  # ]:     && ( ( B ) || (C) ) )
              :    {
              :    }

条件が3個の場合 (A || (B && C))

              :    bool A, B, C;
              :
              :    A = true;  B = true;  C = true;
      [ -  + ]:    if( ( A )
[ #  #  #  # ]:     || ( ( B ) && (C) ) )
              :    {
              :    }
              :
              :    A = true;  B = true;  C = false;
      [ -  + ]:    if( ( A )
[ #  #  #  # ]:     || ( ( B ) && (C) ) )
              :    {
              :    }
              :
              :    A = true;  B = false; C = true;
      [ -  + ]:    if( ( A )
[ #  #  #  # ]:     || ( ( B ) && (C) ) )
              :    {
              :    }
              :
              :    A = true;  B = false; C = false;
      [ -  + ]:    if( ( A )
[ #  #  #  # ]:     || ( ( B ) && (C) ) )
              :    {
              :    }
              :
              :    A = false; B = true;  C = true;
      [ +  - ]:    if( ( A )
[ +  -  +  - ]:     || ( ( B ) && (C) ) )
              :    {
              :    }
              :
              :    A = false; B = true;  C = false;
      [ +  - ]:    if( ( A )
[ +  -  -  + ]:     || ( ( B ) && (C) ) )
              :    {
              :    }
              :
              :    A = false; B = false; C = true;
      [ +  - ]:    if( ( A )
[ -  +  -  - ]:     || ( ( B ) && (C) ) )
              :    {
              :    }
              :
              :    A = false; B = false; C = false;
      [ +  - ]:    if( ( A )
[ -  +  -  - ]:     || ( ( B ) && (C) ) )
              :    {
              :    }

参考記事

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0