【发布时间】:2015-07-19 23:39:35
【问题描述】:
我正在尝试使用 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 -coverage 和 lcov 以获得初始覆盖:
$ 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 Yosemite 上使用系统叮当声:
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 试过),该行仍然被标记为可执行,但最终的覆盖率报告已经被执行了。
【问题讨论】:
标签: c clang llvm code-coverage lcov