54

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

我正在寻找一种可以通过静态分析识别这一点的工具。

这个问题:遗留 C/C++ 项目中的死代码检测建议使用代码覆盖工具。这不是一个选项,因为测试覆盖率不够高。

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

是否有更好的选项可以很好地与 Visual Studio 项目配合使用?

4

7 回答 7

9

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

它们都属于静态分析工具的范畴。

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

于 2009-06-30T20:15:43.327 回答
7

你会想要一些类似于 QA-C++ ( http://www.programmingresearch.com/QACPP_MAIN.html ) 的东西,另请参阅http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis了解类似产品。

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

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

于 2008-11-26T16:37:53.690 回答
3

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

  1. 使用 ctags(或类似程序)制作源代码中所有符号的列表
  2. 在您的编译器中启用死代码消除(我假设它默认为打开)
  3. 启用整个程序/链接时间优化(这样他就知道其他外部不需要模块中未使用的函数并被丢弃)
  4. 从二进制文件中取出符号并将它们与 1 中的符号进行比较。

另一种方法可能是一些调用图生成工具(例如 doxygen)。

于 2008-11-26T16:43:12.460 回答
1

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

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

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

 --enable=unusedFunction

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

于 2017-08-28T12:22:53.830 回答
0

一种对我有用的方法——使用 Delphi——是启用调试,并在调试器下运行你的程序。

当 Delphi 程序在调试器下运行时,IDE 会在空白处显示哪些代码行可以设置为断点。真正死掉的代码——即已被链接器/编译器剥离的代码是显而易见的,因为断点不能在那里设置。

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

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

b:这不是“代码覆盖率”检查。您无需运行该应用程序即可查看它是否到达线路。

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

于 2008-11-26T18:05:06.167 回答
0

要么
1) MSVC 在内置静态分析工具中使用不足。
2) MSVC市场有很多工具,包括对大多数免费工具的支持,包括CppCheck

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

于 2018-04-22T12:38:58.797 回答
-4

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

于 2009-02-18T21:12:01.010 回答