如何在C/C++代码中检测死代码?我有一个相当大的代码库来工作,至少有10-15%是死代码。有没有基于Unix的工具来识别这个领域?有些代码仍然使用了大量的预处理器,自动化过程能处理吗?
发布于 2008-10-23 01:38:59
为此,您可以使用代码覆盖率分析工具,并在代码中查找未使用的位置。
gcc工具链的一个流行工具是gcov,以及图形前端lcov (http://ltp.sourceforge.net/coverage/lcov.php)。
如果您使用的是gcc,则可以使用gcov支持进行编译,这是通过'--coverage‘标志启用的。接下来,使用这个支持gcov的构建来运行您的应用程序或测试套件。
基本上,gcc在编译过程中会发出一些额外的文件,应用程序在运行时也会发出一些覆盖率数据。您必须收集所有这些文件(.gcdo和.gcda文件)。我不会在这里详细介绍,但是您可能需要设置两个环境变量来以合理的方式收集覆盖率数据: GCOV_PREFIX和GCOV_PREFIX_STRIP……
运行之后,您可以将所有覆盖率数据放在一起,并通过lcov工具套件运行它。合并来自不同测试运行的所有覆盖率文件也是可能的,尽管有点涉及。
无论如何,你最终得到了一组很好的网页,显示了一些覆盖率信息,指出了没有覆盖率的代码片段,因此没有使用。
当然,您需要仔细检查代码部分是否在任何情况下都没有使用,这在很大程度上取决于您的测试对代码库的执行情况。但至少,这将给出一个关于可能的死代码候选人的想法……
发布于 2008-10-23 06:50:24
用-Wunreachable-code在gcc下编译。
我认为这个版本越新,你就会得到越好的结果,但我的印象可能是错误的,因为我认为这是他们一直在积极努力的东西。请注意,这确实进行了流分析,但我不相信它会告诉您“代码”在离开预处理器时已经死了,因为编译器从来没有解析过它。它也不会检测到,例如,从未调用过的导出函数,或者碰巧不可能的特殊情况处理代码,因为没有任何东西使用该参数调用函数-你需要代码覆盖率(并运行功能测试,而不是单元测试。单元测试应该有100%的代码覆盖率,因此执行的代码路径对于应用程序来说是“死的”)。不过,考虑到这些限制,这是在代码库中开始查找最完全粗体的例程的一种简单方法。
This CERT advisory lists some other tools for static dead code detection
发布于 2008-10-23 06:30:40
您的方法取决于可用性(自动化)测试。如果您有一个您信任的测试套件,可以覆盖足够多的功能,您可以使用覆盖分析,正如前面的答案所建议的那样。
如果你没有那么幸运,你可能想看看源代码分析工具,比如SciTools的Understand,它可以帮助你使用大量内置的分析报告来分析你的代码。我使用这个工具的经验可以追溯到两年前,所以我不能给你太多细节,但我记得他们有一个令人印象深刻的支持,错误修复和问题答案的周转时间非常快。
我在static source code analysis上找到了一个页面,上面还列出了许多其他工具。
如果这对您也没有足够的帮助,并且您对找出与预处理器相关的死代码特别感兴趣,我建议您发布一些关于代码的更多详细信息。例如,如果它主要与#ifdef设置的各种组合有关,您可以编写脚本来确定设置的(组合),并找出实际上从未构建过的组合,等等。
https://stackoverflow.com/questions/229069
复制相似问题