【问题标题】:GCOV static library coverage for C source codeC 源代码的 GCOV 静态库覆盖率
【发布时间】:2015-09-29 05:42:54
【问题描述】:

我想对静态库执行代码覆盖。为此,我使用 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)。

【问题讨论】:

  • absf() 似乎有点无意义,为什么不使用标准的fabs() 代替呢?另外boolean 是非标准的,使用bool
  • absf 的返回类型应该是浮点数。
  • absf 和 most_zero 是解释场景的虚拟函数:)。我以任何方式编辑了返回类型

标签: c code-coverage gcov


【解决方案1】:

头文件中的函数难以覆盖。这不仅仅是一个技术难题——它也是一个演示难题。每次标头#included 时都会复制这些函数。全面覆盖是否需要覆盖所有副本?还是涵盖了一个实例?

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

此外,头文件中可能存在用户不关心的函数。例如,ctype.h 有几个。

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

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

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

【讨论】:

  • 你能解释一下_过滤掉表示文件和行号的#标记_。
  • 将 C/C++ 程序通过预处理器(例如 gcc -E),您将在输出中看到它们。它们是以# 开头的行。
猜你喜欢
  • 1970-01-01
  • 2012-11-22
  • 1970-01-01
  • 1970-01-01
  • 2021-07-01
  • 2016-12-15
  • 1970-01-01
  • 2011-06-06
  • 1970-01-01
相关资源
最近更新 更多