有没有办法警告未使用的function?

我想在代码库中find未使用的函数,包括编译单元。 我使用gcc作为我的编译器。

这是一个例子:

foo.c (假设合适的foo.h ):

 void foo() { .... } void bar() { .... } 

main.c

 #include <stdio.h> #include "foo.h" int main(void) { bar(); return 0; } 

在这个例子中,我想警告foo()没有被使用。

-Wunused-function gcc选项:

-Wunused-function

如果声明了一个静态函数但未定义,或者未使用非内联静态函数,则会发出警告。 此警告由-Wall启用。

但只是静态函数 – 它不会在上面的例子中产生警告。

我也会接受可以为我做的工具/脚本/其他编译器的build议 – 尽pipe如果可能的话我宁愿坚持使用gcc

LibreOffice开发者Caolan Mc Namara在LibreOffice源代码中做了一个小工具来检测这种types的东西。 他们有大约数千种LibreOffice中未使用的function和方法。 他的工具是消除它们的关键因素。

这叫做召唤师 。 它可以

收集定义的函数/方法并减去调用/引用

它直接在汇编输出上工作,所以它只适用于x86和x86_64体系结构。 它可以产生这样的输出。 您可以将它与传统的编译和链接调用集成到gcc。

Caolan同意,它应该成为一个海湾合作委员会的插件。

我知道你要求警告,并且不喜欢使用gcc选项,但它确实很简单。

您可以使用链接器优化( – gc-sections)来从您的应用程序中删除死代码。

从gcc的手册页:

–gc-sections –no-gc-sections启用未使用的input节的垃圾回收。 在不支持此选项的目标上被忽略。 可以通过在命令行中指定–no-gc-sections来恢复默认行为(不执行此垃圾回收)。

–gc-sections通过检查符号和重定位来决定使用哪个input节。 包含入口符号的部分和包含未定义在命令行上的符号的所有部分将被保留,包含dynamic对象引用的符号的部分也将保留。 请注意,在构build共享库时,链接器必须假设引用了任何可见的符号。 一旦确定了这一组初始部分,链接器recursion地标记为使用其重定位引用的任何部分。 请参阅–entry和–undefined。

这个选项可以在执行部分链接时设置(使用选项-r启用)。 在这种情况下,必须通过链接器脚本中的–entry或–undefined选项或“ENTRY”命令明确指定保留的符号的根。

首先,如果你希望这样的警告是程序范围的,你肯定需要-flto标志,因为它应该在链接时解决,而不是在编译每个单元时。 但我不认为海湾合作委员会提供这样的警告,即使这样。

然后,在一般情况下,我会明白提供它是不明智的(因为例如,链接的libc可能有很多你的应用程序不需要的function)。 此外,应用程序可以使用dlsym技巧来达到一个明显不需要的function…

然而,这是GCC插件或MELT扩展的潜在用例的一个很好的例子,它将在某个地方注册每个调用事件,而后面的实用程序将find所有的非调用函数。 (但是为GCC编写插件或MELT扩展至less需要几天,因为您需要了解GCC内部)。

您也可以使用分析技术来获取dynamic未使用的(未调用的)函数。

随意通过电子邮件问我更多。

Eclipse CDT确实有代码分析,您可以设置它来标记未使用的静态函数和未使用的函数声明(以及其他有用的东西)。 正如已经告诉的,只有链接器可以告诉某些(非静态)函数没有用在某些二进制文件…

gprof是我猜的最简单的解决scheme。 我编译了你使用-pg选项编写的示例程序,以便在运行a.out (这个gprof可以使用)时获得gmon.out ,然后我运行gprof -z a.out gmon.out | tee output.txt gprof -z a.out gmon.out | tee output.txt 。 我可以在未使用的列表中find你的函数foo ! 即被称为0次。 -z是你应该使用gprof跟踪未使用的例程的选项。

感谢这个线程适当的指针!

PS: gprof与你未使用的函数foo一起扔了一大堆其他未使用的库函数。 我真的不知道如何过滤这:)