Windows上的本机C ++应用程序中的自动死代码检测?

时间:2008-11-21 01:05:04

标签: c++ windows visual-studio-2005 code-coverage dead-code

背景

我有一个用本地C ++编写的应用程序,历时数年,大约有60个KLOC。有很多功能和类已经死了(可能有10-15%像下面提到的类似Unix的问题)。我们最近开始对所有新代码进行单元测试,并尽可能将其应用于修改后的代码。但是,我会做一个SWAG,目前我们的测试覆盖率不到5%。

假设/约束

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

  • 原生(即非托管)C ++
  • Windows XP
  • Visual Studio 2005
  • 不得要求用户提供的测试用例进行覆盖。 (例如,不能依靠单元测试来生成代码覆盖)

如果方法支持超过这些要求,那么很好。

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

为什么使用单元测试代码覆盖是有问题的

我认为通用工具不可能在任何误报率为零的任意应用程序中找到所有死的(例如无法访问的代码)(我认为这相当于Halting问题)。但是,我也相信一个通用工具有可能找到很多类型的死代码,这些代码实际上很可能已经死了,就像类或函数一样,它们在代码中永远不会被其他东西引用。

通过使用单元测试来提供此覆盖,您不再使用通用算法,从而增加了可以检测到的死代码的百分比以及任何命中不是误报的概率。相反,使用单元测试可能会导致漏报,因为单元测试本身可能是执行给定代码段的唯一事情。理想情况下,我会进行回归测试,以执行所有外部可用的方法,API,用户控件等,这些将用作代码覆盖率分析的基线测量,以排除某些方法的误报。但遗憾的是,我目前没有这种自动化测试。

由于我拥有如此庞大的代码库以及如此低的测试用例覆盖百分比,我正在寻找可以帮助的东西,而不需要花费大量时间来编写测试用例。

问题

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

另见

Dead code detection in legacy C/C++ project I want tell the VC++ Compiler to compile all code. Can it be done?

3 个答案:

答案 0 :(得分:7)

要求链接器删除未引用的对象(/ OPT:REF)。如果使用函数级链接和详细链接器输出,链接器输出将列出它可以证明未使用的每个函数。此列表可能远未完成,但您已经拥有所需的工具。

答案 1 :(得分:1)

我们使用Bullseye,我可以推荐它。它不需要从单元测试环境运行,尽管这就是我们的工作。

答案 2 :(得分:-4)

对您的单元测试套件使用代码覆盖率工具。