gcovで使われないコードを見つけ出す

$ g++ -g -ftest-coverage -fprofile-arcs tmp.cpp -I/opt/local/include
$ ./a.out
$ gcov tmp.cpp
File 'tmp.cpp'
Lines executed:57.14% of 7
tmp.cpp:creating 'tmp.cpp.gcov'

できた。

        -:   49:// comment
        -:   50:template<class T>
        -:   51:void foo(T& x){
        -:   52:  cout << x << endl;
        -:   53:};
        -:   54:
    #####:   55:void foo(){
        -:   56:  if(0){
        -:   57:    cout << "foo" << endl;
        -:   58:  }
    #####:   59:  cout << "foo" << endl;
        -:   60:}
        -:   61:
        1:   62:int main(){
        -:   63:  // hoge
        -:   64:  if(0){
        -:   65:    cout << "main" << endl;
        -:   66:  }
        1:   67:}
        1:   68:/*EOF*/

if(0)は最適化されて消え去っているのかな。あと閉じbraceにもカバレッジがつかない。インストラクションがないからか。使われてない関数を見つけるのは関数の頭に###がついているかどうかを見れば良さそうだけど、使われていないテンプレートとかはどうやって判断すればいいかな。

        -:   50:template<class T>
        1:   51:void bar(const T& x){
        1:   52:  cout << x << endl;
        -:   53:};

        1:   62:int main(){

        1:   67:  bar<int>(1);

使うとこうなる。templateは中に1がないときに使われていないと判断すればいいかな。