当前位置:  开发笔记 > 编程语言 > 正文

传统C/C++项目中的死代码检测

如何解决《传统C/C++项目中的死代码检测》经验,为你挑选了2个好方法。

您如何在C/C++代码中进行死代码检测?我有一个非常大的代码库可供使用,至少10-15%是死代码.有没有基于Unix的工具来识别这个区域?有些代码仍然使用了很多预处理器,可以自动化处理吗?



1> Johan..:

您可以使用代码覆盖率分析工具来查找代码中未使用的位置.

gcc工具链的一个流行工具是gcov,以及图形前端lcov(http://ltp.sourceforge.net/coverage/lcov.php).

如果使用gcc,则可以使用gcov支持进行编译,该支持由'--coverage'标志启用.接下来,运行您的应用程序或使用此gcov启用的构建运行您的测试套件.

基本上gcc会在编译期间发出一些额外的文件,应用程序也会在运行时发出一些覆盖数据.您必须收集所有这些(.gcdo和.gcda文件).我不会在这里详细介绍,但您可能需要设置两个环境变量以便以合理的方式收集覆盖率数据:GCOV_PREFIX和GCOV_PREFIX_STRIP ...

运行后,您可以将所有覆盖数据放在一起,并通过lcov工具包运行它.虽然有点涉及,但也可以合并来自不同测试运行的所有覆盖文件.

无论如何,你最终得到了一组很好的网页,显示了一些覆盖信息,指出了没有覆盖的代码片段,因此没有被使用.

当然,您需要仔细检查代码的各个部分是否在任何情况下都没有使用,并且很大程度上取决于您的测试在多大程度上运用代码库.但至少,这将给出关于可能的死码候选者的想法......



2> Steve Jessop..:

使用-Wunreachable-code在gcc下编译它.

我认为版本越新越好,你会得到更好的结果,但我的印象可能是错误的,这是他们一直在积极研究的.请注意,这会进行流分析,但我不相信它会告诉您"离开预处理器时已经死亡的"代码,因为它从未被编译器解析过.它也不会检测例如从未被调用的导出函数,或者特殊情况处理代码,这恰好是不可能的,因为没有任何东西用该参数调用函数 - 你需要代​​码覆盖(并运行功能测试,而不是单元测试.假设单元测试具有100%的代码覆盖率,因此就应用程序而言,执行"死"的代码路径.尽管如此,考虑到这些限制,这是一种简单的方法来开始在代码库中找到最完整的bollixed例程.

此CERT顾问列出了一些其他静态死代码检测工具


但是,如果您的代码没有使用新功能,您仍然可以使用旧的gcc作为静态分析工具.所以我的回答并非完全错误.有点触及,我知道;-)
这个答案对于从gcc中删除了-Wunreachable-code选项这一事实不再有效.http://gcc.gnu.org/ml/gcc-help/2011-05/msg00360.html
推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有