12

switchステートメントを使用していくつかのCコードでgcovを実行しています。私はそのswitchステートメントを通るすべての可能なパスをカバーするテストケースを作成しましたが、それでもswitchステートメントの分岐が取得されておらず、「少なくとも1回取得」統計で100%未満であると報告されます。

デモ用のサンプルコードは次のとおりです。

#include "stdio.h"

void foo(int i)
{
    switch(i)
    {
        case 1:printf("a\n");break;
        case 2:printf("b\n");break;
        case 3:printf("c\n");break;
        default: printf("other\n");
    }
}

int main()
{
    int i;
    for(i=0;i<4;++i)
        foo(i);
    return 0;
}

「」で構築し、「gcc temp.c -fprofile-arcs -ftest-coverage」を実行してから「 a」を実行しましたgcov -b -c temp.c。出力は、スイッチ上の8つのブランチと、1つ(ブランチ6)が取得されていないことを示します。

それらすべてのブランチとは何ですか?100%のカバレッジを取得するにはどうすればよいですか?

4

4 に答える 4

5

おほ!bdeのアセンブリダンプは、そのバージョンのGCCが、セットの中央から開始して、このswitchステートメントをバイナリツリーの近似としてコンパイルしていることを示しています。したがってi、2に等しいかどうかをチェックし、次に2より大きいか小さいかをチェックし、次に各側でそれぞれ1または3に等しいかどうかをチェックし、そうでない場合はデフォルトになります。

つまり、デフォルトの結果を取得するための2つの異なるコードパスがあります。1つは3ではない2より大きい数値用で、もう1つは1ではない2より小さい数値用です。

i<4ループ内i<=4でこれをに変更すると、両側のパスをテストするために、 100%のカバレッジが得られるようです。

(そして、はい、それはGCC3.xからGCC4.xに変更された可能性が非常に高いものです。gcovの結果を混乱させることを除けば「間違っている」わけではないので、「修正済み」とは言えません。分岐予測を備えた最新のプロセッサでは、おそらく低速であり、過度に複雑です。)

于 2010-05-13T05:28:00.473 に答える
3

gcc /gcov3.4.6を使用しても同じ結果が得られます。

switchステートメントの場合、通常、caseステートメントごとに2つのブランチを生成する必要があります。1つは、ケースが真で実行する必要がある場合であり、もう1つは、次のケースに進む「フォールスルー」ブランチです。

あなたの状況では、gccが最後のケースで「フォールスルー」ブランチを作成しているように見えますが、これは当てはまるものがないため意味がありません。

これは、gccによって生成されたアセンブリコードからの抜粋です(読みやすくするためにいくつかのラベルを変更しました)。

    cmpl    $2, -4(%ebp)
    je  CASE2
    cmpl    $2, -4(%ebp)
    jg  L7
    cmpl    $1, -4(%ebp)
    je  CASE1
    addl    $1, LPBX1+16
    adcl    $0, LPBX1+20
    jmp DEFAULT
L7:
    cmpl    $3, -4(%ebp)
    je  CASE3
    addl    $1, LPBX1+32
    adcl    $0, LPBX1+36
    jmp DEFAULT

私はx86アセンブリについてあまり知らないことを認め、L7ラベルの使用法を理解していませんが、それは余分なブランチと関係があるかもしれません。たぶん、gccについてもっと知識のある人が、ここで何が起こっているのかを説明できるでしょう。

古いバージョンのgcc/gcovに問題があるようです。特に、結果が正しいように見える他の投稿を考えると、新しいgcc/gcovにアップグレードすると問題が解決する可能性があります。

于 2010-05-11T19:41:12.997 に答える
1

a.outを実行していますか?これが私の結果です(gcc 4.4.1):

File 't.c'
Lines executed:100.00% of 11
Branches executed:100.00% of 6
Taken at least once:100.00% of 6
Calls executed:100.00% of 5
t.c:creating 't.c.gcov'
于 2010-05-11T19:34:30.057 に答える
0

私はWindows(最新のgccではありません)でmingwを使用していますが、これは新しいバージョンのgccで分類される可能性があるようです。

于 2010-10-08T14:32:06.060 に答える