|
1
33
请使用LCOV。它隐藏了gcov的复杂性,产生了很好的输出,允许每个测试的详细输出,具有简单的文件过滤和已审查行的-ta taa-行标记: 来自geninfo(1):
|
![]() |
2
2
被称为工具 gcovr 可用于总结GCOV的输出,以及( from at least version 3.4 )它支持与LCOV相同的排除标记。 从 this answer :
您也可以替换
|
![]() |
3
1
你能介绍相关函数的单元测试吗?这些测试仅仅是为了通过直接攻击理论上不可匹配的代码路径来关闭gcov?因为它们是单元测试,所以它们可能会忽略情况的“不可能”。它们可以调用从未调用的函数,传递无效的枚举值以捕获默认分支等。 然后,要么只在用ndebug编译的代码版本上运行这些测试,要么在触发断言的测试工具中运行它们——无论测试框架支持什么。
不过,我觉得规范说代码必须存在有点奇怪,而不是包含代码功能需求的规范。特别是,它意味着您的测试并没有测试那些需求,这是保持需求正常运行的一个很好的理由。就我个人而言,我想修改规范说,“如果用无效的枚举值调用,函数将失败
大概它目前所说的是“所有switch语句都必须有一个默认情况”。但这意味着编码标准通过引入死代码来干扰可观测行为(至少在GCOV下是可观测的)。编码标准不应该这样做,所以如果可能的话,功能规范应该考虑编码标准。
如果失败,您可能会将不可编辑的代码包装在
编辑:你说你在使用一个不可靠的代码生成器,但你也在通过注释源代码来寻求解决方案。如果您要更改源代码,在许多情况下,您可以删除死代码吗?不是说改变生成的源是理想的,而是需要… |
![]() |
4
0
我不相信这是可能的。gcov依赖gcc生成额外的代码来生成覆盖率输出。gcov本身只是解析数据。这意味着gcov无法比gcc更好地分析代码(我假设您使用了-wall并删除了报告为不可访问的代码)。 记住,可重定位函数可以从任何地方调用,甚至可能是外部DLL或可执行文件,因此编译器无法知道哪些可重定位函数不会被调用,或者这些函数可能有哪些输入。 您可能需要使用一些facy静态分析工具来获取所需的信息。 |