clang -coverage 将函数签名标记为未覆盖

标签 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

生成的覆盖文件如下所示:

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 尝试),该行仍然标记为可执行,但最终的覆盖率报告让它被执行。

最佳答案

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

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

注意:这些关键字可以与有意义的注释共享行(即,它们不必单独出现在行中才能正常运行)。

关于clang -coverage 将函数签名标记为未覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31507084/

相关文章:

c++ - 在 GDB 中的捕获点停止后退出

c++ - 我在 IEEE754 乘法中失去了 2 的幂

c++ - Clang、OpenMP 和自定义 vector/矩阵缩减

C# P/调用 : Pointer to string as error message

windows - 如何在 Windows 上将 clang 与 mingw-w64 header 一起使用

c++ - 如何从 Clang 中的 CallExpr 获取函数指针的参数?

C : . 所以库和生成文件

c - 学校实验室 Shellcode BufferOverflow 的段错误

clang - 在 Windows 上使用 libc++ 吗?

c++ - Clang 和二进制折叠表达式——空参数包的诅咒