我目前正在研究一个在我之前有很多开发人员的大型C ++应用程序。项目,类和函数中有很多“死代码”,任何人都不会使用它们。
有哪些工具可供C ++分析大型代码库以检测和重构死代码?注意:我不是在谈论像gcov这样的测试覆盖率工具。
如何在项目中找到死代码?
答案 0 :(得分:26)
您需要使用静态分析工具
我遇到的主要问题是你必须要小心,你不能控制/拥有任何库。如果从通过引用项目中的库来使用的类中删除某个函数,则可能会破坏您不知道使用该代码的内容。
答案 1 :(得分:8)
您可以将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.
答案 2 :(得分:3)
我认为你最好的选择可能是一个覆盖工具。 * nix和windows都有很多。如果你有单元测试,这很容易 - 如果你的测试覆盖率很低,那么未覆盖的代码要么已经死了,要么还没有测试过(你还是想要这两个部分的信息)。如果您没有单元测试,请使用其中一个工具提供的工具构建您的应用程序,通过一些(应该是所有理想情况下)执行路径运行它,并查看报告。您获得与单元测试相同的信息,它只需要更多的工作。
由于您使用的是VisualStudio,我可以为您提供一些您可以考虑使用的链接:
它们都不是免费的,甚至不便宜,但结果通常是值得的。
答案 3 :(得分:3)
没有什么比熟悉代码了。除非人们继续进行严格的修剪,否则。
有时看起来像死木的东西被用作单元测试等的脚手架,或者它似乎只是因为传统的单元测试运用它而存在,但它从未在测试之外运行。不久之前,我删除了超过1000个支持外部CAD模型翻译器的LOC,我们进行了测试,调用了那些外部翻译器,但是这些翻译人员已经8年没有得到支持了,即使他们想要这个应用程序的用户也没办法可以调用它们。
除非一个人在摆脱死木的过程中非常严谨,否则会发现你的团队会保留这些东西多年。
答案 4 :(得分:3)
CaolánMcNamara的callcatcher在LibreOffice项目(~6 MLOC)中非常有效地用于查找死代码。
答案 5 :(得分:1)
一种方法是在类和函数名称上使用“查找所有引用”上下文菜单项。如果类/函数本身仅被引用,则几乎可以肯定是死代码。
另一种基于相同想法的方法是从项目中删除(注释掉)文件/函数,并查看将获得的错误消息。
答案 6 :(得分:0)
请参阅我们的SD C++ Test Coverage。
您需要进行大量动态测试才能运行代码,以确保达到最大覆盖率。 “未涵盖”代码可能会或可能不会死亡;也许你根本就没有测试用例来锻炼它。
答案 7 :(得分:-1)
虽然不是专门用于死代码,但我找到了Source Navigator
非常有用,虽然设置起来很麻烦但有点儿麻烦。那是一年前的Linux(Fedora)。