【问题标题】:Using GCC to find unreachable functions ("dead code")使用 GCC 查找无法访问的函数(“死代码”)
【发布时间】:2010-11-16 15:00:23
【问题描述】:

我正在寻找一种在(非常)大的 C++ 项目中找到静态无法访问的函数的方法。我曾尝试使用这里建议的 doxygen 和其他静态分析工具,但似乎该项目对他们来说太复杂了,无法处理。最后我决定使用 GCC 工具(g++、gprof、gcov 等)是最安全的选择,尽管我不知道该怎么做。

我认为 g++ 优化消除了静态无法访问的函数,但我不确定如何获取它消除的函数的名称。

你有什么建议吗?

【问题讨论】:

标签: c++ gcc dead-code


【解决方案1】:

死代码优化通常由链接器完成 - 编译器没有概览。但是,编译器可能已经消除了未使用的 static 函数(因为它们具有内部链接)。

因此,您不应查看 GCC 选项,而应查看 ld 选项。看来你想要--print-gc-sections。但是,请注意,您可能希望 GCC 将每个函数放在其自己的部分 -ffunction-sections 中。默认情况下,GCC 会将所有函数放在同一个部分中,而 ld 不够聪明,无法消除未使用的函数——它只能消除未使用的部分。

【讨论】:

  • --print-gc-sections 选项打印结果如下:Removing unused section '.text._DriverUnloadHandler' in file '/tmp/ccLoxO8q.ltrans0.ltrans.o'。那么如何找到原来的C文件名呢?
  • -ffunction-sections 不适用于汇编代码,因为不涉及编译。因此,汇编代码中的所有函数都将位于 .text 部分中,这使得 --print-gc-sections 对于检测未使用的函数的用处不大。
  • @smwikipedia: 检查objdump -W /tmp/ccLoxO8q.ltrans0.ltrans.o
  • @smwikipedia:至于汇编,它可以以不能表达为函数的方式构造。例如,你不能调用 C 函数的中间; C 函数只有一个入口点。汇编只是一个指令序列,您可以跳转到该序列中的任何点。在 x86 中,甚至没有限制您跳转到实际指令边界!
  • @smwikipedia:嗯,您当然可以使用.segment .text.MyAssemblyFoo 在您的程序集中手动创建部分。这就是装配的双刃剑:您可以手动完成所有操作,而您必须手动完成所有操作。
【解决方案2】:

gcov 是您正在寻找的。你在问题中列出了,你没有看吗?

【讨论】:

  • 并非如此,“gcov 创建了一个名为 sourcefile.gcov 的日志文件,它指示源文件 sourcefile.c 的每一行执行了多少次。”这是动态分析,不是静态的。
猜你喜欢
  • 1970-01-01
  • 2014-05-13
  • 2017-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多