您如何在C/C++代码中进行死代码检测?我有一个非常大的代码库可供使用,至少10-15%是死代码.有没有基于Unix的工具来识别这个区域?有些代码仍然使用了很多预处理器,可以自动化处理吗?
您可以使用代码覆盖率分析工具来查找代码中未使用的位置.
gcc工具链的一个流行工具是gcov,以及图形前端lcov(http://ltp.sourceforge.net/coverage/lcov.php).
如果使用gcc,则可以使用gcov支持进行编译,该支持由'--coverage'标志启用.接下来,运行您的应用程序或使用此gcov启用的构建运行您的测试套件.
基本上gcc会在编译期间发出一些额外的文件,应用程序也会在运行时发出一些覆盖数据.您必须收集所有这些(.gcdo和.gcda文件).我不会在这里详细介绍,但您可能需要设置两个环境变量以便以合理的方式收集覆盖率数据:GCOV_PREFIX和GCOV_PREFIX_STRIP ...
运行后,您可以将所有覆盖数据放在一起,并通过lcov工具包运行它.虽然有点涉及,但也可以合并来自不同测试运行的所有覆盖文件.
无论如何,你最终得到了一组很好的网页,显示了一些覆盖信息,指出了没有覆盖的代码片段,因此没有被使用.
当然,您需要仔细检查代码的各个部分是否在任何情况下都没有使用,并且很大程度上取决于您的测试在多大程度上运用代码库.但至少,这将给出关于可能的死码候选者的想法......
使用-Wunreachable-code在gcc下编译它.
我认为版本越新越好,你会得到更好的结果,但我的印象可能是错误的,这是他们一直在积极研究的.请注意,这会进行流分析,但我不相信它会告诉您"离开预处理器时已经死亡的"代码,因为它从未被编译器解析过.它也不会检测例如从未被调用的导出函数,或者特殊情况处理代码,这恰好是不可能的,因为没有任何东西用该参数调用函数 - 你需要代码覆盖(并运行功能测试,而不是单元测试.假设单元测试具有100%的代码覆盖率,因此就应用程序而言,执行"死"的代码路径.尽管如此,考虑到这些限制,这是一种简单的方法来开始在代码库中找到最完整的bollixed例程.
此CERT顾问列出了一些其他静态死代码检测工具