c - C 源代码的 GCOV 静态库覆盖率

标签 c code-coverage gcov

我想对静态库执行代码覆盖。为此,我使用 boost 编写了测试用例。在我的库中,我在头文件中定义了许多函数。

例如,在头文件accuracy.h中,我有以下函数

static float absf( float x )
{
    return (x >= 0.0f) ? x : -x;
}

static boolean almost_zero( float n, float tol )
{
    return (boolean)(absf( n ) <= tol);
}

我已经为这些功能编写了测试用例。但问题是GCOV显示这些功能没有被覆盖。如果我将函数定义移至 C 文件,那么我会得到正确的覆盖率结果。

我使用-fprofile-arcs -ftest-coverag来执行覆盖。有谁对这个问题有任何想法吗?

注意:
测试用例正确执行。我已经通过调试确认了。
我正在使用 MinGW gcc 版本 4.8.1 (GCC)。

最佳答案

头文件中的函数很难覆盖。这不仅仅是技术上的困难,也是演示上的困难。每次 header #included 时都会复制这些函数。全面覆盖是否需要覆盖所有副本?或者该实例已被覆盖?

从用户的角度来看,这两个答案都可能是错误的。

此外,头文件中可能潜藏着用户不关心的函数。例如,ctype.h 有其中一些。

这可能就是覆盖率工具倾向于完全忽略它们的原因。

我开发了一个覆盖工具 RapiCover,我们的方法是默认忽略它们,但提供一个选项来打开 header 覆盖。该选项可以逐个文件地使用,您还可以专门命名您想要覆盖的函数。我们发现这是支持典型客户需求的最佳方式。

我建议您尝试强制 gcov 相信这些函数是在 C 源代码而不是 header 中定义的。为此,请预处理源文件(例如 GCC 的 -E 选项),然后过滤掉指示文件和行号的 # 标记。然后对这个经过预处理、过滤的文件执行 gcov 操作。它应该将所有函数视为源代码的一部分。这个技巧也适用于 RapiCover,尽管在那里没有必要。

关于c - C 源代码的 GCOV 静态库覆盖率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31341366/

相关文章:

c - 关闭(0)后是否​​可以打开标准输入?

c++ - 将后缀运算符增加一个以上

java - 通过mocha测试生成用java编写的REST API的代码覆盖率

c++ - 使用多个同名源文件运行 GCOV 时出现问题

c - 如何在c中获取lua参数?

c - 如何在不使用任何内置函数的情况下将整数转换为 C 字符串,反之亦然以及其他数据类型?

asp.net - 棕地 ASP.NET 应用程序的有用/现实的代码覆盖率目标

grails - 如何安装和使用Grails测试覆盖率?

c++ - gcov 报告的析构函数中的分支是什么?

iphone - 在 Xcode 3.1 中设置 gcov