[发明专利]空指针检测方法有效
申请号: | 201811373522.0 | 申请日: | 2018-11-16 |
公开(公告)号: | CN109522232B | 公开(公告)日: | 2021-10-22 |
发明(设计)人: | 胡凇源;周晓聪;衣杨 | 申请(专利权)人: | 中山大学 |
主分类号: | G06F11/36 | 分类号: | G06F11/36 |
代理公司: | 北京超凡志成知识产权代理事务所(普通合伙) 11371 | 代理人: | 吴开磊 |
地址: | 510000 广东*** | 国省代码: | 广东;44 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 指针 检测 方法 | ||
本发明提供一种空指针检测方法,涉及静态分析技术领域。具体包括:获取待分析程序的控制流图;获取所述控制流图中的所有节点;沿着所有可能的路径,遍历所述控制流图中的所有节点,获取每个所述节点内待检测的变量值与到达条件;遍历至所述控制流图出口节点时,结合所述出口节点的变量的值与到达条件,确定返回的变量值是否为空。相对于现有技术,通过与定值到达条件的结合,可以有效去除掉定值不可能到达的情况,提高了到达定值分析给出的结论准确度不高的问题。
技术领域
本发明涉及静态分析技术领域,具体而言,涉及一种空指针检测方法。
背景技术
所谓变量,是计算机编程语言中的一种存储计算机内存中某个值的内存地址的对象。而所谓空变量,则是指该变量存储的内存地址是非法的。
目前,C/C++与Java等程序语言依然是当今主流计算机编程语言,这些语言编写的程序在运行时,经常会由于使用空变量导致程序出错甚至停止运行。为了防止这种情况的发生,常见的做法是在解引用变量以前,对变量是否为空进行检测。目前已有的文献表明,在众多Java开源项目中,有超过三分之一的条件表达式是空值检测,而在所有的空值检测表达式中,有高达70%是对函数调用的返回值进行检测。其中,主要采用传统的到达定值分析来检测空值。
但是在实际工程中,有时候开发人员并不能真正知道一个对象是否有可能是空值,这种情况在对象被一个函数调用返回赋值的时候尤为突出。然而传统的到达定值分析是路径不敏感的,即到达某一点的定值可能不同,而不同的定值到达该点的条件可能不同。因此,对于已经针对返回值进行检测的函数而言,传统到达定值分析给出的结论准确度不高。
发明内容
本发明的目的在于提供一种空指针检测方法,其能够解决现有技术中到达定值分析给出的结论准确度不高的问题,通过与定值到达条件的结合,可以有效去除掉定值不可能到达的情况。
本发明的实施例是这样实现的:
本发明实施例的一方面,提供一种空指针检测方法,包括:
获取待分析程序的控制流图;
获取所述控制流图中的所有节点;
沿着所有可能的路径,遍历所述控制流图中的所有节点,获取每个所述节点内待检测的变量值与到达条件;
遍历至所述控制流图出口节点时,结合所述出口节点的变量的值与到达条件,确定返回的变量值是否为空。
进一步地,所述沿着所有可能的路径,遍历所述控制流图中的所有节点,获取每个所述节点内待检测的变量值与到达条件,包括:
计算所述节点n的入函数In(n),其中n为大于零的整数,且小于或等于待分析程序的控制流图中所有节点的数量;
扩展所述节点n的生成条件定值,并获取扩展后的生成条件定值;
筛选所述扩展后的生成条件定值,并删除未通过筛选的条件定值;
分析剩余的条件定值,确定所述节点n的变量值与对应的条件定值。
进一步地,所述沿着所有可能的路径,遍历所述控制流图中所有节点,获取每个所述节点内待检测的变量值与到达条件之前,还包括:
初始化所述待检测变量对应入口节点的入函数In(n)和出函数Out(n),其中,所述待检测变量对应的所有节点中除所述入口节点外,其余节点的In(n)和Out(n)均为空集。
进一步地,所述筛选所述扩展后的生成条件定值,并删除未通过筛选的条件定值之后,还包括:
将通过筛选的条件定值加入到Out(n);
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于中山大学,未经中山大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201811373522.0/2.html,转载请声明来源钻瓜专利网。