0

I am using lcov to generate coverage information for the project I am working on. It is mostly working, except for some reason it seems to not count the function toplines in every single case. This means that class files that have complete test coverage will still have a few lines missing and so show like 90%.

It isn't a big deal but it is kind of annoying. I wonder if anyone has any idea why.

Below I've provided a complete minimal example demonstrating this problem. When this program is run, 4 lines are 'hit' out of 6 lines, leaving me with 68.7% line coverage, despite the fact that all lines are clearly executed.

GCOV output

Summary coverage rate:
  lines......: 66.7% (4 of 6 lines)
  functions..: 100.0% (2 of 2 functions)
  branches...: no data found

Example

CMakeLists.txt

set(NAME MinTest)

project (${NAME})

cmake_minimum_required(VERSION 3.5.2)

set(CMAKE_C_FLAGS
"--coverage -O0 -g")

add_executable(
  ${NAME}
  src/main.c
)

src/main.c

void function() {
  printf("foo");
}

int main(void) {
  function();
}

runWithCoverageInfo.sh

#!/bin/bash

# $1 = source root
# $2 = build directory

if [ ! -d "coverage" ]; then
    echo "Creating coverage directory...";
    mkdir coverage;
else
    find ./coverage -name *.info -exec rm {} \;;
fi;

echo "Removing previous coverage output files...";
find $2 -name *.gcda -exec rm {} \;;

echo "Analysing baseline coverage data...";
lcov --initial --no-external --capture --base-directory $2 --directory $2 --directory $1 --output-file coverage/coverage_base.info ;

echo "Running tests...";
./MinTest;
returnCode=$?

echo "Generating coverage output";
lcov --capture  --no-external --directory $2 --directory $1 --base-directory $2 --output-file coverage/coverage_test.info --quiet ;
lcov -a coverage/coverage_base.info -a coverage/coverage_test.info -output-file coverage/coverage_total.info --quiet;
lcov --summary coverage/coverage_total.info;
genhtml coverage/coverage_total.info --output-directory coverage -quiet;

exit $returnCode;
Ben Wainwright
  • 4,224
  • 1
  • 18
  • 36

1 Answers1

2

Once upon a time, LCOV defaulted to providing branch coverage. It does not anymore. (At least, the version I have [1.12] does not.) So you have to explicitly tell it in your lcov and genhtml commands to generate branch reports. For example:

lcov -d . --zerocounters
lcov -d . --rc lcov_branch_coverage=1 --no-external --capture -o ../reports/myproj.info
cd ../reports
genhtml --branch-coverage myproj.info

The --rc lcov_branch_coverage=1 in the LCOV command and --branch-coverage in the HTML generation command are required for branch coverage analysis/reporting.

You could opt to put lcov_branch_coverage=1 and genhtml_branch_coverage=1 in your .lcovrc resource file if you want to always default to branch coverage. See lcovrc(5) manpage for more details, or online here: http://ltp.sourceforge.net/coverage/lcov/lcovrc.5.php

Luv2code
  • 1,079
  • 8
  • 14
  • 1
    I no longer have my project setup in order to be able to test that. But this looks like the answer I was looking for... (where were you 2 months ago ;) ) so I'll accept your answer. – Ben Wainwright Oct 01 '16 at 20:27
  • 1
    I only started using LCOV a month ago, so would not have looked at this back when it was more relevant to you (sorry). When I answered this, I was going through every question with the `lcov` tag trying to find an answer to another problem I was having when I saw your post and thought I might have some helpful information for you. Thanks for the "accept." – Luv2code Oct 03 '16 at 17:48