背景
我有一个使用本地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++应用程序中的死代码?