调用图如何解析函数指针?

时间:2010-12-04 17:20:38

标签: c function-pointers call-graph objdump

我正在使用perl脚本为C实现调用图程序。我想知道如何使用'objdump'的输出来解决函数指针的调用图? 不同的调用图应用程序如何解析函数指针? 函数指针是在运行时解析还是可以静态完成?

修改 调用图如何解决程序静态评估中的循环?

2 个答案:

答案 0 :(得分:2)

当call语句明确提到B时,很容易构建A-calls-B的调用图。正如你所注意到的那样,处理间接调用要困难得多。

好的静态分析工具通过使用各种各样的程序数据流(程序间和程序内[“全局”])传播指针赋值/副本/算术来形成指针变量内容的估计计划,通常是保守的(“你得到太多”)。

如果没有这样的估计,你就无法知道指针包含什么,因此根本无法做出有用的预测(好吧,你可以使用最终的保守估计它会去任何地方,但我想你已经拒绝了解)。

我们的DMS Software Reengineering Toolkitstatic control/dataflow/points-to/call graph analysis已应用于大型系统(~~ 2500万行)的C代码,并生成此类调用图。这样做的机器 非常复杂,但您可以在编译器文献的高级主题中找到它。我怀疑你想在Perl中实现它。

当您拥有源代码时,这会更容易,因为您至少可靠地知道什么是代码,什么不是。您试图在目标代码上执行此操作,这意味着您甚至无法消除数据。

答案 1 :(得分:1)

使用函数指针是一种选择在运行时调用的实际函数的方法,因此通常不可能知道静态实际发生了什么。

但是,您可以查看可能调用的所有函数,并以某种方式显示这些函数。回调通常具有足够独特的签名(并非总是如此)。

如果你想做得更好,你必须分析源代码,看看哪些函数被分配给指针开始。