📋️

clag カバレッジ

2023/07/08に公開

clang でカバレッジデータを採取する。

【参考】
https://clang.llvm.org/docs/SourceBasedCodeCoverage.html#source-based-code-coverage

テストプログラム

tcov.c
#include <stdio.h>

int add(int data1, int data2)
{
    int result = 0;
    result = data1 + data2;
    return result;
}

int sub(int data1, int data2)
{
    int result = 0;
    result = data1 - data2;
    return result;
}
int cul(int cul, int data1, int data2)
{
    int result = 0;
    if (cul == 1)
    {
        result = add(data1, data2);
    }

    else if (cul == 2)
    {
        result = sub(data1, data2);
    }

    return result;
}

int main()
{
    int add = 0;
    add = cul(1, 10, 8);
    printf("10 + 8 = %d\n", add   );
    return 0;
}

コンパイル

コンパイル時にカバレッジデータを収集するように指定する。

  • -fcoverage-mapping
    コードカバレッジ分析を可能にする。

  • -fprofile-instr-generate=tcov.profraw
    指定ファイルにカバレッジデータを収集する。
    「=tcov.profraw」を指定しなければ「default.profraw」に出力する。

~ $ cc -fcoverage-mapping -fprofile-instr-generate=tcov.profraw tcov.c -o tcov

この時点では実行ファイル「tcov」が生成されるだけである。

~ $ ls
tcov*  tcov.c

実行

~ $ ./tcov
10 + 8 = 18

ファイルリストを確認。

~ $ ls
tcov*  tcov.c  tcov.profraw

この時、先に指定した「tcov.profraw」にカバレッジ結果が出力される。

カバレッジ結果

【参考】
https://llvm.org/docs/CommandGuide/llvm-profdata.html#llvm-profdata-profile-data-tool

llvm-profdata ツールでプロファイルデータを作成する。

~ $ llvm-profdata merge -sparse tcov.profraw -o tcov.profdata

~ $ ls
tcov*  tcov.c  tcov.profdata  tcov.profraw

カバレッジ結果表示

【参考】
https://llvm.org/docs/CommandGuide/llvm-cov.html#llvm-cov-emit-coverage-information

llvm-cov でカバレッジ結果を表示する。

~ $ llvm-cov show tcov -instr-profile=tcov.profdata
    1|     |#include <stdio.h>
    2|     |
    3|     |int add(int data1, int data2)
    4|    1|{
    5|    1|  int result = 0;
    6|    1|  result = data1 + data2;
    7|    1|  return result;
    8|    1|}
    9|     |
   10|     |int sub(int data1, int data2)
   11|    0|{
   12|    0|  int result = 0;
   13|    0|  result = data1 - data2;
   14|    0|  return result;
   15|    0|}
   16|     |
   17|     |int cul(int cul, int data1, int data2)
   18|    1|{
   19|    1|  int result = 0;
   20|    1|  if (cul == 1)
   21|    1|  {
   22|    1|      result = add(data1, data2);
   23|    1|  }
   24|     |
   25|    0|  else if (cul == 2)
   26|    0|  {
   27|    0|      result = sub(data1, data2);
   28|    0|  }
   29|     |
   30|    1|  return result;
   31|    1|}
   32|     |
   33|     |int main()
   34|    1|{
   35|    1|  int add = 0;
   36|    1|  add = cul(1, 10, 8);
   37|    1|  printf("10 + 8 = %d\n", add   );
   38|    1|  return 0;
   39|    1|}
   40|     |

~ $

サマリー

~ $ llvm-cov report tcov -instr-profile=tcov.profdata --show-functions -sources tcov.c
File '/data/data/com.termux/files/home/c/cov/tcov.c':
Name                        Regions    Miss   Cover     Lines    Miss   Cover  Branches    Miss   Cover
-------------------------------------------------------------------------------------------------------
add                               1       0 100.00%         5       0 100.00%         0       0   0.00%
sub                               1       1   0.00%         5       5   0.00%         0       0   0.00%
cul                               6       3  50.00%        12       4  66.67%         4       3  25.00%
main                              1       0 100.00%         6       0 100.00%         0       0   0.00%
-------------------------------------------------------------------------------------------------------
TOTAL                             9       4  55.56%        28       9  67.86%         4       3  25.00%
~ $
GitHubで編集を提案

Discussion