一种基于子图搜索的指针相关语义错误定位方法技术

技术编号:13120397 阅读:169 留言:0更新日期:2016-04-06 09:55
一种基于子图搜索的指针相关语义错误定位方法,(1)根据失败的测试用例的输入,对程序进行符号执行,记录源程序在这一输入下的执行轨迹,各个程序状态和指针相关的复杂结构的RDF文件;(2)根据执行轨迹,从程序中变量的值与期望值不一致的断点处,反向对程序轨迹中的每一个语句生成定位方程组和SPARQL查询文件;(3)通过二分法反向找到使得定位方程组或SPARQL查询无解的第一个语句,由断点到此语句之间的与断点变元相关的语句构成了一个极小程序片段;(4)用户可以再次输入片段中变量在某个状态下的预期值,在此程序片段中再次定位错误所在的程序片段,不断重复这一交互过程,直到得到的程序片段足够小,能够精确地定位到错误。

【技术实现步骤摘要】

本专利技术涉及一种C语言过程内的自动化错误定位方法,尤其涉及一种主要针对指 针语义相关错误的,基于子图搜索的自动化错误定位方法。 专利技术背景 据统计,在使用到指针和动态内存的软件系统中,50 %的软件故障与指针及动态 内存的管理有关。目前对于指针错误定位的研究主要分为两方面:一方面是对指针分析算 法的研究,主要用来确定一个指针可能指向的内存地址集或一块内存可能被操作的别名 集。由于这样的分析通常是不可确定的,因此已有的指针分析算法往往是近似的。另一方 面,一些指针分析工具主要分析特定类型的指针错误,如空指针引用、内存泄露、指针未初 始化等安全方面的隐患。目前,针对指针的语义错误的定位方法的相关研究较少。在大型C/C++程序中,尤其是图和树等复杂结构中,指针的应用十分广泛。而在这 种复杂结构中,一旦出现错误,往往需要手动调试,且效率低下。
技术实现思路
本专利技术的技术解决问题:克服现有技术的不足,提供一种基于子图搜索的指针相 关语义错误定位方法,它能根据子图搜索的方法实现树或图等复杂结构中的指针相关语义 错误的自动定位,相比于传统的别名分析算法,具有更高的准确性。 本专利技术的技术解决方案:,其特 征在于步骤如下: (1)根据失败的测试用例的输入,对程序进行符号执行,记录源程序在这一输入下 的执行轨迹,各个程序状态和指针相关的复杂结构的RDF文件; (2)根据执行轨迹,从程序中变量的值与期望值不一致的断点处,反向对程序轨迹 中的每一个语句生成定位方程组和SPARQL(简单协议和RDF查询语言)查询文件; (3)通过二分法反向找到使得定位方程组或SPARQL查询无解的第一个语句,由断 点到此语句之间的与断点变元相关的语句构成了一个极小程序片段; (4) -次定位到的程序片段通常范围较大,用户可以再次输入片段中变量在某个 状态下的预期值,在此程序片段中再次定位错误所在的程序片段,不断重复这一交互过程, 直到得到的程序片段足够小,能够精确地定位到错误。 根据本专利技术的又一个方面,其中步骤(1)进一步包括步骤: (a)根据语句类型,包括赋值语句、顺序语句、条件语句、循环语句和空语句,采用 不同的操作语义规则生成执行轨迹; (b)将树或图等复杂结构转换为以XML形式表示的RDF文件;根据本专利技术的又一个方面,其中步骤(2)进一步包括: (a)判断当前语句中是否含有指针变量操作,如果有,转向(b),如果没有,转向 (c); (b)根据当前语句的类型,采用不同操作语义为该语句生成新的SPARQL查询,该语 句的定位方程组不更新,与执行轨迹中的后一条语句的定位方程组相同; (c)根据当前语句的类型,采用不同操作语义,包括状态初始化、赋值语句、条件语 句、循环语句、输入,为该当前语句生成新的定位方程组,该当前语句的SPARQL查询不更新。 根据本专利技术的又一个方面,其中步骤(3)进一步包括: (a)使用Z3求解器判断定位方程组是否有解;Z3是微软研发的一款可以针对可满 足性模理论(SMT的中文翻译)问题进行高效计算的求解器,被广泛应用于软件验证和软件 分析领域,我们使用Z3的动态链接库实现方程组求解; (b)使用Apache Jena API生成求解SPARQL查询的插件,以RDF文件和SPARQL文件 作为输入,求解RDF中是否存在满足SPARQL中约束的子图,如果不存在,则表示无解。Apache Jena是一个开源的Java框架,用于建立语义网和关联数据应用,其提供了支持SPARQL查询 的相关接口。 本专利技术与现有技术相比的优点在于:本专利技术考虑C语言中指针语义相关的错误定 位,通过子图搜索的方法实现树或图等复杂结构中的指针相关语义错误的自动定位,相比 于传统的别名分析算法,具有更高的准确性。【附图说明】 图1为本专利技术的算法基本流程图; 图2为本专利技术的指针赋值语句的处理流程图;图3为本专利技术的条件语句处理流程图; 图4为本专利技术的模拟节点访问语句处理流程图。【具体实施方式】 下面参考附图,对本专利技术的实施例进行详细的说明。首先对本专利技术的算法原理进行说明。 函数内调试形式化的基本思路是:当程序出现了一个失败的测试用例时,根据用 户预期的程序输入和输出,从程序中找出与用户预期矛盾的极小程序片段。若此程序片段 仍然较大,则通过不断的与用户交互,让用户标记其中正确的语句或者让用户进一步给出 片段中变量在某些状态下的预期值,利用这些新的信息缩小语句片段的范围,直到最终定 位到程序中的一个错误。 具体而言,本专利技术所提出的改进算法基本流程如图1所示。 本专利技术主要包括的核心思想:根据程序的执行轨迹和期望值,反向为每条执行语 句生成定位方程组和SPARQL查询,主要通过定位方程组表示普通变量间的约束关系,以 SPARQL查询表示指针间的依赖关系,通过求解定位方程组和SPARQL查询得到第一条无解的 语句,从而推断出包含错误的极小程序片段。在描述算法前先定义如下变量及方法: 1 .设状态〇为语句S执行时的状态,用k-元组σ.:(? η %,…,η 乂)表示,其中 ·' ρ ?,表示变量Xi的值为m; 2.状态#记录了为语句S生成SPARQL查询时,程序中的指针变量Pi到其在SPARQL中 表示变量ri的映射,由于SPARQL语法规定所有查询变量是以问号开头的字符串,因此需要 此指针状态表进行映射。〇-外 H 4D,Pi4ri,ieN,PV={pi,'",pk},AD={ri^",rk}; PV表示程序中相关的指针变量的集合,AD表示这些指针变量在SPARQL查询中所映 射的变量集合。表示指针变量Pi在SPARQL查询中用ri表示。 3.令S为一个if语句或while语句的头语句,如if(b),〇为语句S执行时的状态,二 元组〈S, 〇>被称为一个B-环境。用ε表示B-环境栈,其中每个元素都是一个B-环境; 4.三元组〈S,σ,σ*,ε>为一个S*_结构,π为轨迹栈,π中每个元素都是S*_结构,Τ-结 构定义为:π|〈3,σ,σ'ε>。 5. rq存储SPARQL查询语句,eq存储定位方程组,每条执行语句S的相关信息用三元 组(巧,69,〈5,〇,〇*,8>)表示,0*是一个由三元组(四,69,〈5,〇,〇*,〖>)结构组成的列表,存储 执行轨迹中所有语句的SPARQL查询和定位方程组。本专利技术的算法描述如下,如图1: 1.为出错源程序生成执行轨迹和RDF文件其中执行轨迹的生成遵循如下操作语 义: (a)赋值语句:x = e,计算表达式e在当前语句的状态σ下的值,并用此值更新状态σ 中X的值,将当前语句对应的结构压入轨迹栈π中; (b)顺序语句:如果51和52为相邻的顺序语句,则根据语句类型,对Si进行符号执 行; (c)if语句:if(b){S1;}else{S2;}将当前语句对应的结构压入轨迹栈π中;计算 当前语句状态σ下条件表达式b的值,若为真,则将条件语句头if (b)及其真值true压入环境 栈ε中,接下来对Si语句体进行轨迹生成;若为假,则将条件语句头if(b)及其真值false压 入环境栈ε中,接下来对&语句体进行轨迹生成。 (d)while语句:while(b) {S;}将当前语句对应本文档来自技高网...
一种<a href="http://www.xjishu.com/zhuanli/55/CN105468521.html" title="一种基于子图搜索的指针相关语义错误定位方法原文来自X技术">基于子图搜索的指针相关语义错误定位方法</a>

【技术保护点】
一种基于子图搜索的指针相关语义错误定位方法,其特征在于步骤如下:(1)根据失败的测试用例的输入,对程序进行符号执行,记录源程序在这一输入下的执行轨迹,各个程序状态和指针相关的复杂结构的RDF资源描述框架文件;(2)根据执行轨迹,从程序中变量的值与期望值不一致的断点处,反向对程序轨迹中的每一个语句生成定位方程组和SPARQL查询文件,SPARQL是一种专门针对RDF格式的查询语言;(3)通过二分法反向找到使得定位方程组或SPARQL查询无解的第一个语句,由断点到此语句之间的与断点变元相关的语句构成了一个极小程序片段;(4)一次定位到的所述极小程序片段通常范围太大,用户再次输入所述极小程序片段中变量在某个状态下的预期值,在此极小程序片段中再次定位错误所在的程序片段,不断重复这一交互过程,直到用户能够从得到的极小程序片段中确定错误的原因。

【技术特征摘要】

【专利技术属性】
技术研发人员:罗杰贾丽梅
申请(专利权)人:北京航空航天大学
类型:发明
国别省市:北京;11

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1