Background
我有一个用原生C++编写的应用程序,历经多年,大约有60 KLOC。有许多函数和类是死的(可能有10-15%,就像下面类似的基于Unix的问题所问)。最近,我们开始对所有新代码进行单元测试,并在可能的情况下将其应用于修改后的代码。然而,我相信我们现在的测试覆盖率不到5%。
Assumptions/Constraints
方法和/或工具必须支持:
- Native (i.e. unmanaged) C++
- Windows XP
- Visual Studio 2005
- Must not require user supplied test cases for coverage. (e.g. can t depend on unit tests to generate code coverage)
如果这些方法可以满足更多需求,那就太好了。
注意:我们目前使用的是Visual Studio 2005的专业版本,而不是团队系统。因此,使用团队系统可能是一个有效的建议(我不知道,我从来没有使用过),但我希望它不是唯一的解决方案。
Why using unit tests for code coverage is problematic
我认为一般性工具无法在任何随意的应用程序中找到所有死代码(例如无法访问的代码),并且出现零误报是不可能的(我认为这相当于停机问题)。但是,我也认为,通用工具有可能找到许多类型的死代码,这些死代码极有可能实际上是死代码,例如从未被任何其他代码引用的类或函数。
通过使用单元测试提供此覆盖率,您不再使用通用算法,因此增加了您可以检测到的死代码百分比,以及任何命中不是误报的概率。相反,使用单元测试可能会导致假阴性,因为单元测试本身可能是唯一运行给定代码片段的事物。理想情况下,我希望有回归测试,涵盖所有外部可用的方法、API、用户控件等,这将作为基准的代码覆盖分析测量,以排除某些方法是误报的可能性。然而,遗憾的是,我目前没有这个自动化测试。
由于我的代码库非常庞大,但测试用例覆盖率很低,因此我正在寻找一些可以帮助而不需要投入大量时间编写测试用例的东西。
Question
您如何在Windows平台上使用Visual Studio 2005开发环境以自动化或半自动化的方式检测本地C++应用程序中的死代码?
See Also
Dead code detection in legacy C/C++ project I want tell the VC++ Compiler to compile all code. Can it be done?