C 源代码的 GCOV 静态库覆盖率
GCOV static library coverage for C source code
我想对静态库执行代码覆盖。为此,我使用 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 文件中的函数难以覆盖。这不仅仅是技术上的困难——它也是演示上的困难。每次 header 被#included 时都会复制这些函数。完全覆盖是否要求覆盖所有副本?或者那一个实例被覆盖了?
从用户的角度来看,这两个答案都可能是错误的。
此外,header 文件中很可能潜伏着用户不关心的功能。例如,ctype.h
有一些。
这可能就是覆盖工具倾向于完全忽略它们的原因。
我在研究一个覆盖工具 RapiCover,我们的方法是默认忽略它们,但提供一个选项来打开 header 的覆盖。该选项可以在 file-by-file 基础上使用,您还可以具体命名要覆盖的功能。我们发现这是支持典型客户需求的最佳方式。
我建议您尝试强迫 gcov
相信这些函数是在 C 源代码中定义的,而不是 header。为此,请预处理您的源文件(例如 GCC 的 -E
选项),然后过滤掉指示文件和行号的 #
标记。然后对这个经过预处理、过滤的文件执行 gcov
。它应该将所有功能视为源代码的一部分。这个技巧也适用于 RapiCover,尽管在那里没有必要。
我想对静态库执行代码覆盖。为此,我使用 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 文件中的函数难以覆盖。这不仅仅是技术上的困难——它也是演示上的困难。每次 header 被#included 时都会复制这些函数。完全覆盖是否要求覆盖所有副本?或者那一个实例被覆盖了?
从用户的角度来看,这两个答案都可能是错误的。
此外,header 文件中很可能潜伏着用户不关心的功能。例如,ctype.h
有一些。
这可能就是覆盖工具倾向于完全忽略它们的原因。
我在研究一个覆盖工具 RapiCover,我们的方法是默认忽略它们,但提供一个选项来打开 header 的覆盖。该选项可以在 file-by-file 基础上使用,您还可以具体命名要覆盖的功能。我们发现这是支持典型客户需求的最佳方式。
我建议您尝试强迫 gcov
相信这些函数是在 C 源代码中定义的,而不是 header。为此,请预处理您的源文件(例如 GCC 的 -E
选项),然后过滤掉指示文件和行号的 #
标记。然后对这个经过预处理、过滤的文件执行 gcov
。它应该将所有功能视为源代码的一部分。这个技巧也适用于 RapiCover,尽管在那里没有必要。