c++gcovr

Code coverage of Multiple files using Gcovr


i am new to gcovr. I have 3 files in my code namely main.cpp, math.cpp and math.hpp.I am compiled it with g++ using the following command

g++ -fprofile-arcs -ftest-coverage -fPIC -O0 main.cpp  math.cpp math.hpp -o math

my code is compiled and run successfully. when i run the following command for code coverage

 gcovr -r .

it produces the output like this

------------------------------------------------------------------------------
                       GCC Code Coverage Report
Directory: .
------------------------------------------------------------------------------
File                                       Lines    Exec  Cover   Missing
------------------------------------------------------------------------------
main.cpp                                       6       6   100%
------------------------------------------------------------------------------
TOTAL                                          6       6   100%
------------------------------------------------------------------------------ 

It shows only the code coverage of main.cpp. I want to know the code coverage of other files too.How can i get it? Please help me if you can.Thanks in advance.

Here is my code main.cpp

#include "math.hpp"
int main( int argc, char **argv)
{
    Math m;
    m.Multiply(20, 50);
    m.Divide(40, 5);
}

Math.cpp

#include "math.hpp"

using namespace std;
int Math::Multiply(int Num1, int Num2){
    Mul= Num1 * Num2;
    std::cout << "Multiplication of "<<Num1<< " * " <<Num2<< " = "<< Mul<<endl;
    return Mul;
}

int Math::Divide(int Num1, int Num2){
    Div = Num1/Num2;
    std::cout << "Division of "<<Num1<< " / " <<Num2 <<" = "<< Div<<endl;
    return Div;
}

math.hpp

#include <ctime>
#include<iostream>
class Math
{
  int Num1;
  int Num2;
  int Fact, Mul, Div, Num, i;

public:
  int Multiply(int Num1,int Num2);
  int Divide(int Num1, int Num2);
};

When ran the command gcovr -v -r . is given below

C:\Users\user\Desktop\Gcovr>gcovr -v -r .
Filters for --root: (1)
- <_sre.SRE_Pattern object at 0x01C206A0>
Filters for --filter: (1)
- DirectoryPrefixFilter(C\:\/Users\/user\/Desktop\/Gcovr\/)
Filters for --exclude: (0)
Filters for --gcov-filter: (1)
- AlwaysMatchFilter()
Filters for --gcov-exclude: (0)
Filters for --exclude-directories: (0)
Scanning directory . for gcda/gcno files...
Found 4 files (and will process 2)
Pool started with 1 threads
Processing file: C:\Users\user\Desktop\Gcovr\main.gcda
Running gcov: 'gcov C:\Users\user\Desktop\Gcovr\main.gcda --branch-counts -- 
branch-probabilities --preserve-paths --object-directory 
C:\Users\user\Desktop\Gcovr' in 'c:\users\user\appdata\local\temp\tmpyekiry'
Running gcov: 'gcov C:\Users\user\Desktop\Gcovr\main.gcda --branch-counts -- 
branch-probabilities --preserve-paths --object-directory 
C:\Users\user\Desktop\Gcovr' in 'C:\Users\user\Desktop\Gcovr'
Finding source file corresponding to a gcov data file
  currdir      C:\Users\user\Desktop\Gcovr
  gcov_fname   c:\users\user\appdata\local\temp\tmpyekiry\main.cpp.gcov
           [u'        -', u'    0', u'Source', u'main.cpp\n']
  source_fname C:\Users\user\Desktop\Gcovr\main.gcda
  root         C:\Users\user\Desktop\Gcovr
  fname        C:\Users\user\Desktop\Gcovr\main.cpp
Parsing coverage data for file C:\Users\user\Desktop\Gcovr\main.cpp
uncovered: set([])
covered:   {2: 1, 5: 1, 6: 1, 7: 4}
branches:  {5: {1: 1, 2: 0}, 6: {1: 1, 2: 0}, 7: {1: 1, 2: 0, 3: 1, 4: 0}}
noncode:   set([3])
Finding source file corresponding to a gcov data file
  currdir      C:\Users\user\Desktop\Gcovr
  gcov_fnamec:\users\user\appdata\local\temp\tmpyekiry\c~#mingw#lib#gcc#mingw32#6.3.0#include#c++#iostream.gcov
           [u'        -', u'    0', u'Source', 
u'c:/mingw/lib/gcc/mingw32/6.3.0/include/c++/iostream\n']
  source_fname C:\Users\user\Desktop\Gcovr\main.gcda
  root         C:\Users\user\Desktop\Gcovr
  fname        c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\iostream
Parsing coverage data for file c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\iostream
  Filtering coverage data for file c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\iostream
Processing file: C:\Users\user\Desktop\Gcovr\math.gcda
Running gcov: 'gcov C:\Users\user\Desktop\Gcovr\math.gcda --branch-counts --branch-probabilities --preserve-paths --object-directory C:\Users\user\Desktop\Gcovr' in 'c:\users\user\appdata\local\temp\tmpyekiry'
Gathered coveraged data for 1 files

Solution

  • The problem is that you are explicitly passing the header file math.hpp to the compiler. This does not contain any definitions that would produce object code, which leads to the following sequence of events:

    1. main.cpp is compiled. A file main.gcno is created that allows the coverage data main.gcda to be interpreted by gcov.
    2. math.cpp is compiled which creates a math.gcno file.
    3. math.hpp is compiled which overwrites math.gcno with an empty file.

    Therefore, no coverage data for math.cpp is recognized, and the file is excluded from coverage.

    It is not necessary to pass math.hpp to the compiler since your source files #include this file. If we remove the header from the compiler invocation, we get the following gcovr output:

    ------------------------------------------------------------------------------
                               GCC Code Coverage Report
    Directory: .
    ------------------------------------------------------------------------------
    File                                       Lines    Exec  Cover   Missing
    ------------------------------------------------------------------------------
    main.cpp                                       4       4   100%   
    math.cpp                                       9       9   100%   
    ------------------------------------------------------------------------------
    TOTAL                                         13      13   100%
    ------------------------------------------------------------------------------
    

    (The math.hpp file is still not listed, but it contains zero statements that could be covered.)