我希望使用我将使用Soot框架构建的调用图来执行一些依赖分析。我在一份指南中读到,使用“指向”分析可以提高调用图的精度。什么是“点对点”分析?它如何提高调用图的准确性?
发布于 2011-07-21 06:42:57
理解数据流的一个关键问题是知道每个指针可以引用的日期。如果您对指向对象的指针一无所知,而该对象是通过指针(例如,p.=3)更新的,那么整个系统中的任何对象都有可能被修改。如果您知道p引用了一个特定的对象O1,那么您就知道只有O1可以被修改。因此,了解p可以指向什么,对于理解副作用和此类效应的范围很重要。
现在,假设你有指向函数的指针。如果您不知道函数指针p指向什么,而函数调用是通过p间接进行的,那么任何函数都可能被调用,其副作用可能是任何函数的任何副作用。如果您知道p只能指向foo,那么只会发生foo可能导致的副作用。
在计算调用图时,一些函数调用显然只去一个地方。有些函数调用可以转到不同的地方,因为它们实际上是通过指针进行的函数调用;OO语言中的“方法”调用通常是这样的,这是为了支持多态性。
如果你不做点对点分析,你就不可能做函数--指针点--对点分析。这意味着您构建的调用图表明,节点栏可能会通过其指针p调用许多可能的函数,这意味着您必须担心许多副作用。
精确的点到点分析导致精确的功能点到点分析,这导致精确的副作用分析,这导致更好地理解代码可以做什么。当然,精确度是相对的;而且很难得到“非常精确”的点来进行分析。在极限中,不可能得到完美的点到点分析;您正在分析图灵机。
您可以在http://www.semdesigns.com/Products/DMS/FlowAnalysis.html上看到有关流分析的更多讨论和一个“更精确”的调用图示例
https://stackoverflow.com/questions/6768809
复制相似问题