- blogs:
- cles::blog

gcc と gcov と カバレッジ


Javaで使えるカバレッジツールがありますか?と言われれればjcoverageとか、Clover、EMMA、Coberturaあたりがすぐに思い浮かぶのですが、Cでといわれるとさっぱりです。ということで、Cでカバレッジを計測するツールを探すことになりました。
† gcc には gcov というコマンドがついていた
Javaでもカバレッジ計測となるとかなり低レベルな部分で結構いろいろなことをしなくてはいけないので、C言語でそれをやるとなるとコンパイルの段階から細工しないといけないのだろうという察しはついたのですが、まったく取っ掛かりがなくて困りました。
ひとりあえず、Javaでお気に入りだったCoberturaをGoogleで探そうとして、間違ってCovertureと打ってしまったら、偶然gccでカバレッジが取れるという話を見つけてしまいました。このCovertureというツールもかなり気になりますが、これはひとまず脇に置いといて、もう少し詳しく調べてみるとgccにコンパイルオプションを加えて、gcovというツールを通すことでカバレッジを得られることが分かりました。
以下、具体的なカバレッジの取得メモです。
† 具体的なカバレッジの取り方
まず、下記のようなプログラムを用意します。見れば分かるとおり、このプログラムのFalse!を出力する部分の行は実行されないので、この部分が検出されるかどうかを確認してみます。
test.c
コンパイル時には-coverageというオプション指定する必要があります。逆に言うとやることはこれだけでOKです。きちんと指定されていればコンパイル後に.gcnoというファイル(おそらく行番号などが保存されている?)が生成されているのが確認できます。
あとは普通にできた実行ファイルを起動してやります。実行後に.gcdaファイル(おそらくトレース情報が記録されている?)が生成されているのが確認できるはずです。これは実行されるごとにアップデートされるので、複数のテストケースを実行すればテストスイート全体でのC0カバレッジが取得できるようです。
テストが実行し終わったら、最後にgcovを実行してやるとカバレージレポート(.gcovファイル)が出力されます。
標準出力にはカバレッジのサマリが出力されます。
カバレージレポートの中身は下記のようになっています。
-で始まる行は実行行でないことを示し、数字が入っている行はその行を何回実行したかを表します。実行行にもかかわらず一度も実行されていない行については#####が表示されています。基本的にはカバレージレポートから#####の行を探して、この部分をカバーするようなテストケースをテストスイートに追加するという作業を行うことになります。
思ったより簡単にC0カバレージを出力させることができました。
† 参考
・Gcov - Using the GNU Compiler Collection (GCC)
・gcov の使い方 - まめめも
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/3636
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。
OpenID を使ってログインすることができます。
2 . リモートデスクトップで Alt + PrtSc と同じことをするには(3048)
3 . RDP のプロトコルを TCP だけに変更する(2365)
4 . 「日次」は「にちじ」じゃない?(2141)
5 . リモートデスクトップで Ctrl + Alt + Del キーを送信するには(2072)