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

背景

我有一个使用本地C ++编写的应用程序,这个应用程序在几年的时间里大概是60 KLOC。 有许多function和类已经死了(大概10-15%,就像下面的类似的基于Unix的问题一样)。 我们最近开始对所有新代码进行unit testing,并尽可能将其应用于修改后的代码。 不过,我会做一个SWAG,目前我们的testing覆盖率还不到5%。

假设/约束

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

  • 本机(即非托pipe)C ++
  • Windows XP
  • Visual Studio 2005
  • 不得要求用户提供覆盖范围的testing用例。 (例如,不能依靠unit testing来生成代码覆盖率)

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

注意:我们目前使用的是Visual Studio 2005的Professional版本,而不是Team System。 因此,使用团队系统可能是一个有效的build议(我不知道,我从来没有使用过),但我希望这不是唯一的解决scheme。

为什么使用unit testing代码覆盖是有问题的

我相信一个通用的工具不可能在任何应用程序中发现所有的死亡(例如不可到达的代码),而且没有误报(我认为这相当于停机问题)。 但是,我也相信一个通用的工具可能会find很多types的死代码,而这些代码很可能实际上是死的,比如在代码中从来没有引用过的类或函数。

通过使用unit testing来提供这个覆盖范围,您不再使用通用algorithm,从而增加了可以检测到的死代码的百分比以及任何命中不是误报的可能性。 相反,使用unit testing可能会导致错误的否定,因为unit testing本身可能是唯一行使给定代码的东西。 理想情况下,我将进行回归testing,以执行所有外部可用的方法,API,用户控件等,作为代码覆盖率分析的基准度量,以排除某些方法被误报。 可悲的是,我目前没有这个自动化testing。

由于我拥有如此之低的testing用例覆盖百分比的庞大代码库,因此我正在寻找一些可以帮助您,而无需花费大量时间投入编写testing用例的工作。

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

也可以看看

遗留C / C ++项目中的死代码检测 我想告诉VC ++编译器编译所有的代码。 可以这样做吗?

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

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

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