CodingFirst

C言語、Perl、JavaScript、最近はPythonも。出来上がったものより、プログラムを書くことが好き。あと、スイーツ。

スポンサーサイト

  • このエントリーをはてなブックマークに追加
  • web拍手 by FC2
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

GCCでC言語のコードカバレッジを計測する

  • このエントリーをはてなブックマークに追加
  • web拍手 by FC2

GCCC言語のコードカバレッジを計測する手順をまとめる。

gcc は標準的に gcov というカバレッジユーティリティがついていて、
下記の3ステップで簡単にカバレッジ計測できるようになっている。

  1. プログラムを gccでカバレッジ計測オプション付きでコンパイル
  2. プログラムを実行する
  3. gcovでカバレッジの集計する

まず、コンパイル。
gccでコンパイル時にカバレッジ計測オプション、
--fprofile-arcs -ftest-coverage -lgcov をつける。
でも、最近のバージョンでは、 --coverage を付けるだけになり、より簡単になった。
(ちなみにシノニム)。

例)
$ gcc -fprofile-arcs -ftest-coverage -lgcov source.c
or
$ gcc --coverage source.c

次に、プログラムの実行。
実行すると、カバレッジログがオブジェクトと同じディレクトリに記録される。
ファイルの拡張子が .gcno と .gcda(古いと .gcna だったかな)。
便利なのは、
プログラムを複数回実行したい場合。
単に何度も実行すれば良い。
カバレッジログは、実行ごとに上記ファイルに累積されていく。

最後にカバレッジの集計(今回はラインカバレッジのみ)。
gcov で集計したいソースコードのファイル名を指定する。

例)
$ gcc --coverage source.c
$ ./a.out
$ gcov source.c
File 'source.c'
Lines executed:75.00% of 4
source.c: 'source.c.gcov' を作成しています

もし、オブジェクトファイルが別ディレクトリにある場合。
gcov を -o DIR でディレクトリ指定する。

例)
$ gcc -c --coverage -o obj/source.o source.c
$ gcc --coverage obj/source.o
$ ./a.out
$ gcov -o obj source.c
File 'source.c'
Lines executed:75.00% of 4
source.c: 'source.c.gcov' を作成しています

gcov で集計した結果は、標準出力されるんだけど、
詳細は .gcov の拡張子で出力されるので、エディタなどで見る。

$ cat source.c.gcov 
        -:    0:Source:source.c
        -:    0:Graph:obj/source.gcno
        -:    0:Data:obj/source.gcda
        -:    0:Runs:1
        -:    0:Programs:1
        -:    1:#include <stdio.h>
        1:    2:int main(int argc,char*argv[]){
        1:    3:  if(argc==2){
    #####:    4:    puts("hello");
        -:    5:  }
        1:    6:  return 0;
        -:    7:}

カバレッジを100%にしてみる。

$ ./a.out a
hello

$ gcov -o obj source.c 
File 'source.c'
Lines executed:100.00% of 4
source.c: 'source.c.gcov' を作成しています

$ cat source.c.gcov 
        -:    0:Source:source.c
        -:    0:Graph:obj/source.gcno
        -:    0:Data:obj/source.gcda
        -:    0:Runs:2
        -:    0:Programs:1
        -:    1:#include <stdio.h>
        2:    2:int main(int argc,char*argv[]){
        2:    3:  if(argc==2){
        1:    4:    puts("hello");
        -:    5:  }
        2:    6:  return 0;
        -:    7:}

C言語でラインカバレッジをとりたいケースはよくあると思う。
そういう場合、上記の手順でぱぱっとすませてしまいたい。

でも、ラインカバレッジは、
実行されない文があってもカバレッジ100%になってしまうケースがあるので、
そういうのをわかった上でコードを書かないと痛い目に遭う。
そのへんは調べて書こうと思う。

あと、gcov はオプションで分岐や関数カバレッジも調べられるので、
それもまた、いずれ調べて書く予定。


実例で学ぶGCCの本格的活用法―高機能コンパイラのオプション・コマンドを一つ一つていねいに解説 (TECHI―Embedded Software)実例で学ぶGCCの本格的活用法―高機能コンパイラのオプション・コマンドを一つ一つていねいに解説 (TECHI―Embedded Software)
(2006/07)
岸 哲夫

商品詳細を見る

ソフトウェア・テスト PRESS 総集編ソフトウェア・テスト PRESS 総集編
(2011/07/15)
ソフトウェア・テストPRESS編集部 編

商品詳細を見る
スポンサーサイト


★☆★コメント★☆★

コメントの投稿

Name
Subject
Mail
URI
Comment
Pass
Secret 管理者にだけ表示を許可する

トラックバック

http://iyukki.blog56.fc2.com/tb.php/154-618625dc

 | HOME | 

Search

Recent Entries

Foot Print



Categories

Monthly

Recent Comments

Recent Trackbacks

Profile

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。