关于Visual C ++:在大型C ++旧版应用程序中查找“死代码”

Finding “dead code” in a large C++ legacy application

我目前正在开发一个大型的旧C ++应用程序,之前有很多开发人员。 项目,类和函数中有很多"死代码",这些代码不再被任何人使用。

C ++可以使用哪些工具来分析大型代码库以检测和重构死代码? 注意:我不是在谈论像gcov这样的测试覆盖率工具。

您如何在项目中找到无效代码?


您将要使用静态分析工具

  • StackOverflow:有哪些可用的开源C ++静态分析工具?
  • StackOverflow:Windows上的C ++静态代码分析工具
  • 维基百科:用于静态代码分析的工具列表

我遇到的主要问题是,您必须注意不要在您无法控制/拥有的地方使用任何库。如果您从通过引用项目中的库而使用的类中删除一个函数,则可能会破坏一些您不知道使用该代码的东西。


您可以为此使用Cppcheck:

1
2
3
4
5
6
$ cppcheck --enable=unusedFunction .
Checking 2380153.c...
1/2 files checked 0% done
Checking main.c...
2/2 files checked 0% done
[2380153.c:1]: (style) The function '2380153' is never used.


CaolánMcNamara的callcatcher在LibreOffice项目(?6 MLOC)中非常有效地用于查找无效代码。


没有比这更熟悉代码的了。除非经过严格的修剪。

有时,看起来像枯木的东西被用作单元测试等的脚手架,或者它似乎是活着的,仅仅是因为旧的单元测试对其进行了测试,但从未在测试之外进行过测试。不久前,我删除了支持外部CAD模型翻译器的1000多个LOC,我们进行了调用这些外部翻译器的测试,但是这些翻译器已经有8年以上不受支持了,即使他们愿意,应用程序的用户也无法使用可以调用它们。

除非一个人严谨地清除枯木,否则一个人会发现您的团队将这些东西维护了多年。


我认为您最好的选择可能是覆盖工具。 * nix和Windows都有很多。如果您有单元测试,这很容易-如果您的测试覆盖率很低,那么发现的代码要么已经失效,要么还没有经过测试(无论如何您都希望获得这两个信息)。如果没有单元测试,请使用其中一种工具提供的工具构建应用程序,并通过一些(理想情况下应该是全部)执行路径运行该应用程序,然后查看报告。您将获得与单元测试相同的信息,它将只需要做很多工作。

由于您使用的是VisualStudio,因此我可以为您提供几个可以考虑使用的链接:

  • 覆盖率仪
  • 靶心覆盖

它们都不是免费的,甚至都不便宜,但结果通常是值得的。

在类似* nix的平台上,gcov与zcov或lcov之类的工具结合在一起是一个非常不错的选择。


一种方法是在类和函数名称上使用"查找所有引用"上下文菜单项。如果类/函数本身仅被引用,则几乎可以肯定是死代码。

基于相同想法的另一种方法是从项目中删除(注释掉)文件/功能,并查看将得到什么错误消息。


请参阅我们的SD C ++测试范围。

您需要做很多动态测试来练习代码,以确保达到最大覆盖率。代码" not cover"可能会或可能不会死亡;也许您只是没有测试用例来执行它。


尽管不是专门针对死代码,但我发现了Source Navigator

http://sourcenav.berlios.de/

设置非常麻烦,但设置起来很麻烦。那是一年前在Linux(Fedora)上进行的。