我正在寻找一种方法来检查我的C项目,编译成一个ELF,是否有未使用的函数,并找到它们。这是声明的函数,但在我的代码中没有调用。
解决方案可以是:
- 一个工具,通过我的。c文件,分析他们
- 一个实用程序,通过我编译的ELF文件,有符号,静态分析它
- 一种对gcc中未使用的函数发出警告的方法(对于全局函数- unused-functions不会这样做)
解决方案不能是:
- 在不知道删除了哪些函数的情况下删除编译时未使用的函数
- 在运行时分析ELF文件,因为不是每个函数都会在每次运行中被调用,例如
gprof
(有些函数需要几天才能被调用,但在代码流中您可以看到它们最终被调用) - 一个发现函数内部死代码(即函数返回后的代码)的实用程序,而不是未使用的函数
谢谢
如果你需要一些精确的、自动化的或精致的东西,你需要你的编译器和构建系统合作,以某种方式为你做这件事。
如果您不需要精确的结果或特别自动化或抛光的东西,那么这里有一个非常粗略的近似:它将找到在所有。c文件中只出现一次的每个单词。
find . -name *.c -exec cat {} ;
| tr -s '[[:space:];:,?!.|()-"<>=]' 'n'
| sort
| uniq -u
当然,这可能会以无数种方式失败:预处理器技巧,重复函数名的注释,与注释中使用的常用单词命名的函数等。
最简单的方法是处理项目中的目标文件,而不是像链接器那样。除了注意未引用的符号外,它不需要做任何事情,因此这比编写链接器要容易得多。
Unix/Linux/Cygwin实用程序lorder
可以满足您的要求。