在C / C ++中识别未使用的函数

时间:2012-05-24 07:14:56

标签: c++ c function dead-code

  

可能重复:
  Finding “dead code” in a large C++ legacy application

我的项目有很多C源文件,每个文件都有很多全局函数。其中许多都不再被任何呼叫者引用。是否有一种简单的方法来识别哪些功能根本没有被任何人引用?

VC生成的地图文件似乎很有用。但我不确定在地图文件中如何/何时列出函数名称。

3 个答案:

答案 0 :(得分:2)

您可以使用CCCC(免费,开源),它可以为您提供有关您的计划的大量指标。另一种选择是Coverity(不是免费的)。

这个问题可能与此问题重复:Dead code detection in legacy C/C++ project

答案 1 :(得分:1)

我认为地图文件没有任何用处。如果它像其他 我见过的地图文件,它不会指示符号在哪里(如果有的话) 仅用于定义的位置。您可以做的是运行dumpbin 在您的目标文件上:例如,dumpbin /relocations将在 事实上,每次使用带有可能需要的地址的符号 重定位(实际上,函数和变量与静态 一生)。然后,您可以使用输出上的常用工具来确定 您感兴趣的功能是否存在。 (作为某人 谁主要在Unix上工作,我已经安装了CygWin并且会使用 grep。我不熟悉不同的原生等价物 Windows下的Unix工具。)

这很简单(使用Python或类似的脚本) 语言)编写一个解析输出的小脚本 每个目标文件dumpbin /symbols,以获取其名称 你定义的所有函数,然后解析dumpbin /relocations的输出,给你一个你使用的函数列表,最后 做两者的差异。 (微软似乎已经离开了他们的 使dumpbin的输出难以使用的方法,但它仍然没有 那很难;你只需知道要忽略哪些行。)

答案 2 :(得分:-3)

这样做的一种直接但费力的方法就是用预处理器指令包装任何可疑函数的函数声明和定义:

#if 0
void old_func();
#endif

...

#if 0
void old_func()
{
}
#endif

或者如果你想拥有更多控制权,你可以用你自己的实际宏替换0,以便#if 0变成#ifdef NO_OLD_FUNCTIONS - 这样就更容易找到并在以后永久地将它们取出来一旦你开心他们就不会被使用。

当然,您需要完全编译和链接代码以及构建在其上的任何其他代码。