我一直在使用gcov检查代码覆盖率。我现在得到一个奇怪的结果,一些函数被列为未执行,但函数中的行被列为已执行。
lcov输出:
13 0 : f<double>& operator*=(f<double>& lhs, const double& rhs)
14 : {
15 9 : // Some code...
16 0 : return lhs;
17 : }
gcov输出:
#####: 13: f<double>& operator*=(f<double>& lhs, const double& rhs)
-: 14: {
9: 15: // Some code...
#####: 16: return lhs;
-: 17: }
当线路如何将该功能列为NOT执行?这可能是GCC优化的神器吗?
编辑1:
G ++ / gcov版本:4.9.2
lcov版本:1.11
编辑2:
与-O2
合作会产生奇怪的行为。但是,使用-O1
进行编译会将####
更改为9
答案 0 :(得分:1)
零只表示 execution_count:line_number:source line text
没有代码行的数据。这可能只是因为gcc没有方便的方式仪器 - 修改你的程序来添加计数器(如在函数的入口中)。例如,如果优化器删除或组合了附近函数中的类似语句,则无需计算。
根据manual:
格式为
‘-’
当命令行选项请求时,附加块信息可能会成功执行每一行。对于不包含代码的行,execution_count为
‘#####
。未执行的行标记为‘====’
'或{{1}},具体取决于它们是否可通过非异常路径访问,或仅分别是异常路径(如C ++异常处理程序)。
进一步阅读:
答案 1 :(得分:1)
您应该对未经优化的代码运行gcov
。这将为您提供输出,可能由lcov解释,这将确保所有行都已运行。
然后,您可以针对发布版本进行优化编译。