我需要一个工具来分析 C++ 源代码并说明未使用哪些代码。源大小约为 500mb
4 回答
PC-Lint 很好。如果它需要免费/开源,您的选择就会减少。Cppcheck 是免费的,并且会检查未使用的私有函数。我不认为它会寻找诸如 PC-Lint 之类的未实例化类之类的东西。
再一次,我将把AQTime放到讨论中。对大多数(如果不是全部)支持的语言进行静态代码分析。不过我并没有真正进入那部分,我主要使用动态分析器(内存、性能等)。
您可以使用代码覆盖率工具(动态分析)来了解哪些代码没有被执行,然后手动分析以查看该代码是否真的没用。
如果您想要进行静态分析,您需要一个可以读取整个 500Mb 源代码(估计有 2000 万行?哇!)并计算所使用内容的保守估计的工具。这需要对整个系统进行点对点分析。
原因如下:如果您遗漏了任何模块 Z,并确定未使用 FOO,您稍后可能会发现 Z 恰好是使用 FOO 的模块,或者更巧妙的是,Z 复制了一个恰好包含 &FOO 的指针值到第三个模块 M,该模块又通过指针调用“未使用”函数。
这意味着没有任何静态分析工具只能读取单个模块(编译单元)可以安全地回答这个问题。在你的规模上,你不能犯愚蠢的错误。
我的公司 Semantic Designs 使用我们的 DMS Software Reengineering Toolkit 对 3500 万行 C 代码系统进行了点对点分析。DMS 可以读取非常大的源代码系统。它需要一个自定义工具,与其说是因为源代码是 C++ 的一种奇怪的(古老的)方言,不如说是因为非常现代的方言中的系统不可能这么大,没有足够的时间来编写它们!),而是因为在非常大型系统还有其他特殊因素在起作用。对于我们所做的 C 系统,有一个自定义动态链接器,这会影响指向分析,而后者又必须进行自定义。
因为您正在讨论的规模系统总是有这样的惊喜(BIBSEH:“因为在大系统中,一切都会发生”),您可能需要一个自定义工具来回答这个问题。DMS 旨在定制。请参阅http://www.semanticdesigns.com/Products/DMS/DMSToolkit.html 和http://www.semanticdesigns.com/Products/FrontEnds/CppFrontEnd.html
代码覆盖工具是您所需要的,但您必须通过所有功能运行我们的程序并查看报告为未使用的内容。由于代码可能是 DLL 导出函数,因此您必须确保没有在外部使用它们。一些代码覆盖率工具:如果我没记错的话,Purify、CTC++、Boundschecker 和一堆其他工具可能具有代码覆盖率功能。
在不知道可能链接/使用它的外部程序的情况下删除任何可能已导出的函数时要非常小心。