在Windows平台上的本地C++应用程序中自动检测死代码?

12

背景

我有一个使用本地C ++编写的应用程序,已经持续了几年时间,它大约有60 KLOC。有许多许多函数和类已经死亡(可能有10-15%,就像下面类似的基于Unix的问题所问)。我们最近开始对所有新代码进行单元测试,并在可能的情况下将其应用于修改后的代码。但是,我觉得我们现在的测试覆盖率不到5%。

假设/限制条件

方法和/或工具必须支持:

  • 本地(即未管理)C ++
  • Windows XP
  • Visual Studio 2005
  • 不能要求用户提供测试用例以实现覆盖范围(例如,不能依赖于单元测试生成代码覆盖率)

如果该方法支持以上要求之外的功能,那就太好了。

注意:我们目前使用的是Visual Studio 2005 Professional版,而不是Team System。因此,使用Team System可能是一个有效的建议(我不知道,我从未使用过),但我希望它不是唯一的解决方案。

为什么使用单元测试来实现代码覆盖不可行

我认为通用工具不可能找到任意应用程序中所有死代码(例如,无法访问的代码),而又没有错误结果(我认为这相当于停机问题)。但是,我也相信通用工具可以找到许多类型的死代码,这些代码很可能实际上是死代码,例如从未被代码中的任何其他部分引用的类或函数。

使用单元测试提供测试覆盖率,您不再使用通用算法,从而增加了检测死代码的百分比和任何命中不是误报的概率。相反,使用单元测试可能会导致假阴性,因为单元测试本身可能是唯一运行某个代码片段的东西。理想情况下,我希望有回归测试来测试所有外部可用的方法、API、用户控件等,这将作为代码覆盖率分析的基准测量,以排除某些方法是误报的。不幸的是,目前我没有这种自动化测试。

然而,由于我拥有如此庞大的代码库,同时测试案例覆盖率很低,因此我正在寻找一些能够帮助而不需要投入大量时间编写测试案例的东西。

问题

在Windows平台上,使用Visual Studio 2005开发环境,如何以自动化或半自动化的方式检测本地C++应用程序中的死代码?

另请参阅

在旧版C/C++项目中检测死代码 我想告诉VC++编译器编译所有代码。可行吗?


那么,OP最终是怎样解决了这个问题? - Ira Baxter
3个回答

7

要求链接器移除未被引用的对象(/OPT:REF)。如果你使用函数级别的链接,并且启用了详细的链接器输出,链接器输出将列出它能够证明未使用的每个函数。这个列表可能远非完整,但你已经拥有所需的工具。


1

我们使用Bullseye,我可以推荐它。它不需要在单元测试环境中运行,尽管这是我们的做法。


谢谢您的建议。我会进一步调查这个选项。 - Zach Burlingame

-4

使用代码覆盖率工具来检测你的单元测试套件。


这正是我所说的不可选项。由于单元测试覆盖率仅为5%,使用它们进行代码覆盖测试将导致大量的误报。 - Zach Burlingame
3
您的单元测试覆盖率只有5%,而您关心的是删除未使用的代码,而不是已使用的代码。有趣。 - EvilTeach
你可以考虑提高警告级别,这样编译器就会报告未使用的代码,并设置链接器选项以不链接死代码。 - EvilTeach
4
然而,除了死代码之外,我还关心的是将其去除可以使许多维护任务变得更加容易,包括在我们进行重构时向正在使用的代码添加测试。散布死代码会给所有人带来困惑,特别是对于新接手该项目的开发人员。 - Zach Burlingame

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接