1

我希望使用我将使用 Soot 框架构建的调用图来执行一些依赖关系分析。我在指南中读到使用“指向”分析可以提高调用图的精度。究竟什么是“指向”分析,它如何提高调用图的准确性?

4

1 回答 1

1

理解数据流的一个关键问题是知道每个指针可以引用什么日期。如果您对指向对象的指针一无所知,并且该对象是通过指针更新的(例如,p.=3),那么整个系统中的任何对象都可能被修改。如果您知道 p 引用了一个特定的对象 O1,那么您就知道只有 O1 可能被修改。因此,了解 p 可以指向的内容对于理解副作用和此类影响的范围很重要。

现在,假设您有指向函数的指针。如果你不知道函数指针 p 指向什么,并且函数调用是通过 p 间接进行的,那么任何函数都可能被调用,副作用可能是任何函数的任何副作用。如果您知道 p 只能指向 foo,那么只会发生 foo 可能导致的副作用。

在计算调用图时,一些函数调用显然只去一个地方。一些函数调用可以去到不同的地方,因为它们实际上是通过指针的函数调用;OO 语言中的“方法”调用通常是这样的,这样做是为了支持多态性。

如果您不进行指向分析,则不可能进行函数指针指向分析。这意味着您构建的调用图表明节点栏可能通过其指针 p 调用许多可能的函数,这意味着您必须担心许多副作用。

精确的指向分析导致精确的功能指向分析,从而导致精确的副作用分析,从而更好地理解代码可以做什么。当然,精度是相对的;并且很难获得“非常精确”的分析点。在极限情况下,不可能得到完美的点分析;您正在分析图灵机。

您可以在http://www.semdesigns.com/Products/DMS/FlowAnalysis.html上看到更多关于流量分析的讨论和“更精确”的调用图示例

于 2011-07-20T22:42:57.243 回答