我正在使用 perl 脚本为 C 实现调用图程序。我想知道如何使用“objdump”的输出来解析函数指针的调用图?不同的调用图应用程序如何解析函数指针?函数指针是在运行时解析还是可以静态完成?
编辑 调用图如何解决程序静态评估中的循环?
我正在使用 perl 脚本为 C 实现调用图程序。我想知道如何使用“objdump”的输出来解析函数指针的调用图?不同的调用图应用程序如何解析函数指针?函数指针是在运行时解析还是可以静态完成?
编辑 调用图如何解决程序静态评估中的循环?
使用函数指针是一种选择在运行时调用的实际函数的方法,因此一般来说,不可能知道静态实际会发生什么。
但是,您可以查看所有可能调用的函数,并可能以某种方式显示它们。回调通常具有足够独特的签名(并非总是如此)。
如果你想做得更好,你必须分析源代码,看看哪些函数被分配给了指针。
当调用语句明确提到 B 时,很容易构建 A-calls-B 的调用图。正如您所注意到的,处理间接调用要困难得多。
好的静态分析工具通过使用各种方案(通常是保守的(“你得到太多”)。
如果没有这样的估计,您将无法知道指针包含什么,因此根本无法做出有用的预测(好吧,您可以使用最终的保守估计它会去任何地方,但我认为您已经拒绝了该解决方案)。
我们的DMS Software Reengineering Toolkit具有静态控制/数据流/指向/调用图分析,已应用于庞大的 C 代码系统(~2500 万行),并生成了此类调用图。执行此操作的机制非常复杂,但您可以在编译器文献的高级主题中找到它。我怀疑你想在 Perl 中实现这个。
当您拥有源代码时,这会更容易,因为您至少可以可靠地知道什么是代码,什么不是。您试图在目标代码上执行此操作,这意味着您甚至无法消除数据。