摘要:
1. 本文的创新点
(1) 本文中的算法可以同时结合需求驱动分析的效率和流敏感、上下文敏感指针分析的精度,在静态检查的精度和效率之间找到一个较好的平衡点。由于采用了需求驱动的检查方式,使用者可以指定感兴趣的语句,检查它是否引发内存泄漏错误。在分析的时候,只考虑那些影响当前语句的语句和信息,避免了不必要的计算。
(2) 为了利用流敏感的信息,我们定义了表达式的l-value location set和accessed location set。前者包含了保存表达式值的所有可能的location set,后者则包含那些为了得到l-value location set所必需访问的location set。
(3) 使用流敏感、上下文敏感的指向图,我们提出了一种降低数据流事实中的region set增长的策略。Region set中包含了所有可能指向被泄漏内存的location set。这可以降低数据流事实在格上偏序链中的上升速度,从而避免了过早地得到格中的顶值,有助于提高生成矛盾信息的可能性,降低误报率。而在类似的工作中,region set是不断增长的。
(4) 在定义迁移函数时,利用每个程序点上的指向图可以预知语句执行之前的一些状态信息,从而可以得到更多的推理规则来证明内存泄漏的不存在,有利于提高检测的精确度,提早结束算法。
2. 实现方法
本文中的算法在SUIF2编译平台下实现。主要可分为过程内分析和过程间分析两大部分。在过程内分析中,首先需要根据假设计算出初始的数据流事实,然后定义不同语句的迁移函数,利用数据流分析算法计算出每个程序点上对应的数据流事实的不动点。在过程间分析中,需要给出如何把数据流信息从调用过程空间映射入被调用过程空间,以及如何从被调用过程空间映射回调用过程空间。实现步骤如下:
(1) 利用编译前端SUIF2把一个C语言项目编译为以SUIF格式所表示的文件。
(2) 针对第一步编译前端所生成的中间文件,应用流敏感、上下文敏感的指针分析算法,例如SPAN,在每条语句所关联的程序点上生成一个指向图,该指向图以注释的形式附加于中间文件中。
(3) 把第二步所生成的中间文件和待检查的语句输入到本文的具体算法中去。首先在被测语句处生成初始化信息,然后从初始化信息出发,做后向的数据流分析,此过程包含了两个交替执行的分析模块——过程间分析模块和过程内分析模块。最后报出待检查的语句是否引发了内存泄漏错误。
3.结论及未来待解决的问题
指针分析的精度影响了基于它的内存泄漏检测算法的精度,需求驱动式的数据流分析算法比较适合于内存泄漏错误的检测。我们结合流敏感、上下文敏感的指针分析算法和需求驱动式的检测,设计了一种新的内存泄漏检测算法。该算法被应用于若干C语言的基准程序和一些常用C语言包中的程序,包括SPEC2000中和xen包中的程序,找到了一些真实的内存泄漏错误,有的错误在以前类似的检测算法中没有找到。
下一步的工作中,我们将研究采用何种方法来区分数组中的不同元素,这将大大提高检测算法的精度。另外,如何在静态分析算法中结合动态分析方法和其他的一些形式化方法,以提高效率和精度,是一个值得深入研究的问题。
4.实用价值或应用前景
本文中的算法具有很强的实用性,我们已经把它应用于一些比较常见的C程序中内存泄漏错误的检测中。鉴于C语言仍然是一种应用十分广泛的语言,内存泄漏也是一种重要而难以检测的错误,我们现在的算法实现再经过若干的改进,将可以作为一个实用的内存泄漏工具而应用于开发过程中。