【问题标题】:Tool to list callers of a function in C?列出C中函数调用者的工具?
【发布时间】:2011-11-10 19:00:12
【问题描述】:

背景:
在一个特定的项目中,数百个文件中有大约几千个函数。这些函数被划分为驻留在两个代码内存库中 - fast_mem 和 slow_mem。但是现在,由于 fast_mem 区域是有限的,它的空间已经不足以容纳任何新的代码更改。

作为代码审查的一部分,我们发现 fast_mem 中的一些函数没有调用者。但是函数列表太大,无法手动一一检查。

问题:
那么问题来了,有没有一个工具可以列出项目中所有函数的调用者呢?有了这个,我可以继续删除 fast_mem 中没有任何调用者的函数。

我使用 cscope 和 ctags 进行代码浏览。但这需要手动输入函数名称。这可以自动化一些如何获取完整列表吗?
我还尝试了 Doxygen 的调用者图表功能。结果用起来不太舒服。

【问题讨论】:

  • 好吧,总是有“穷人”的方式:删除所有的fast_mem函数,编译,查看链接错误中未解析的符号列表,把那些函数返回,重复。

标签: c doxygen cscope


【解决方案1】:

我使用 Scientific Toolworks Understand

【讨论】:

    【解决方案2】:

    如果您的编译器是最新的 GCC(或者如果您可以切换到 GCC 4.6,可能作为交叉编译器),您可能会开发一个 GCC 插件或MELT 扩展来找出答案。

    当然,如果您是使用函数指针进行技巧(例如函数指针上的不可移植指针算术)最初的问题是不确定的。

    实际上,如果您使用函数指针,通常唯一合理的说法是它们只能访问具有相同签名的函数。

    也许该项目足够重要,因此定制编译器以在fast_memslow_mem 之间做出更好的(自动或半自动)权衡是值得的。这通常是 GCC 插件或 MELT 扩展的绝佳案例(但这需要一些工作——几天或几周,而不是几小时——因为您需要了解内部 GCC 表示来自定义 GCC),并且您可能是唯一一个可以这样做(因为您的问题对于某些奇怪的系统来说非常特殊)。

    【讨论】:

      【解决方案3】:

      让我们假设没有任何奇怪的函数指针游戏正在进行。然后你可以打破使用不足的cflow:

      http://www.gnu.org/software/cflow/

      使用 -r 标志生成“反向索引”。您将获得每个函数的列表,然后是调用它的位置。你可以喂它多个文件。

      【讨论】:

        【解决方案4】:

        您可以使用cppcheck 等静态代码分析工具。 如果您使用--enable=unusedFunction 参数调用它,它将警告未使用的函数。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-05
          相关资源
          最近更新 更多