在一个大的C ++遗留应用程序中查找“死代码”

我目前正在开发一个在我之前有许多开发者的大而古老的C ++应用程序。 项目中有很多“死代码”,类和function已经不再被任何人使用。

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

你如何在你的项目中find死代码?

你会想要使用静态分析工具

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

我碰到的主要问题是,你必须小心,任何图书馆都不是从你不能控制的地方使用的。 如果从通过在项目中引用库来使用的类中删除函数,则可能会破坏您不知道使用该代码的内容。

你可以使用Cppcheck来达到这个目的:

 $ 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)中非常有效地用于查找死代码。

一种方法是使用类和函数名称上的“查找所有引用”上下文菜单项。 如果一个类/函数本身只被引用,那几乎肯定是死代码。

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

我认为你最好的select可能是一个覆盖工具。 * nix和windows都有很多。 如果你有unit testing,很容易 – 如果你的testing覆盖率很低,那么发现的代码已经死了,或者还没有testing(无论如何你都需要这两个信息)。 如果您没有unit testing,请使用其中一个工具提供的工具来构build您的应用程序,然后通过一些(应该是理想的)执行path运行它,然后查看报告。 你会得到与unit testing相同的信息,它只需要更多的工作。

由于您使用VisualStudio,我可以为您提供一些您可以考虑使用的链接:

  • 覆盖范围
  • BullseyeCoverage

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

在类似nix的平台上, gcov与zcov或lcov等工具结合在一起是一个非常好的select。

没有什么比对代码熟悉。 一个人可能会进行严格的修剪。

有时候看上去像死木一样被用作unit testing的脚手架等等,或者只是因为传统的unit testing运行它而看起来还活着,但是从来没有在testing之外使用它。 不久前,我删除了超过1000个支持外部CAD模型翻译器的LOC,我们进行了testing,调用了这些外部翻译器,但这些翻译器已经超过8年没有支持了,即使他们想要应用程序的用户也没有办法可以永远援引他们。

除非一个人去除死木,否则你会发现你的团队维持这些东西多年。

虽然不是专门为死代码,我find了源导航器

http://sourcenav.berlios.de/

相当有用,虽然麻烦设置和一点儿车。 那是一年前的Linux(Fedora)。

请参阅我们的SD C ++testing覆盖率 。

您需要进行大量的dynamictesting来执行代码,以确保达到最大的覆盖范围。 代码“不覆盖”可能会或可能不会死亡; 也许你根本没有一个testing用例来运用它。