c++ - Windows 上 native C++ 应用程序中的自动死代码检测?

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

背景

在几年的时间里,我有一个用 native C++ 编写的应用程序,大约 60 KLOC。有许多死掉的函数和类(可能有 10-15% 类似于下面提出的基于 Unix 的类似问题)。我们最近开始对所有新代码进行单元测试,并尽可能将其应用于修改后的代码。但是,我会制作一个目前我们的测试覆盖率不到 5% 的 SWAG。

假设/约束

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

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

如果方法支持的不仅仅是这些要求,那就太好了。

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

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

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

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

由于我拥有如此庞大的代码库和如此低的测试用例覆盖率,因此我正在寻找可以提供帮助的东西,而无需投入大量时间来编写测试用例。

问题

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

另见

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

最佳答案

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

关于c++ - Windows 上 native C++ 应用程序中的自动死代码检测?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/307478/

相关文章:

c++ - operator void*() 转换仍然是 C++ 库的一部分吗?

windows - 如何在 PC 上打开 Linux .bin 文件?

windows - 从计划的批处理文件调用 git

java - Visual Studio - 不中断 J# 中的 Java 异常

c++ - 在 Windows 启动时加载应用程序

c++ - 我可以在 Windows 98 上运行在 Visual Studio 2005 中编译的应用程序吗?

c++ - 观察者模式——竞争条件

c++ - Cocos2d-x TiledMap,调用getLayer()获取碰撞层时返回nullptr?

python - 在 linux 和 windows 之间使用 pysftp.get_r 传输文件

c++ - 使用 ffmpeg 无法解析的外部符号