我想在静态库上执行代码覆盖。为此,我使用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)。
答案 0 :(得分:3)
头文件中的函数难以覆盖。这不仅仅是一个技术难题 - 它也是一个演示难度。每次标题为#included时,都会复制这些函数。全面保险是否要求涵盖所有副本?或者说有一个实例?
从用户的角度来看,这两个答案都可能是错误的。
此外,可能存在潜伏在用户不关心的头文件中的函数。例如,gcov
有一些。
这可能就是覆盖工具倾向于完全忽略它们的原因。
我使用覆盖工具RapiCover,我们的方法是默认忽略它们,但提供打开标题覆盖范围的选项。该选项可以在逐个文件的基础上使用,您还可以专门命名要覆盖的功能。我们发现这是支持典型客户需求的最佳方式。
我建议你尝试强迫-E
相信函数是用C源代码而不是标题定义的。为此,请预处理源文件(例如GCC的#
选项),然后过滤掉指示文件和行号的gcov
标记。然后对此预处理的过滤文件执行DrEvil.app.getApplication().getName()
。它应该将所有函数视为源代码的一部分。这个技巧也适用于RapiCover,尽管那里没有必要。