一种基于离线约束图的指针分析方法

文档序号:9826130阅读:368来源:国知局
一种基于离线约束图的指针分析方法
【技术领域】
[0001 ]本发明属于静态程序分析领域,涉及一种指针分析方法。
【背景技术】
[0002]指针分析是一种静态程序分析技术,它的目标是静态确定一个指针变量能够指向哪些地址(变量或函数的存储位置),也就是静态确定一个指针变量在程序运行时所有可能的值。指针分析以程序源代码(或某种中间代码表示)作为输入,输出该程序所包含的指针指向信息。由于指针(引用)在C/C++(Java)程序中被广泛使用,许多静态程序分析技术需要根据指针指向信息来解析程序中包含的间接引用,指针分析的结果直接影响其它静态程序分析技术的有效性,指针分析作为许多静态程序分析技术的使能技术一直是一项重要的议题。
[0003]目前软件系统和工业级源代码库的规模越来越大(如数百万代码行甚至数千万代码行),对于动态性较弱、使用指针较少、规模较小的程序,现有的指针分析技术已经较为成熟,可以很好地分析处理这些程序。然而,对于规模更大、动态性更强的程序,现有指针分析算法还存在许多问题,需要进一步地研究:(I)如何在不影响指向信息精度的条件下,提高指针分析算法的效率和可扩展性;(2)如何提高指针分析算法的精度,同时尽可能地保证算法的效率和可扩展性;(3)如何设计适用于并发程序的指针分析算法等。
[0004]在设计一个指针分析算法时,首先需要对程序的元素(如程序语句,函数,结构体等)进行建模,这些建模策略也被称为分析维度;如流敏感性,上下文敏感性,域敏感性等。从理论上来说,精确的指针分析是非常困难的:当允许动态内存分配时,过程内流敏感指向分析是不可判定的;当不允许动态内存分配时,过程内流敏感指向分析是PSPACE-完全问题;当不允许动态内存分配时,对于包含任意数目指针间接访问操作符的程序来说,流不敏感指向分析是NP-Hard问题。这些复杂性结论表明现有的指针分析算法都是近似算法,都需要在算法的精度、效率和可扩展性之间进行折衷。
[0005]流敏感性和上下文敏感性是两个独立的分析维度;流敏感性关注的是分析算法如何处理函数内的控制流信息:流敏感分析和流不敏感分析;上下文敏感性侧重的是分析算法如何处理函数间的调用信息:上下文敏感分析和上下文不敏感分析。一个指针分析算法根据其处理函数内的控制流信息时所采取的策略可以被划分为流敏感分析或流不敏感分析;同时根据其处理函数间调用信息时所使用的策略可以被划分为上下文敏感分析或上下文不敏感分析。因此,同时考虑流敏感性和上下文敏感性,现有的指针分析算法将被划分成以下四类:流不敏感上下文不敏感算法、流不敏感上下文敏感算法、流敏感上下文不敏感算法、流敏感上下文敏感算法。
[0006]总的来说,基于合并的流不敏感上下文不敏感算法(Steensgaard指针分析)具有较好的效率和可扩展性(scalability),但是指针分析的精度很差;基于包含的流不敏感上下文不敏感、流敏感上下文不敏感算法和流敏感上下文敏感算法具有更好的精度,但是指针分析过程的效率和可扩展性将会变得很差。为了在算法的精度、效率和可扩展性之间获得一个较好的折衷,基于包含的流不敏感上下文不敏感算法一直是指针分析领域的研究热点之一O
[0007]对基于包含的流不敏感(上下文不敏感)指针分析算法的研究主要是围绕如何设计有效的在线循环检测技术,因为在线循环检测技术能够在不影响指向信息精度的条件下,显著地提高基于包含的指针分析算法的效率和可扩展性。
[0008]对基于包含的流不敏感(上下文不敏感)指针分析算法来说,在线循环检测过程需要被多次触发;因此,在设计在线循环检测技术时就存在一个难点:如何确定在线循环检测的频度来控制指针分析算法的开销,也就是说,在约束求解的过程中,决定什么时候触发循环检测。在确定在线循环检测的频度时存在两个极端:一方面,如果每添加一条有向边到约束图中,约束求解算法就触发一次循环检测;在这种情形下,很多循环检测过程是不必要的,因为约束图此时并没有形成循环,过早触发循环检测将产生大量不必要的时间开销用于搜索约束图;另一方面,如果约束求解算法没有及时触发循环检测,也就是说,有向边不断地被加入到约束图中,约束图存在很多未被检测出来的循环;在这种情形下,结点的指向信息将沿着这些循环被冗余传播。没有及时触发循环检测将会影响算法的效率以及会减少循环检测和合并本身所带来的收益。因此,在设计一个在线循环检测技术来改进基于包含的指针分析算法时,设计者需要在循环检测的开销和指向信息沿着未被检测出来的循环被冗余传播的开销之间做出权衡,从而提高基于包含的指针分析算法的效率和可扩展性。不同的在线循环检测技术代表了对基于包含的指针分析算法的不同改进。
[0009]Hardekopf等人提出了一种有趣的在线循环检测技术LCD ( I az y cycledetect1n),Hardekopf等人基于这种在线循环检测技术实现了一个基于包含的指针分析算法,称为LCD算法。LCD基于如下策略进行在线循环检测:在沿着有向边进行指向信息传播之前,LCD首先判断这条有向边的源结点和目的结点是否具有相同的指向集;如果这两个结点具有相同的指向集,LCD认为此时约束图中存在一个循环,并触发深度优先搜索过程去寻找约束图中存在的循环。LCD来源于这样一个想法:因为在指针分析算法终止时,同一个循环中的结点将具有相同的指向集;所以,当有向边的两个结点具有相同的指向集时,约束图中很可能存在循环。LCD的优点在于:与其它在线循环检测技术相比,LCD采用的循环检测策略是惰性的,也就是说,只有在约束图中非常可能存在循环的情况下,LCD才会触发循环检测。这种在线循环检测策略极大地降低了在线循环检测过程本身的开销,实验结果表明,与其它在线循环检测技术相比,LCD的实际效果很好。LCD的缺陷在于:(I)这种在线循环检测策略的有效性依赖于这样一个假设:有向边的两个结点具有相同的指向集通常是因为这两个结点在同一个循环中。如果上述假设经常不成立,LCD的在线循环检测策略将导致LCD在约束图中不存在循环的情况下去搜索约束图,这将极大地影响指针分析算法的效率;(2)对SPEC2000测试集,绝大多数LCD触发的深度优先搜索过程是没有发现循环的(平均99.7 % ),也就是说,LCD触发的深度优先搜索过程绝大多数是多余的,只有极少数的优先搜索过程能够发现并合并循环。因此,LCD的效率可以被进一步地提高,如果可以显著地减少上述LCD触发的多余的深度优先搜索过程。由于在线循环检测策略能够显著地提高基于包含的流不敏感指针分析算法的效率和可扩展性,因此,如何设计更有效的在线循环检测策略(包括如何进一步改进IXD)仍然是个热点,值得进一步深入研究。

【发明内容】

[0010]技术问题:本发明针对基于包含的指针分析算法LCD存在的不足,提供一种能够在不影响指向信息精度的前提下提高指针分析的效率的基于离线约束图的指针分析方法ADD。
[0011]技术方案:本发明的基于离线约束图的指针分析方法ADD,包括以下步骤:
[0012](I)根据输入约束集,构造离线约束图;
[0013](2)在所述离线约束图中触发一次深度优先搜索,得到一个有向无环图和多个循环,并记录循环信息;
[0014](3)在所述有向无环图中,根据结点的拓扑序计算每个结点的祖先集和后裔集;同时在所述有向无环图中,利用Lengauer and Tarjan算法计算该图对应的支配树或支配森林;
[0015](4)在所述支配树或支配森林中,计算指针等价的顶层变量对信息;<
当前第1页1 2 3 4 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1