死代码识别(C ++)

时间:2008-11-26 16:07:29

标签: c++ static-analysis dead-code

我有一个在Visual Studio 2008下编译的大型遗留C ++项目。我知道有相当数量的“死”代码无法在任何地方访问 - 未调用的方法,未使用的整个类。

我正在寻找一种能够通过静态分析识别出来的工具。

这个问题:Dead code detection in legacy C/C++ project建议使用代码覆盖工具。这不是一个选项,因为测试覆盖率不够高。

它还提到了一个无法访问的代码。 gcc的选项。我想要一些类似于Visual Studio的东西。我们已经使用链接器的/ OPT:REF选项来删除冗余代码,但是这并没有报告死代码的有用级别(当与/ VERBOSE一起使用时,有超过100,000行,包括来自库的很多行。)

是否有更好的选项可以与Visual Studio项目一起使用?

7 个答案:

答案 0 :(得分:8)

我知道Gimpel的Lint产品(PC-LintFlexelint)将识别无法访问的代码和未使用/未引用的模块。

它们都属于静态分析工具类别。

我与Gimpel没有任何关系,只是一个满意的长期客户。

答案 1 :(得分:6)

您需要QA-C ++(http://www.programmingresearch.com/QACPP_MAIN.html)的内容,同样请看http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis类似的产品。

您正在寻找一种可检测无法访问代码的静态代码分析工具;许多编码指南(例如MISRA-C ++,如果我没有记错的话)要求不存在无法访问的代码。专门用于执行此类指南的分析工具将是您最好的选择。

您也希望能够找到该工具的其他用途。

答案 2 :(得分:3)

我不了解Visual C,并且还推荐了-Wunreachable-code特定的覆盖工具。作为您的情况的解决方案,我会尝试以下方法:

  1. 使用ctags(或类似的程序)制作源代码中所有符号的列表
  2. 在编译器中启用死代码消除(我认为默认为on)
  3. 启用整个程序/链接时间优化(因此他知道模块中未使用的函数不是其他外部函数所必需的并被丢弃)
  4. 从二进制文件中取出符号,并将它们与1中的符号进行比较。
  5. 另一种方法可能是一些调用图生成工具(例如doxygen)。

答案 3 :(得分:1)

我建议你使用几种方法: 1. GCC有一些有用的编译标志:

-Wunused-function
-Wunused-label
-Wunused-value
-Wunused-variable
-Wunused-parameter
-Wunused-but-set-parameter

2。 Cppcheck有一些有用的功能,如:

 --enable=unusedFunction

3。使用之前建议的静态分析仪。

答案 4 :(得分:0)

一种适合我的方法 - 使用Delphi - 是启用调试,并在调试器下运行程序。

当在调试器下运行Delphi程序时,IDE会在边缘显示哪些代码行可以设置为断点。真正死机的代码 - 即链接器/编译器已被剥离的代码很明显,因为无法在那里设置断点。

一些补充说明,因为评论者似乎误解了这一点:

a:您不需要尝试在每一行上设置断点。只需在IDE中打开源文件,然后快速滚动它。很容易发现死代码。

b:这不是'代码覆盖'检查。您不需要运行应用程序以查看它是否到达行。

c:我对VS2008不够熟悉,所以不能说这个建议是否有效。

答案 5 :(得分:0)

要么
1)MSVC在内置static analysis tool中使用不足 2)MSVC marketplace有许多工具,包括对大多数免费工具的支持,包括CppCheck

对于市场应用程序,您将需要最新版本的Visual Studio,但免费的“Community Edition”具有非常宽松的许可。

答案 6 :(得分:-3)

编写一个随机删除函数的脚本(来自源代码)并从头开始重新编译所有内容。如果它仍然编译 - 该功能是死代码。