一种面向对象程序中条件语句缺陷补丁生成与验证方法

文档序号:189950 发布日期:2021-11-02 浏览:20次 >En<

阅读说明:本技术 一种面向对象程序中条件语句缺陷补丁生成与验证方法 (Conditional statement defect patch generation and verification method in object-oriented program ) 是由 杨秋辉 李兴佳 伍佳 于 2021-07-09 设计创作,主要内容包括:本发明提供一种面向对象程序中条件语句缺陷补丁生成与验证方法。该方法包括修复信息收集、补丁生成和补丁验证三个步骤。首先运行测试用例,收集待修复程序位置的上下文信息,然后综合使用变异技术和程序合成技术自动化地生成候选补丁,最后运行测试用例验证候选补丁的有效性。该方法可以有效地修复条件语句错误和条件语句缺失两种缺陷,显著提高了缺陷修复率和补丁精度,缓解了补丁过度拟合问题。(The invention provides a conditional statement defect patch generation and verification method in an object-oriented program. The method comprises three steps of repair information collection, patch generation and patch verification. The method comprises the steps of firstly running a test case, collecting context information of a program position to be repaired, then generating a candidate patch automatically by comprehensively using a variation technology and a program synthesis technology, and finally running the test case to verify the effectiveness of the candidate patch. The method can effectively repair two defects of conditional statement errors and conditional statement missing, remarkably improves defect repair rate and patch precision, and relieves the problem of patch overfitting.)

一种面向对象程序中条件语句缺陷补丁生成与验证方法

技术领域

本发明属于软件工程中的软件调试领域,尤其涉及一种面向对象程序中条件语句缺陷补丁生成与验证方法。

背景技术

软件缺陷是指软件中存在的错误,这些错误导致软件不符合需求或规格说明,需要被替换或者修复。缺陷修复指修复不合格软件或软件组件的行为。在软件开发过程中,调试是确定并修复程序缺陷、保证产品质量的重要手段。然而,在快速迭代的开发过程中,传统的手工调试面临着巨大的时间、人力成本压力。为了减小开发人员的调试压力,降低开发成本,研究人员提出借助计算机的能力,协助甚至代替开发人员进行调试工作,这一类技术被称为自动化缺陷修复。这类技术借助计算机的能力分析并解释程序失效的原因,为问题程序提供一个或多个可行的修复方案,从而有效地减少开发人员的调试成本。

在现有的研究成果中,大部分缺陷修复技术使用测试用例来描述正确的程序行为,并通过重新运行测试用例来验证程序补丁是否有效。如果测试用例全部执行通过,那么程序补丁被认为是能够修复缺陷的有效补丁。但由于测试套件的不完整,这类技术生成的有效补丁可能恰好通过给定的测试用例,并没有实现真正的修复。

发明内容

程序补丁生成与验证是缺陷自动化修复的核心步骤。为了提高缺陷修复率和补丁精度,本发明聚焦于面向对象程序中的条件语句缺陷,提出了一种新颖的条件语句缺陷修复补丁生成与验证方法。首先运行测试用例,收集待修复程序位置的上下文信息,然后综合使用变异技术和程序合成技术自动化地生成候选补丁,最后运行测试用例验证候选补丁的有效性。

一种面向对象程序中条件语句缺陷补丁生成与验证方法,整体流程包括以下步骤。

步骤1,收集缺陷修复所需的信息。

通过执行测试用例,获取待修复程序位置在测试用例执行过程中的上下文信息。假设该程序位置处待修改或待添加的条件表达式为exp,从表达式exp的输入和期望输出两个方面收集相关信息,将输入有关数据和期望输出转化为待求解的缺陷修复方程式,用于指导程序补丁的生成和验证。

步骤2,生成缺陷修复的候选补丁。

根据可修复程序位置的语句类型选择不同的补丁生成策略。如果可修复程序位置为if条件语句,表明程序缺陷是条件语句错误,则先对该位置的原始条件表达式进行变异,将生成的程序变体作为候选补丁。如果程序变体中没有符合要求的有效补丁,则根据缺陷修复方程式,利用约束求解的方法合成候选补丁。如果可修复程序位置不是if条件语句,表明程序缺陷是条件语句缺失,则直接利用约束求解方法合成条件表达式,将合成的条件表达式添加为前置条件形成候选补丁。

步骤3,验证候选补丁的有效性。

对于由变异技术生成的候选补丁,先筛选出符合缺陷修复方程式的候选补丁,然后运行测试用例来验证该候选补丁的有效性;对于基于约束求解合成的候选补丁,则直接运行测试用例验证其有效性。

如果该候选补丁是有效补丁,那么直接输出该补丁,并终止修复流程,报告修复成功。反之,抛弃该候选补丁,选择下一个进行验证。如果候选补丁中没有有效补丁,则报告修复失败。

本方法聚焦于面向对象程序中的条件语句错误和条件语句缺失两种缺陷,在进行修复时,根据可修复程序位置的语句类型选择不同的补丁生成策略。一方面,针对条件语句定义了三种适用的变异算子,使用变异技术对原始条件表达式进行简单改变,生成候选补丁。另一方面,通过收集程序语义信息,利用基于组件的程序合成技术合成满足约束的条件表达式,作为候选补丁。最后,使用测试套件进行补丁验证。本发明的有益效果是,可以有效地修复条件语句错误和条件语句缺失两种缺陷,显著提高了缺陷修复率和补丁精度,缓解了补丁过度拟合问题。

附图说明

图1为本发明方法的实施流程图。

具体实施方式

为了更加清楚地展示本发明的目的和技术方案,下面将结合具体的实施过程和附图,对本发明的具体实施方式和参数进行更加详细的描述。

一种面向对象程序中的条件语句缺陷修复补丁生成与验证方法,如图1所示,包括以下步骤。

步骤1,收集缺陷修复所需的信息,图1中的G1步骤。

程序缺陷定位技术可以获取可疑语句列表,每条可疑语句包含一个集合,其中location表示待修复程序位置,用于唯一标识缺陷程序中的一条程序语句,由“类名:行号”组成;angelicValue指可以使失败测试用例成功执行的值,对于条件语句缺陷,取值范围为{true, false};表示一个失败的测试用例。在此基础上,通过执行测试用例,获取待修复程序位置在测试用例执行过程中的上下文信息。假设该程序位置处待修改或待添加的条件表达式为exp,从表达式的输入和输出两个方面收集相关信息,输入数据和期望输出可转化为待求解的程序语义约束用于指导合成程序补丁。

进一步的,步骤1包含以下三个步骤。

步骤1-1,收集条件表达式有关的输入数据,用表示。

其中,l为location,表示exp所在的位置,n和m分别表示第n个测试用例的第m次执行。假设在程序执行过程中,执行到待修复条件表达式exp之前,所有可访问的变量有 u 个基本变量、一组对象集合 OBJ(共 w 个对象)、以及一些常数,则包含的数据如下:

Ø u 个基本变量及对应变量值。如:a→10;

Ø w 个boolean 值,分别表示OBJ中的 w 个对象是否为空。若某个对象为空,则其对应的值为false;

Ø OBJ中个对象各自对应类的状态查询方法及其输出,如obj1.size()→2;

Ø 常数,如-1,0,1。

步骤1-2,收集条件表达式期望输出结果。

使用测试用例运行程序过程中,执行完待修复的条件表达式exp之后,表达式输出的能够使测试用例通过的值称为期望输出,用表示,取值范围为{true, false}。表示待修复程序位置,n和m分别表示第n个测试用例的第 m次执行。

如果位置处为条件语句,表示是条件语句错误缺陷,是该位置错误的条件表达式exp的期望输出。针对失败的测试用例,等于能使该测试用例通过的值;针对成功的测试用例,等于实际输出。

如果位置处为非条件语句,表示是条件语句缺失缺陷,是该位置缺失的条件表达式exp的期望输出。针对失败的测试用例,均为 false;针对成功的测试用例,均为 true。

步骤1-3,形成缺陷修复方程式。

基于可以形成待求解的修复方程式 F(公式1)。

(公式1)。

步骤2,生成缺陷修复的候选补丁,图1中的G2步骤。

根据可修复程序位置的语句类型选择不同的补丁生成策略。当待修复位置的语句为if条件语句时,使用策略一,否则使用策略二。

策略一:基于变异算子生成程序补丁。

当待修复的程序位置为if条件语句时,基于预先定义的变异算子,在该位置的条件表达式中引入小的代码变更,产生所有可能的一阶程序变体,作为候选补丁。若经验证后无有效补丁,再使用策略二生成候选补丁。本策略中变异算子有三类:(1)否定条件表达式;(2)替换同类运算符,包括算术运算符、关系运算符和逻辑运算符;(3)移除条件表达式中的一个子句。例如,对条件语句if (a>0||b<0)进行变异,基于变异算子(1)产生的候选补丁如if(! (a>0||b<0)),基于变异算子(2)产生的候选补丁如if(a<0||b<0),基于变异算子(3)产生的候选补丁如if(a>0)。

策略二:基于约束求解合成程序补丁。

将步骤1中运行测试用例得到的<>对,与比较运算符、算术运算符和逻辑运算符生成约束后,将生成的约束输入到SMT求解器中,若约束有解,输出满足程序约束的条件表达式exp-patch。如果约束无解,则继续分析可疑语句列表中的下一条语句。如果所有语句分析完,都没有生成有效补丁,则报告修复失败。例如,假设获取的待修复条件表达式的<>对为<{x=1, y=1, 0}, true>、<{x=2, y=1, 0}, false>,算术运算符为{+,-},逻辑运算符{<,>},那么经约束求解后合成的条件表达式exp-patch为“x-y<0”。

对于条件语句缺失缺陷,将约束求解合成的条件表达式exp-patch作为前置条件添加到可修复的程序位置,形成候选补丁。

对于条件语句错误缺陷,则使用约束求解合成的条件表达式exp-patch替换原始错误的条件表达式exp,形成候选程序补丁。

步骤3,验证候选补丁的有效性,图1中的G3步骤。

当候选补丁由变异技术生成时,对于各个候选补丁,首先要满足步骤1中的缺陷修复方程式(公式1)的解,否则抛弃该候选补丁;然后运行测试用例来验证该候选补丁的有效性。如果该候选补丁是有效补丁,则直接输出该补丁信息,并终止修复流程。反之,抛弃该候选补丁,选择下一个候选补丁进行检查和验证。如果变异生成的所有候选补丁都不是有效补丁,则使用约束求解合成候选补丁。

对于基于约束求解合成的候选补丁,直接运行测试用例验证其有效性。如果存在使所有测试用例都执行通过的有效补丁,那么直接输出该补丁,并终止修复流程。反之,抛弃该候选补丁,选择下一个进行验证。如果没有找到符合要求的有效补丁,则继续分析可疑语句列表中的下一条语句。如果分析完可疑语句列表中的所有语句 ,都没有生成有效补丁,则报告修复失败。

针对条件语句缺陷,提供了基于变异算子生成补丁和基于约束求解合成补丁两种方法。根据待修复程序位置的语句类型,可以选择不同的补丁生成与验证策略,提高了修复方法的缺陷修复率。在修复条件语句缺陷时,该方法是可行的并且具有较好的效果。

7页详细技术资料下载
上一篇:一种医用注射器针头装配设备
下一篇:嵌入式设备升级方法、装置、设备、介质及程序产品

网友询问留言

已有0条留言

还没有人留言评论。精彩留言会获得点赞!

精彩留言,会给你点赞!