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

Possible Duplicate:
Finding “dead code” in a large C++ legacy application

我的项目有很多C源文件,每个文件都有很多全局函数。许多这些不再被任何呼叫者引用。有没有简单的方法来确定哪些功能没有被任何人引用?

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

0
额外 编辑
意见: 1
实际上,我有兴趣学习如何将VC链接器生成的映射文件用于此目的。 (因为它是免费的)
额外 作者 JavaMan,
手动删除并重新编译可疑函数的代码。
额外 作者 iammilind,

3 答案

做这件事很简单,但很费力,只是简单地用预处理器指令来包装任何可疑函数的函数声明和定义:

#if 0
void old_func();
#endif

...

#if 0
void old_func()
{
}
#endif

或者如果你想有更多的控制权,你可以用你自己的实际宏替换0,这样 #if 0 变成 #ifdef NO_OLD_FUNCTIONS - 这样就更容易找到并且一旦你感到快乐,他们就不会被使用,他们会在晚些时候把它们带出去。

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

0
额外
@AhmedJolani:(1)你怀疑该函数未被使用,(2)你遵循上述步骤(3),编译器会给你提供相关的错误 - 因此你要检测函数是否被使用或者不。这是一个非常常用的程序。
额外 作者 Component 10,
@AhmedJolani:这就是为什么我把它描述为'辛苦' - 但它确实有效并且不涉及(昂贵的)工具。这只是众多方法中的一种 - 请随时提出另一种建议。
额外 作者 Component 10,
这不是检测,这是预配置,这不是提问者想要听到的。
额外 作者 Ahmed Jolani,
这就是当你有数千行代码时你不想做的事情。
额外 作者 Ahmed Jolani,
分析可用于自动检测未使用的功能。
额外 作者 Ahmed Jolani,

I don't think that the map file will be of any use. If it's like other map files I've seen, it won't indicate where (if anywhere) a symbol is used—only where it is defined. What you can do is run dumpbin over your object files: dumpbin /relocations, for example, will in fact display every use of a symbol with an address which may need relocation (practically speaking, functions and variables with static lifetime). You then use your usual tools on the output to determine whether the function you are interested in is there or not. (As someone who has worked mostly on Unix, I've installed CygWin and would use grep. I'm not familiar with the native equivalents to the different Unix tools under Windows.)

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

0
额外

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

This question may be a duplicate of this one: Dead code detection in legacy C/C++ project

0
额外