列出C语言函数调用者的工具?

3

背景:
在一个特定的项目中,有几千个函数分布在一百多个文件中。这些函数被划分为两个代码存储区域 - fast_mem和slow_mem。但是现在,由于fast_mem区域有限,在容纳任何新代码更改方面已经用完了空间。

作为代码审查的一部分,发现一些位于fast_mem中的函数没有调用者。但函数列表太长,无法进行手动检查。

问题:
那么,问题来了,有没有工具可以列出项目中所有函数的调用者?有了这个,我就可以去掉在fast_mem中没有调用者的函数。

我使用cscope进行代码浏览,还有ctags。但这需要用户手动输入函数名称。是否能自动化以获取完整列表?
我也尝试过Doxygen和它的caller graph功能。但结果不太好用。


2
好吧,总有一种“穷人”的方法:删除所有的fast_mem函数,编译,查看链接错误中未解决的符号列表,然后将这些函数放回去,重复此过程。 - Nemo
4个回答

0

0

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

当然,如果您正在使用函数指针技巧(例如在函数指针上进行不可移植的指针算术运算),原始问题是不可判定的。

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

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


0

假设没有任何奇怪的函数指针游戏正在进行。那么你可以使用不常用的cflow:

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

使用-r标志生成“反向索引”。您将获得每个函数的列表,后跟其被调用的位置。您可以将多个文件输入其中。

0
你可以使用静态代码分析工具,比如 cppcheck。 如果你加入参数 --enable=unusedFunction ,它会警告未被使用的函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接