5

我正在寻找一种方法来检查编译为 ELF 的 C 项目是否具有未使用的函数并找到它们。那是在我的代码中已声明但未在任何地方调用的函数。

解决方案可以是以下之一:

  • 一个通过我的 .c 文件,分析它们的实用程序
  • 一个通过我编译的 ELF 文件的实用程序,它有符号,静态分析它
  • 一种警告 gcc 中未使用函数的方法(并且 -Wunused-functions 不会对全局函数执行此操作)

解决方案不能是以下之一:

  • 在编译时删除未使用的函数,而不知道删除了哪些函数
  • 在运行时分析 ELF 文件,因为并非每个函数都会在每次运行中被调用,例如gprof(有些函数需要几天才能被调用,但在代码流中你可以看到它们最终被调用)
  • 一种实用程序,用于发现函数内部的死代码(即从函数返回后的代码),而不是未使用的函数

谢谢

4

2 回答 2

1

最简单的方法是处理项目中的目标文件,就像链接器那样。除了注意未引用的符号之外,它不需要做任何事情,所以这比编写链接器要容易得多。

调用的 Unix/Linux/Cygwin 实用程序可以满足lorder您的需求。

于 2014-03-24T22:50:48.510 回答
0

如果你需要一些精确的、自动化的或精致的东西,你需要你的编译器和构建系统以某种方式联合起来为你做这件事。

如果您不需要精确的结果或特别自动化或优化的东西,那么这里有一个非常粗略的近似值:它会找到在所有 .c 文件中只出现一次的每个单词。

find . -name \*.c -exec cat {} \; \
   | tr -s '[[:space:];:,?!.|()-"<>=]' '\n' \
   | sort \
   | uniq -u

当然,这可能会以一百万种方式失败:预处理器技巧、重复函数名称的注释、与注释中使用的常用词命名相同的函数等。

于 2014-03-24T22:42:54.387 回答