<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/120071>120071</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[llvm-cov] lcov-export generates invalid lcov files
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
zgtm
</td>
</tr>
</table>
<pre>
In certain cases, `llvm-cov export` exports lcov files, that seem to be invalid. They contain coverage information for the line after the final newline character.
For these lcov files, `genhtml` (part of the lcov project) will report the following error:
```
genhtml: ERROR: (range) /some/path/supp.h contains only 2 lines but coverage data refers to line 3
```
## Reproduce
`main.c`:
```C
#define FOO();
void foobar() {
#include "supp.h"
}
int main(){}
```
`supp.h`:
```C
#define BAR FOO
BAR()
```
Run
```sh
clang -o main -fcoverage-mapping -fprofile-instr-generate main.c
LLVM_PROFILE_FILE='main.profraw' ./main
llvm-profdata merge -sparse -o main.profdata main.profraw
llvm-cov export -format=lcov -instr-profile=main.profdata main > main.lcov
```
## Expected Behaviour
`main.lcov` does not contain
```
DA:3,0
```
For `supp.h`.
## Actual Behaviour
`main.lcov` contains
```
SF:/some/path/supp.h
…
DA:3,0
```
However, there is no line 3 in `supp.h`.
`genhtml main.lcov` will report "genhtml: ERROR: (range) /some/path/supp.h contains only 2 lines but coverage data refers to line 3"
## Additional Information
```
$ clang --version
Ubuntu clang version 19.1.1 (1ubuntu1)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/lib/llvm-19/bin
```
```
$ llvm-profdata --version
Ubuntu LLVM version 19.1.1
Optimized build.
```
```
$ llvm-cov --version
Ubuntu LLVM version 19.1.1
Optimized build.
```
On Kubuntu 24.10.a
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJy8VlGPqzYT_TXOywhkDCHhIQ_kZtG3-m6VKr3t65WBAVwZG9km2Xt_fWUgm91kq-1DVQkh8HhmzhzmDObWilYh7sh6T9aHFR9dp83uZ-v6VanrH7tnBRUax4WCilu0hH0BklIpz31Q6TPgy6CNIyldnixIv9wIOe91HXdgEXtwGkoEoc5cijqEbx3-gEqrObQ-o-GtNzfa9NwJraDRBlyHIIVC4I3D-bURiktQeJnWq44bXjk0IaE5oXkxO1m8w0FS2qLqXC89VsK2AzcOdDNn8FsHo__EyhGWwUVICQZ9PXNKLaW-CNUCGqMNifM5GUnpctH8Gj3O4el0Op78A2Fbw1WLPiZhhdU9ElYM3HX-bRyGsLtSYEEr-QPYVK2FcnQ3UmruOBhs0FjP4lR3fJfeXywmLIYTDkbXY4WvGHsuVFj5ffE71F9mpxobH7E4HgnbEpaReD-7nrWoodG65Ga2ANl4EwAQFgtVybFGIIzNpRDGvN_mMHsL5cBnXoJu9ovlDnRKF-9P4O3z0wSR5vv8tMR8iHYa1dtF2xGaV5KrFgI9gYGgudIa9HwY_DcNmsFo3yiBUNaZoEWFhjuEhTeaf_36xy_ffz0di-evT9_9jcQHwjaT3fsafiFsAyFhxVQxzSd9eNP07Xo0LUJgB24sXqGEN_PbOIvvTVsQzJIg8WHq0wXlgpnEh8dgQOKnOar3-NtOeXoZsHJYwx47fhZ6NO9bZnJOKdQaLSjtrr362PyHnMR5TNgX-pjMK_LtV16EeoORV27k8jMQV508Jv-t8I3zsbz81idGtpTk6Sc4_6cveEYzDy00CMIXvagNPKkfFPE6VeAd2LcDhDD2n8-GWYk3huta-JHKJTzfBuwjk4QlsMglOKOx86bfy1G5cTEsyxBlYRRGvoponOzRLMhv3LTofIEv2_R7mgRDFUihxpegVaO3dwZ5Db2uceJj0Fa8EJo_K-u4lFgfhJnpKUZrCCukKP3dayLKCCtKoe5R31XwXnsfVOLlfFfINNWOgxO9-Ik1lKOQdfhP8kyK_PdS0Pyo4P8zo8CSMKIhJzRf1bu4zuKMr3AXbeIkXkfrJFl1uyxhVbReZ5s0i9JsE_OkbLI4TuIoidia0pXYMcqSiEVpxKKMJmGTZEgzjFi0bbZpQklCsedChr6cUJt2JawdcRcxSjfRSvISpZ2OB4wpvMBk9Q22PqzMbuKgHFtLEiqFdfYWxgknp3PFlSeyPkx_2mCZa9c5a6-Hgje_7NVo5K5zbrCztgkrWuG6sQwr3S_9cG2L1x93MWGzhBUL-POO_RUAAP__G7OxzA">