[发明专利]一种充分检测空指针引用缺陷的方法有效
申请号: | 201310141769.0 | 申请日: | 2013-04-22 |
公开(公告)号: | CN103218296A | 公开(公告)日: | 2013-07-24 |
发明(设计)人: | 金大海;宫云战;董玉坤;王雅文;黄俊飞 | 申请(专利权)人: | 北京邮电大学 |
主分类号: | G06F11/36 | 分类号: | G06F11/36 |
代理公司: | 北京派特恩知识产权代理事务所(普通合伙) 11270 | 代理人: | 张振伟;王黎延 |
地址: | 100876 *** | 国省代码: | 北京;11 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 充分 检测 指针 引用 缺陷 方法 | ||
技术领域
本发明涉及软件静态测试技术中的空指针检测技术,尤其涉及一种充分检测空指针引用缺陷的方法。
背景技术
软件测试是一种保障软件质量的过程,其根本目的是通过一些经济有效的方法,以尽可能少的时间和人力去发现软件中存在的各种缺陷,进而保证软件的质量。对于软件测试,从基于是否需要运行被测软件的角度来分类,软件测试分为动态测试和静态测试,其中,静态测试也称为静态分析。静态测试不实际运行被测软件,而是扫描源应用,从中找出可能导致错误的结构异常、控制流异常及数据流异常等情况。静态测试相较动态测试而言,具有成本低、容易实现、能覆盖所有路径,且不依赖于特定的运行环境的优点;其缺点是发现的问题往往不是真正的问题,需要人工确认排查。
现有的静态测试方法存在大量误报或漏报情况。而误报的存在需要人工确认以排除;漏报的存在会造成应用具有较高质量的假象,但是,漏报的缺陷一旦在软件运行时被触发,可能导致不可预测的不良后果。
目前,具有代表性的代码缺陷静态测试工具主要有斯坦福大学的研究项目Metal、马里兰大学研发的Java应用静态测试工具FindBugs、开源的Java应用静态测试工具PMD、美国Klocwork公司研发的代码缺陷检测工具K8。
但通过使用上述测试工具对空指针引用进行测试,均会存在不同程度的误报及漏报情况。因此,如何降低空指针引用缺陷的误报率和漏报率,是目前亟需解决的问题。
发明内容
有鉴于此,本发明的主要目的在于提供一种充分检测空指针引用缺陷的方法,不但解决了空指针引用缺陷的漏报问题,而且能够实现对空指针引用缺陷的零漏报及低误报。
为达到上述目的,本发明的技术方案是这样实现的:
本发明提供了一种充分检测空指针引用缺陷的方法,所述方法包括:
读取被测应用文件,对被测应用进行词法分析和语法分析,生成被测应用的抽象语法树,根据所述抽象语法树生成反映被测应用控制结构的控制流图,并根据所述抽象语法树创建被测应用的符号表系统及类型系统,基于抽象语法树识别出被测应用的全部可寻址表达式;
根据所述控制流图对被测应用进行保守的区间运算与指针分析,并根据区间运算与指针分析的结果,生成函数摘要;
根据所述函数摘要以及抽象语法树识别出全部的指针引用以及被引用的指针,并对每个被引用的指针创建空指针引用缺陷状态机实例;
基于所述控制流图运行空指针引用缺陷状态机实例,对于所述控制流图的每个节点,根据区间运算、指针分析的结果对每个缺陷状态机实例分别进行状态迁移,并确定空指针引用集合、安全指针引用集合、不确定的指针引用集合。
上述方案中,所述基于抽象语法树识别出被测应用的全部可寻址表达式,包括:
基于抽象语法树识别出被测应用的所有定义的符号以及所有使用的可寻址表达式。
上述方案中,所述基于抽象语法树识别出被测应用的所有使用的可寻址表达式,包括:
从抽象语法树上的后缀表达式节点识别所有使用的后缀表达式;
从抽象语法树上的一元表达式节点识别所有使用的指针引用表达式。
上述方案中,所述根据控制流图对被测应用进行保守的区间运算与指针分析,包括:
A1、根据控制流图产生时的节点号顺序,取控制流图中的下一个节点作为当前节点,并在所述当前节点为最后一个节点时,结束当前处理;否则执行步骤A2;
A2、对所述当前节点上第一次出现的变量,用基于抽象内存区域的四元模型<Variable,Region,Expression,Domain>对所述变量进行建模,并根据所述变量的类型进行初始操作,并设置初始区间值;若变量的类型是指针,则设置所述变量指向集合为空;其中,Variable为被建模的所述变量,Region为为所述变量分配的抽象内存区域,Expression为符号表达式,Domain为取值区间;
A3、对所述当前节点的前驱节点上出现的除作用域的指针之外的每一个指针,确定每一个指针在所述当前节点的所有前驱节点上的指向集合的并集,得到指针在所述当前节点上的初始指向集合;其中,所述作用域为符号表系统中的作用域;
A4、对所述当前节点的前驱节点的除作用域的变量之外的每一个变量,确定每一个变量在所述当前节点的所有前驱节点上的取值区间的并集或区间集的并集,得到变量在所述当前节点上的初始取值区间或初始区间集;判断在所述当前节点上是否存在某个变量的初始取值区间或初始区间集为空,若存在,则标记该节点为矛盾节点,执行步骤A1;若不存在,则执行步骤A6;
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于北京邮电大学,未经北京邮电大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201310141769.0/2.html,转载请声明来源钻瓜专利网。
- 上一篇:一种混合对讲方法及系统
- 下一篇:一种四面取暖的多功能电暖桌