clang -coverage标记未涵盖的功能签名

时间:2015-07-19 23:39:35

标签: c clang llvm code-coverage lcov

我正在尝试使用clang -coverage为我的C项目生成覆盖率信息,但是当我希望它们根本没有被检测时,所有的功能签名都被标记为未被覆盖。

小例子 - 这个文件是hello.c

extern int puts(const char*);

int main(int argc, char *argv[]) {
  puts("hello, world");
  return 0;
}

在这个例子中,我希望第4行和第5行被标记为可执行,但不是第3行。我像这样运行clang -coveragelcov以获得初始覆盖:

$ cc -coverage hello.c
$ lcov -c -i -d . -o coverage.base
Capturing coverage data from .
Found gcov version: 3.6.0
Found LLVM gcov version 3.4, which emulates gcov version 4.2
Scanning . for .gcno files ...
Found 1 graph files in .
Processing hello.gcno
Finished .info-file creation

生成的coverage文件如下所示:

TN:
SF:/Users/isbadawi/cov/hello.c
FN:3,main
FNDA:0,main
FNF:1
FNH:0
DA:3,0
DA:4,0
DA:5,0
LF:3
LH:0
end_of_record

我希望DA:3,0行不在那里 - 或者至少,如果它在那里,我希望它在最终报道报告中被标记。当我继续运行a.out并再次运行lcov以生成完整的覆盖率报告时,如下所示:

$ ./a.out
$ lcov -q -c -d . -o coverage.run
$ lcov -q -d . -a coverage.base -a coverage.run -o coverage.total

coverage.total看起来像这样:

TN:
SF:/Users/isbadawi/cov/hello.c
FN:3,main
FNDA:1,main
FNF:1
FNH:1
DA:3,0
DA:4,1
DA:5,1
LF:3
LH:2
end_of_record

我最终获得了66.7%的覆盖率,而不是100%。我做错了什么?

我在OS X Yosemite上使用系统clang:

Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn)
Target: x86_64-apple-darwin14.1.0
Thread model: posix

使用gcc尝试相同的操作(尝试使用4.8.2),该行仍然标记为可执行文件,但最终的覆盖率报告已将其执行。

2 个答案:

答案 0 :(得分:0)

编译器生成的代码并不总是直接与您的代码行对应。这可能是这里的问题。当LCOV报告没有关于块(函数或其他)的右括号的报道时,我遇到了类似的挫败感,例如:

if (x < lim) {
  process_x(x);
  ++x_processed;
} // <== this line is listed as NOT COVERED

所以,解决它的方法是使用LCOV关键字标记。在这种情况下:

if (x < lim) {
  process_x(x);
  ++x_processed;
} // LCOV_EXCL_LINE

如果您在第3行使用上述标记,则应该可以解决您的报告问题。

int main(int argc, char *argv[]) {   // LCOV_EXCL_LINE

有相应的标记可以排除一系列直线,也可以排除一行或一系列直线的分支覆盖范围。有关完整的详细信息,请查看geninfo联机帮助页。这是一个在线版本:http://ltp.sourceforge.net/coverage/lcov/geninfo.1.php

注意:这些关键字可以与有意义的评论共享该行(即,为了正常运行,他们不必独立在线)。

答案 1 :(得分:0)

此错误应在Clang 8中修复。