[llvm-cov] Differences in coverage report and the JSON summary object

Hello everyone,

During my llvm-cov usage I found some difference in llvm-cov out between llvm-cov generated text report and the JSON summary. I have presented it by the simple class.hpp file:

  1. “llvm-cov show …” output:

Hi Łukasz,

Hello everyone,

During my llvm-cov usage I found some difference in llvm-cov out between llvm-cov generated text report and the JSON summary. I have presented it by the simple class.hpp file:

1) "llvm-cov show ..." output:
-----------------------------------------------------------------
Coverage Report
Created: 2017-04-26 09:52
/home/lumc/llvm_cov_test/class.hpp:
    1| |template<typename T>
    2| |class SampleTemplate
    3| |{
    4| |public:
    5| | inline T SampleMethod(const T& a, const T& b)
    6| 1| {
    7| 1| #if DEFINE
    8| | T ret = b;
    9| | #else
   10| 1| T ret = a;
   11| 1| #endif
   12| 1| return ret;
   13| 1| }
   14| |};
-----------------------------------------------------------------
here in the repert for class.hpp file I have 6 lines covered.

2) part of json generated by "llvm-cov export ...":
-----------------------------------------------------------------
...
                    "expansions": [],
                    "filename": "/home/lumc/llvm_cov_test/class.hpp",
                    "segments": [
                        [
                            6,
                            4,
                            1,
                            1,
                            1
                        ],
                        [
                            7,
                            8,
                            0,
                            0,
                            1
                        ],
                        [
                            9,
                            8,
                            1,
                            1,
                            0
                        ],
                        [
                            13,
                            5,
                            0,
                            0,
                            0
                        ]
                    ],
                    "summary": {
                        "functions": {
                            "count": 1,
                            "covered": 1,
                            "percent": 100
                        },
                        "instantiations": {
                            "count": 1,
                            "covered": 1,
                            "percent": 100
                        },
                        "lines": {
                            "count": 5,
                            "covered": 5,
                            "percent": 100
                        },
                        "regions": {
                            "count": 1,
                            "covered": 1,
                            "notcovered": 0,
                            "percent": 100
                        }
                    }
...
-----------------------------------------------------
but in "summary" object for the class.hpp file I have 5 lines only.

Can you explain me from where this difference comes?

llvm-cov tries to make coverage reports look more natural by remembering the final coverage segment from the previous line, and using it to help determine the line coverage for the next line. Sometimes, this creates discrepancies in the line coverage statistics.

Line coverage should probably just be computed in one place, instead of two. I'd like to get rid of the one in CoverageSummaryInfo.cpp..

vedant