死码识别(C ++)
我有一个很大的遗留C ++项目在Visual Studio 2008下编译。我知道有相当数量的“死”代码,不访问任何地方 – 未调用的方法,没有使用的整个类。
我正在寻找一个能够通过静态分析来识别这个问题的工具。
这个问题: 传统C / C ++项目中的死代码检测build议使用代码覆盖工具。 这不是一个选项,因为testing覆盖率不够高。
它还提到了一个无法访问的代码。 选项gcc。 我想为Visual Studio类似的东西。 我们已经使用链接器的/ OPT:REF选项来删除多余的代码,但是这不会在有用的级别上报告死代码(当与/ VERBOSE一起使用时,有超过100,000行,包括来自库的许多行)。
有没有更好的select,与Visual Studio项目很好地工作?
您需要沿着QA-C ++( http://www.programmingresearch.com/QACPP_MAIN.html )的要求,也可以参阅http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis了解类似的产品。;
你正在寻找一个静态的代码分析工具,检测不可达的代码; 许多编码准则(如MISRA-C ++,如果我没有弄错)要求不存在不可达的代码。 一个分析工具,专门为执行这样的指导方针将是你最好的select。
而且您还可以find该工具的其他用途。
我知道Gimpel的Lint产品( PC-Lint和Flexelint )将识别无法访问的代码和未使用/未引用的模块。
它们都属于静态分析工具。
我和Gimpel没有联系,只是一个满意的长期客户。
我不知道Visual C,还推荐了无法访问的代码特定的覆盖工具。 作为你的情况的解决scheme,我会尝试以下几点:
- 用ctags(或类似的程序)制作一个你源代码中所有符号的列表
- 在你的编译器中启用死代码消除(我假设它默认为on)
- 启用你的整个程序/链接时间优化(所以他知道你的模块中没有使用的函数不是其他外部所需要的并且被丢弃)
- 从您的二进制文件中获取符号,并将它们与来自1的符号进行比较。
另一种方法可能是一些调用图生成工具(如doxygen)。
一个适用于我的方法 – 使用Delphi – 是启用debugging,并在debugging器下运行你的程序。
当一个Delphi程序在debugging器下运行时,IDE在边界上显示哪些代码行可以设置为断点。 由于链接器/编译器已经将链接器/编译器除去了代码,因此在这里不能设置断点,这是很明显的。
一些额外的笔记,作为评论者似乎误解了这一点:
答:您不需要尝试在每一行上设置断点。 只需在IDE中打开源文件,然后快速滚动浏览它。 死码很容易被发现。
b:这不是'代码覆盖率'检查。 您不需要运行应用程序来查看它是否到达线路。
c:我对VS2008不够熟悉,所以不能说这个build议是否可行。
我build议你使用几种方法:1. GCC有一些有用的编译标志:
-Wunused-function -Wunused-label -Wunused-value -Wunused-variable -Wunused-parameter -Wunused-but-set-parameter
Cppcheck有一些有用的function,如:
--enable=unusedFunction
3.使用之前build议的静态分析器。
编写一个脚本,随机删除一个函数(从源代码),并从头开始重新编译所有的东西。 如果它仍然编译 – 该function是死代码。