2015-07-19 17 views
1

我正在尝试使用clang -coverage为我的C项目生成覆盖率信息,但所有函数签名都被标记为未覆盖,当我预计它们未被检测到时所有。clang -coverage将函数签名标记为未覆盖

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

extern int puts(const char*); 

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

在这个例子中,我期望线4和5被标记可执行文件,但不就行了。我跑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 

生成覆盖率文件看起来是这样的:

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约塞米蒂系统铛:

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与尝试),同样的事情,该行仍标记可执行文件,但最终覆盖报告有它正在执行。

回答

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

注意:这些关键字可以共享有意义的评论(即,他们不必为了正常工作而独自行事)。