我有遗留的 C++ 代码,我应该从中删除未使用的代码。问题是代码库很大。
我如何找出哪些代码从未被调用/从未使用过?
未使用的代码有两种:
- 本地的,也就是说,在某些函数中,某些路径或变量未使用(或使用但没有任何意义,例如已写入但从未读取)
- 全局对象:从未被调用的函数、从未被访问的全局对象
对于第一种情况,一个好的编译器可以提供帮助:
-
-Wunused
(GCC, Clang)应该警告未使用的变量,Clang 未使用的分析器甚至已增加以警告从未读取(即使使用)的变量。
-
-Wunreachable-code
(旧海湾合作委员会,2010年删除) 应警告从未访问过的本地块(这种情况发生在早期返回或始终评估为 true 的条件时)
- 据我所知,没有选项可以警告未使用的情况
catch
块,因为编译器通常无法证明不会抛出异常。
对于第二种,就困难得多。静态地,它需要整个程序分析,即使链接时优化实际上可以删除死代码,但实际上程序在执行时已经发生了很大的变化,几乎不可能向用户传达有意义的信息。
因此有两种方法:
- 理论上是使用静态分析器。一款可以立即详细检查整个代码并找到所有流程路径的软件。实际上,我不知道有什么可以在这里工作。
- 务实的方法是使用启发式方法:使用代码覆盖率工具(在 GNU 链中,它是
gcov
。请注意,应在编译期间传递特定标志才能使其正常工作)。您使用一组良好的不同输入(您的单元测试或非回归测试)运行代码覆盖工具,死代码必然位于未到达的代码中......因此您可以从这里开始。
如果您对这个主题非常感兴趣,并且有时间和意愿自己实际开发一个工具,我建议使用 Clang 库来构建这样一个工具。
- 使用Clang库获取AST(抽象语法树)
- 从入口点开始执行标记和清除分析
因为 Clang 会为您解析代码,并执行重载解析,所以您不必处理 C++ 语言规则,并且您将能够专注于手头的问题。
然而,这种技术无法识别未使用的虚拟覆盖,因为它们可能被您无法推理的第三方代码调用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)