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)上进行的。