CN115640155A - 基于语句依赖和补丁相似性的程序自动修复方法与系统 - Google Patents
基于语句依赖和补丁相似性的程序自动修复方法与系统 Download PDFInfo
- Publication number
- CN115640155A CN115640155A CN202211130838.3A CN202211130838A CN115640155A CN 115640155 A CN115640155 A CN 115640155A CN 202211130838 A CN202211130838 A CN 202211130838A CN 115640155 A CN115640155 A CN 115640155A
- Authority
- CN
- China
- Prior art keywords
- patch
- statement
- similarity
- statements
- dependence
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Stored Programmes (AREA)
Abstract
本发明公开了一种基于语句依赖和补丁相似性的程序自动修复方法与系统。在故障定位时,分别根据语句执行序列和语句间的数据依赖计算向量,将两者结合形成语句依赖向量,将基于频谱定位得到的结果嵌入到向量中,计算并返回语句的可疑度值;在补丁验证时,当有一个补丁未通过测试用例被判断为错误补丁,计算后续补丁与该错误补丁相似度,如果相似度过高则不执行测试直接判断为错误补丁。与现有技术相比,本发明在定位故障时不仅考虑测试用例执行情况,还考虑语句间的依赖关系;此外,在验证补丁时还考虑补丁间的相似性以排除与错误补丁高相似的补丁,能有效提高程序修复效率。
Description
技术领域
本发明涉及程序自动修复,具体涉及一种基于语句依赖和补丁相似性的程序自动修复方法与系统。
背景技术
作为软件自动化的一个方向,程序自动修复近年来得到了广泛研究。很多工具陆续被提出,基于冗余假设的程序自动修复出现较早,但时至今日仍有大量相关研究。其基本流程为:首先通过故障定位返回可疑代码段列表,在设定的粒度查找与出错代码段相似的片段,再由这些相似片段生成补丁,最后依次验证以找到正确的补丁完成修复。一方面,在定位过程,很多修复工具会使用基于频谱的故障定位,这些工具会使用不同公式根据测试用例执行情况计算语句可疑度值而不考虑测试的代码包含的其他信息。另一方面,在验证搜索空间中的补丁时,大多数工具会根据事先定义的规则对生成的补丁预先排序,很少有对搜索空间进行过滤。
发明内容
发明目的:针对上述现有研究的不足,本发明的目的在于提供一种基于语句依赖和补丁相似性的程序自动修复方法与系统,在定位过程中除测试用例执行情况外额外考虑语句间的依赖关系,以及在修复过程中利用补丁相似性通过错误补丁过滤补丁搜索空间,以提高故障定位的准确性和修复效率。
技术方案:为实现上述发明目的,本发明所采用的技术方案如下:
一种基于语句依赖和补丁相似性的程序自动修复方法,所述方法在故障定位时,分别根据语句执行序列和语句间的数据依赖计算向量,将两者结合形成语句依赖向量,将基于频谱定位得到的结果嵌入到向量中,计算并返回语句的可疑度值,按照可疑度排序返回出错代码片段列表;在补丁验证时,当有一个补丁未通过测试用例被判断为错误补丁,计算后续补丁与该错误补丁相似度,从补丁搜索空间筛除与错误补丁相似度超过设定阈值的补丁。
作为优选,故障定位时对于每个测试用例,得到执行语句序列并把语句间的关系表示为语句关系向量;创建数据流图表示语句间的数据依赖,用边表示语句之间的数据流,生成数据依赖向量;将语句关系向量和数据依赖向量组合输出语句依赖向量;对于每行代码的语句依赖向量,将每个元素与对应语句的基于频谱的可疑度相乘,得到该语句的可疑度向量;取语句可疑度向量的模作为语句的可疑度值。
作为优选,第i行语句的语句关系向量Li中每个元素lj表示第i行语句与第j行语句是否在执行序列上相邻。
作为优选,第i行语句的数据依赖向量Di中每个元素dj表示第i行语句与第j行语句是否存在数据依赖。
作为优选,所述语句依赖向量中的元素取值为0、1、2;取值为0表示两个语句在执行序列上不相邻且不存在数据依赖,为1表示两个语句在执行序列上相邻或者存在数据依赖,为2表示两个语句在执行序列上相邻且存在数据依赖。
作为优选,所述补丁搜索空间的补丁是基于同一项目中搜索的与出错代码片段相似度超过设定阈值的代码段生成的;所采用的相似度度量方法包括代码结构相似度、变量方法名称相似度、最长公共子序列LCS相似度或词频-逆向文件频率TFIDF相似度中的一种或多种。
作为优选,补丁验证时,使用最长公共子序列度量方法计算两个补丁的相似度:
其中LCS(x,y)为补丁x和y最长公共子序列长度,Lenx,Leny分别为补丁x和y的字符串长度。
一种基于语句依赖和补丁相似性的程序自动修复系统,包括故障定位模块和补丁验证模块,所述故障定位模块,用于在故障定位时,分别根据语句执行序列和语句间的数据依赖计算向量,将两者结合形成语句依赖向量,将基于频谱定位得到的结果嵌入到向量中,计算并返回语句的可疑度值,按照可疑度排序返回出错代码片段列表;所述补丁验证模块,用于在补丁验证时,当有一个补丁未通过测试用例被判断为错误补丁,计算后续补丁与该错误补丁相似度,从补丁搜索空间筛除与错误补丁相似度超过设定阈值的补丁。
一种计算机系统,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述计算机程序被加载至处理器时实现所述的基于语句依赖和补丁相似性的程序自动修复方法的步骤。
一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现所述的基于语句依赖和补丁相似性的程序自动修复方法的步骤。
有益效果:本发明对程序自动修复过程中的故障定位和补丁验证部分进行优化设计,在定位部分,分别根据语句执行序列和语句间的数据依赖计算向量,将两者结合形成语句依赖向量,将基于频谱定位得到的结果嵌入到向量中,计算并返回语句的可疑度值;在修复部分,当有一个补丁未通过测试用例被判断为错误补丁,计算后续补丁与该错误补丁相似度,如果相似度过高则不执行测试直接判断为错误补丁。与现有技术相比,本发明在定位故障时不仅考虑测试用例执行情况,还考虑语句间的依赖关系,提高了故障定位的准确性,有利于快速修复;此外,在验证补丁时还考虑补丁间的相似性以排除与错误补丁高相似的补丁,提高了补丁修复效率。
附图说明
图1是本发明实施例的方法流程图。
具体实施方式
下面结合附图和具体实施例对本发明做进一步说明。
如图1所示,本发明实施例公开的一种基于语句依赖和补丁相似性的程序自动修复方法,主要包括故障定位部分和修复部分(包括补丁生成和补丁验证)。
具体步骤如下:
步骤A.修复任务开始时,给定一个包含错误的程序,现有故障定位工具一般采用基于频谱的故障定位方法,该方法把代码行作为行,把测试用例作为列获得矩阵M,矩阵某一位置Mij为1代表第j个测试用例执行了第i个语句,为0代表没有执行。最后计算每条语句的可疑度,这里使用的计算公式为基于频谱定位中广泛使用的ochiai:
其中Sus表示可疑度,e表示执行,n表示未执行,f表示未通过,p表示通过。ef表示未通过且执行了该语句的测试用例数量,ep表示执行了该语句且通过的测试用例数量,nf表示未执行该语句的测试用例数量。
针对步骤A,我们不只关注通过或失败的测试用例执行的语句,而是进一步考虑测试用例执行序列间的关联性。对于所有测试用例,我们得到执行语句序列并把语句间的关系表示为向量:
Li=(l1,,l2,......,ln)
Li表示第i行语句与每条语句的关联向量,向量的每个元素lj表示第i行语句与第j行语句是否在执行序列上相邻,用0或1表示。n表示语句总行数。但是语句执行序列上的关系并不够,因为循环语句会重复多次,从而破坏循环内外语句的关系。这里我们创建DFG图(数据流图)表示语句间的数据依赖,用边表示语句之间的数据流,并通过node2vec从DFG生成数据依赖向量:
Di=(d1,d2,......,dn)
Di表示第i行语句与每条语句间是否存在数据流的向量,向量的每个元素dj表示第i行语句与第j行语句是否存在数据依赖,用0或1表示。将两者组合输出语句依赖向量:
Si=(S1,S2,......,Sn)
Si表示第i行语句与每条语句间依赖关系向量,向量的每个元素sj表示第i行语句与第j行语句的依赖值,取值为0表示执行序列上不相邻且不存在数据依赖,为1表示存在一种联系,为2表示同时存在两种联系,当前语句与自身的依赖值为2。基于频谱定位计算得到每条语句的可疑值为v1,v2......vn。对每行代码的语句依赖向量,将每个元素与他们对应语句的可疑度相乘,即v1*s1........vn*sn得到该语句的可疑度向量:
Ri=(r1,r2,......,rn)
步骤B.根据故障定位返回的出错代码片段列表,一般在同一项目中使用代码段结构相似度(语句数量、运算符数量等)、变量方法名称相似度等方法搜索与出错代码段相似的代码段并排序,再根据代码段之间的差异提取补丁(例如出错代码段为“returngetCumPct((Comparable<?>)v);”,搜索到的相似代码段为“retum getPct(Long.valueOf(v));”,比较两个相似代码片段由差异生成的一个补丁为“retum getPct((Comparable<?>)v);”)。此外也可以使用TFIDF(将代码段处理成令牌序列度量词频-逆文本频率)、LCS(将代码段视为字符序列来计算最长公共子序列)等相似度度量方法对搜索相似性较高的代码段进行排序,根据故障代码片段依次对排好序的候选代码片段进行变量映射,通过在抽象语法树级别匹配两段代码节点来提取补丁。
步骤C.生成的补丁构成搜索空间来执行验证操作。通常依次通过测试用例验证补丁正确性,验证不通过的补丁加入已尝试补丁集合,当有一个补丁能够通过所有测试用例时,将其认定为正确,修复结束。如果直到超时仍无补丁满足所有测试用例则修复失败
本实施例在步骤C中利用LCS筛除错误补丁。在实际修复过程中,与不正确补丁高度相似的补丁也大概率是错误补丁。测试验证此类补丁会浪费大量时间。因此在验证搜索空间中的下一个补丁前,将其与已验证的不正确补丁一一计算最长公共子序列相似度,具体地,设两个补丁为x和y,则相似度为:
LCS(x,y)为补丁x和y最长公共子序列长度,Lenx,Leny分别为补丁x和y的字符串长度,Max(Lenx,Leny)取较长的字符串长度,Sim(x,y)则为两补丁的相似度。一旦当前补丁与错误补丁相似度数值超过设定的阙值(如0.9),就将其抛弃不进行测试验证。
基于相同的发明构思,本发明实施例公开的一种基于语句依赖和补丁相似性的程序自动修复系统,包括故障定位模块和补丁验证模块,所述故障定位模块,用于在故障定位时,分别根据语句执行序列和语句间的数据依赖计算向量,将两者结合形成语句依赖向量,将基于频谱定位得到的结果嵌入到向量中,计算并返回语句的可疑度值,按照可疑度排序返回出错代码片段列表;所述补丁验证模块,用于在补丁验证时,当有一个补丁未通过测试用例被判断为错误补丁,计算后续补丁与该错误补丁相似度,从补丁搜索空间筛除与错误补丁相似度超过设定阈值的补丁。
基于相同的发明构思,本发明实施例公开的一种计算机系统,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述计算机程序被加载至处理器时实现所述的基于语句依赖和补丁相似性的程序自动修复方法的步骤。
基于相同的发明构思,本发明实施例公开的一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现所述的基于语句依赖和补丁相似性的程序自动修复方法的步骤。
本领域技术人员可以理解的是,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机系统(可以是个人计算机,服务器,或者网络设备等)执行本发明实施例所述方法的全部或部分步骤。存储介质包括:U盘、移动硬盘、只读存储器ROM、随机存取存储器RAM、磁碟或者光盘等各种可以存储计算机程序的介质。
Claims (10)
1.一种基于语句依赖和补丁相似性的程序自动修复方法,其特征在于,所述方法在故障定位时,分别根据语句执行序列和语句间的数据依赖计算向量,将两者结合形成语句依赖向量,将基于频谱定位得到的结果嵌入到向量中,计算并返回语句的可疑度值,按照可疑度排序返回出错代码片段列表;在补丁验证时,当有一个补丁未通过测试用例被判断为错误补丁,计算后续补丁与该错误补丁相似度,从补丁搜索空间筛除与错误补丁相似度超过设定阈值的补丁。
2.根据权利要求1所述的基于语句依赖和补丁相似性的程序自动修复方法,其特征在于,故障定位时对于每个测试用例,得到执行语句序列并把语句间的关系表示为语句关系向量;创建数据流图表示语句间的数据依赖,用边表示语句之间的数据流,生成数据依赖向量;将语句关系向量和数据依赖向量组合输出语句依赖向量;对于每行代码的语句依赖向量,将每个元素与对应语句的基于频谱的可疑度相乘,得到该语句的可疑度向量;取语句可疑度向量的模作为语句的可疑度值。
3.根据权利要求2所述的基于语句依赖和补丁相似性的程序自动修复方法,其特征在于,第i行语句的语句关系向量Li中每个元素lj表示第i行语句与第j行语句是否在执行序列上相邻。
4.根据权利要求2所述的基于语句依赖和补丁相似性的程序自动修复方法,其特征在于,第i行语句的数据依赖向量Di中每个元素dj表示第i行语句与第j行语句是否存在数据依赖。
5.根据权利要求2所述的基于语句依赖和补丁相似性的程序自动修复方法,其特征在于,所述语句依赖向量中的元素取值为0、1、2;取值为0表示两个语句在执行序列上不相邻且不存在数据依赖,为1表示两个语句在执行序列上相邻或者存在数据依赖,为2表示两个语句在执行序列上相邻且存在数据依赖。
6.根据权利要求1所述的基于语句依赖和补丁相似性的程序自动修复方法,其特征在于,所述补丁搜索空间的补丁是基于同一项目中搜索的与出错代码片段相似度超过设定阈值的代码段生成的;所采用的相似度度量方法包括代码结构相似度、变量方法名称相似度、最长公共子序列LCS相似度或词频-逆向文件频率TFIDF相似度中的一种或多种。
8.一种基于语句依赖和补丁相似性的程序自动修复系统,包括故障定位模块和补丁验证模块,其特征在于,所述故障定位模块,用于在故障定位时,分别根据语句执行序列和语句间的数据依赖计算向量,将两者结合形成语句依赖向量,将基于频谱定位得到的结果嵌入到向量中,计算并返回语句的可疑度值,按照可疑度排序返回出错代码片段列表;所述补丁验证模块,用于在补丁验证时,当有一个补丁未通过测试用例被判断为错误补丁,计算后续补丁与该错误补丁相似度,从补丁搜索空间筛除与错误补丁相似度超过设定阈值的补丁。
9.一种计算机系统,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述计算机程序被加载至处理器时实现根据权利要求1-7任一项所述的基于语句依赖和补丁相似性的程序自动修复方法的步骤。
10.一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现根据权利要求1-7任一项所述的基于语句依赖和补丁相似性的程序自动修复方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211130838.3A CN115640155A (zh) | 2022-09-16 | 2022-09-16 | 基于语句依赖和补丁相似性的程序自动修复方法与系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211130838.3A CN115640155A (zh) | 2022-09-16 | 2022-09-16 | 基于语句依赖和补丁相似性的程序自动修复方法与系统 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115640155A true CN115640155A (zh) | 2023-01-24 |
Family
ID=84942246
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211130838.3A Pending CN115640155A (zh) | 2022-09-16 | 2022-09-16 | 基于语句依赖和补丁相似性的程序自动修复方法与系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115640155A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116225770A (zh) * | 2023-04-26 | 2023-06-06 | 阿里云计算有限公司 | 补丁匹配方法、装置、设备及存储介质 |
-
2022
- 2022-09-16 CN CN202211130838.3A patent/CN115640155A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116225770A (zh) * | 2023-04-26 | 2023-06-06 | 阿里云计算有限公司 | 补丁匹配方法、装置、设备及存储介质 |
CN116225770B (zh) * | 2023-04-26 | 2023-10-20 | 阿里云计算有限公司 | 补丁匹配方法、装置、设备及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109144882B (zh) | 一种基于程序不变量的软件故障定位方法及装置 | |
US20190138731A1 (en) | Method for determining defects and vulnerabilities in software code | |
Medeiros et al. | DEKANT: a static analysis tool that learns to detect web application vulnerabilities | |
US8782609B2 (en) | Test failure bucketing | |
US7712087B2 (en) | Methods and systems for identifying intermittent errors in a distributed code development environment | |
CN111427775B (zh) | 一种基于Bert模型的方法层次缺陷定位方法 | |
CN111104335B (zh) | 一种基于多层次分析的c语言缺陷检测方法及装置 | |
JP2018026135A (ja) | 静的解析警告の効率的な運用のための原因ポイント解析のためのシステム及び方法 | |
Saifullah et al. | Learning from examples to find fully qualified names of api elements in code snippets | |
CN112328499A (zh) | 一种测试数据生成方法、装置、设备及介质 | |
CN114936158A (zh) | 一种基于图卷积神经网络的软件缺陷定位方法 | |
CN116305158A (zh) | 一种基于切片代码依赖图语义学习的漏洞识别方法 | |
CN111045670B (zh) | 一种二进制代码与源代码间复用关系的识别方法与装置 | |
CN115640155A (zh) | 基于语句依赖和补丁相似性的程序自动修复方法与系统 | |
Jiang et al. | Tracing back the history of commits in low-tech reviewing environments: a case study of the linux kernel | |
CN114385491A (zh) | 一种基于深度学习的js转译器缺陷检测方法 | |
CN112783513A (zh) | 一种代码风险检查方法、装置及设备 | |
CN116820996A (zh) | 基于人工智能的集成测试用例自动生成方法和装置 | |
CN112925874B (zh) | 基于案例标记的相似代码搜索方法及系统 | |
US11366742B2 (en) | Automated identification of lines of code related to errors field | |
CN113037521B (zh) | 识别通讯设备状态的方法、通讯系统及存储介质 | |
Ufuktepe et al. | The relation between bug fix change patterns and change impact analysis | |
CN117539793B (zh) | 一种浏览器ui自动测试的方法、装置及存储介质 | |
US7650579B2 (en) | Model correspondence method and device | |
CN115203057B (zh) | 低代码测试自动化方法、装置、设备及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |