CN108228232B - 一种针对程序中循环问题的自动修复方法 - Google Patents
一种针对程序中循环问题的自动修复方法 Download PDFInfo
- Publication number
- CN108228232B CN108228232B CN201810047683.4A CN201810047683A CN108228232B CN 108228232 B CN108228232 B CN 108228232B CN 201810047683 A CN201810047683 A CN 201810047683A CN 108228232 B CN108228232 B CN 108228232B
- Authority
- CN
- China
- Prior art keywords
- loop
- statements
- statement
- predicate
- program
- 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.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/75—Structural analysis for program understanding
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/72—Code refactoring
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/75—Structural analysis for program understanding
- G06F8/751—Code clone detection
Abstract
本发明涉及一种针对程序中循环问题的自动修复方法。本发明将循环分为计次循环和目的循环,对于计次循环通过分析开发者的习惯,逐个尝试特定谓词,寻找特殊常量或变量来纠正循环的次数,对于目的循环则是通过提取程序中循环语句共有的部分作为模板,并按照模板修改要修复的循环语句。本发明克服了过去没有专门针对程序中循环问题进行修复的并实用的自动修复技术或手段。本发明在只需要提供测试用例和错误程序的情况下就可以输出相应的补丁,大大节省了开发者的工作量和工作时间,填补了这一本技术领域内的空白,可以提供更精准的修复需求,将循环语句分为计次循环和目的循环两大类,针对不同类型可以有不同的对应方法,不会出现与循环语句完全不相关的补丁,可以提高对循环语句错误修复的精确度。
Description
技术领域
本发明提出一种用于修复程序中循环语句导致的bug问题,特别涉及一种针对程序中循环问题的自动修复方法,属于软件缺陷修复领域。
背景技术
随着软件规模的日益增长,程序bug是软件开发中不可避免的产物,其产生原因可以追溯到软件开发的各个阶段。为了尽快地修复软件bug,程序员必须花费大量的时间和精力查找导致软件失效的原因,并发布补丁。历史数据表明,超过45%的软件开发成本用于定位和修复bug的过程中。无论工业生产还是学术研究领域,定位和修复程序bug都是软件工程的核心问题。
为了降低修复过程中的时间和人力成本,自动程序修复方法应运而生。该方法依据给定的程序问题,自动生成程序补丁,进而修复程序中的错误,修复中产生的程序补丁既可以自动添加到程序中,也可以用于指导开发者继续改进代码。
目前所有的相关补丁生成方法都是从程序整体着手,以一种通用的方式对程序当中的bug进行修复的。
从整体程序入手就难免存在修复不细致的问题,于是一种专门针对条件语句的修复方式被提了出来,且结果表明,对于因条件语句的缺少或错误而导致的bug,这种针对条件语句的修复方式的精确度比之前其他方法要好的多。
一个程序一般是由三种关键语句构成的,即顺序语句,条件语句和循环语句,循环语句在程序中占的比例还是相当大的,开发者经常会因为疏忽、遗忘等原因,导致循环语句出现不必要的错误。
在本发明之前,目前尚没有出现专门针对程序中循环问题进行修复的自动修复技术,而如果用针对程序整体的通用修复方式,势必会因为兼顾修复其他语句而无法进行针对循环语句更加细致的考虑,也就是说对于循环语句导致的bug还需要更高的修复精确度,因此需要一种针对程序中循环问题的自动修复技术。
发明内容
本发明的目的就在于克服上述缺陷,提供一种针对程序中循环问题的自动修复方法。
本发明的技术方案是:
一种针对程序中循环问题的自动修复方法,其主要技术特征在于如下步骤:(1)将循环语句分为两类,一类为计次循环,即程序员知道该语句要循环的次数,一类为目的循环,即该循环语句是为了达到某种结果,程序员并不知道要循环的准确次数;
(2)对于计次循环,分析上下文识别程序员的计次习惯:根据末尾循环体是‘++’或者‘--’判定循环格式,若是‘++’,则识别单次表达式通常是赋值为0还是1,若是‘--,则识别条件表达式谓词中的值通常是0还是1,然后根据习惯将对应的0改为1或1改为0;
(3)若步骤二没有修复成功,则将条件表达式中的谓词替换为以下五种谓词之一,这里的谓词包括‘>’、‘>=、‘<’、‘<=、‘!=,且若末尾循环体是‘++’,则不考虑‘>’、‘>=,若末尾循环体是‘--’,则不考虑‘<’、‘<=,通过逐个替换测试的方法,依次将原来的谓词修改为上述五种谓词之一,直到获得正确的测试结果,来确定谓词到底要替换为哪一个;
(4)若步骤(3)依旧没有成功,则寻找特殊的常量或者变量,包括特殊的数字,const定义的常变量,#define宏定义的值,数组的长度,循环语句内if语句中条件表达式涉及到的值,循环语句前需要输入的值,函数参数值,将他们的关键信息和数值集合成一个候补循环次数空间,用每个数值对应的关键信息和循环语句的中间循环体进行比对,将这些关键信息,根据大小写,拆分为多个词,只要中间循环体出现其中一个词一次,则给这个值记1分,最后根据总分进行排序;设定单次表达式赋值为0,条件表达式的谓词为‘<’,末尾循环体用‘++’,条件表达式的谓词后的值根据排序结果取前五个从高到低依次进行尝试,直到输出正确的测试结果;
(5)对于目的循环,利用克隆检测技术,从当前程序中寻找中间循环体与当前要修复的循环语句中的中间循环体相似的循环语句,并摘取它的单次表达式,条件表达式和末尾循环体作为模板;将模板套入到当前循环语句,并识别原来的循环语句上述三个区域中是否有关键信息与中间循环体相同,若有相同部分,则对应的修改当前循环语句上述三个区域对应的关键信息使之与当前循环语句的中间循环体相同。
本发明的优点和效果在于是通过考虑循环语句的特性来有针对性的修复程序中因循环语句错误导致的bug。主要有如下一些优点:
(1)本发明是一种自动修复技术方法,即在只需要提供测试用例和错误程序的情况下就可以输出相应的补丁,大大节省了开发者的工作量和工作时间。
(2)本发明填补了这一本技术领域内的空白,可以提供更精准的修复需求。
(3)将循环语句分为计次循环和目的循环两大类,针对不同类型可以有不同的对应方法。
(4)所有修改方式都是针对循环语句的特性进行操作的,不会出现与循环语句完全不相关的补丁,可以提高对循环语句错误修复的精确度。
附图说明
图1——本发明流程示意图。
图2——本发明针对计次循环bug的第一步修复方式的流程示意图。
图3——本发明针对计次循环bug的第二步修复方式的流程示意图。
图4——本发明针对计次循环bug的第三步修复方式的流程示意图。
图5——本发明针对目的循环bug的修复方式的流程示意图。
图6——本发明bug范例及其修复结果示意图。
具体实施方式
本发明的技术思路是:
将循环分为计次循环和目的循环,对于计次循环通过分析开发者的习惯,逐个尝试特定谓词,寻找特殊常量或变量来纠正循环的次数,对于目的循环则是通过提取程序中循环语句共有的部分作为模板,并按照模板修改要修复的循环语句。
下面具体说明本发明。
步骤(1)如图1所示,将循环语句分为两类,一类为计次循环,即程序员知道该语句要循环的次数,一类为目的循环,即该循环语句是为了达到某种结果,程序员并不知道要循环的准确次数。规定三个条件(1)单次表达式赋值为0或1,(2)条件表达式谓词后的值为0或1(3)末尾循环体是‘++’或‘一’,只要同时满足条件(1)(2)或者(1)(3),那就认定他为计次循环,否则就是目的循环。比如for(i=0;i<5;i++)这个语句,因为单次表达式赋值为0,且末尾循环体是‘++’,那么它就是一个计次循环。图6左半部分Bug范例当中共出现了六个循环语句,其中第二、三、四、六个循环语句出现了错误。根据上述条件,第一、二、三、四个循环语句被判定为计次循环,第五、六个循环语句被判定为目的循环。
步骤(2)对于计次循环,图1可以看出修复包含主要三个步骤,其中第一步是分析上下文识别程序员的计次习惯:图2对第一步修复过程进行了更加细致的描绘,根据末尾循环体是‘++’或者‘--’判定循环格式,若是‘++’,则识别单次表达式通常是赋值为0还是1,若是‘--’,则识别条件表达式谓词中的值通常是0还是1,然后根据习惯将对应的0改为1或1改为0。图6左半部分Bug范例当中,第一、二、三、四个循环语句的末尾循环体都是‘++’,所以观察它们的单次表达式的赋值是0还是1,第19行,第17行,第21行的三个计次循环语句都是从0开始循环的,而第13行的计次循环语句则是从1开始循环的,所以要将第13行修改为for(i=0;i<m;i++),修复结果如图6右半部分第13行所示。
步骤(3)从图1我们可以看出,若步骤(2)没有修复成功,则将条件表达式中的谓词替换为以下五种谓词之一,这里的谓词包括‘>’、‘>=、‘<’、‘<=、‘!=,图3特别突出,若末尾循环体是‘++’,则不考虑‘>’、‘>=,若末尾循环体是‘--’,则不考虑‘<’、‘<=。通过逐个替换测试的方法,依次将原来的谓词修改为上述五种谓词之一,直到获得正确的测试结果,来确定谓词到底要替换为哪一个。图6左半部分Bug范例当中,第三个循环语句的计次习惯符合程序员的习惯,步骤二的方式无法修复,就要根据它的末尾循环体是‘++’,确定它的谓词库包含‘<’,‘<=,‘!=’。首先尝试修改谓词为‘<’,发现可以修复,则确定将第17行修改为for(i=0;i<n;i++),修复结果如图6右半部分第17行所示。
步骤(4)从图1我们还可以看出,若步骤(3)依旧没有成功,则寻找特殊的常量或者变量,包括特殊的数字,const定义的常变量,#define宏定义的值,数组的长度,循环语句内if语句中条件表达式涉及到的值,循环语句前需要输入的值,函数参数值等,将他们的关键信息和数值集合成图4中提出的候补循环次数空间。图4显示用每个数值对应的关键信息和循环语句的中间循环体进行比对,将这些关键信息,根据大小写,拆分为多个词,只要中间循环体出现其中一个词一次,则给这个值记1分,最后根据总分进行排序。设定单次表达式赋值为0,条件表达式的谓词为‘<’,末尾循环体用‘++’,条件表达式的谓词后的值根据排序结果取前五个从高到低依次进行尝试,直到输出正确的测试结果。图6左半部分Bug范例当中,第四个循环语句的计次习惯符合程序员的习惯,谓词依次尝试了‘<’,‘<=,‘!=’都无法修复,则需要建立候补循环次数空间,这个空间包含了#define宏定义的(m,4),(n,5),因为中间循环体出现了b数组,数组要考虑它的完整信息即b[n],所以n记一分,m记0分,排序结果n在m之上,则修改第21行为for(i=0;i<n;i++),修复结果如图6右半部分第21行所示。
步骤(5)对于目的循环,图1中展示利用克隆检测技术,具体实施过程如图5所示,从当前程序中寻找中间循环体与当前要修复的循环语句中的中间循环体相似的循环语句,并摘取它的单次表达式,条件表达式和末尾循环体作为模板。将模板套入到当前循环语句,并识别原来的循环语句上述三个区域中是否有关键信息与中间循环体相同,若有相同部分,则对应的修改当前循环语句上述三个区域对应的关键信息使之与当前循环语句的中间循环体相同。图6左半部分Bug范例当中,通过克隆检测技术发现第五、六两个循环语句的中间循环体有很高的相似度,那么提取第五个循环语句的for(s=1;s<m;s=s+2)作为模板,套用到第六个循环语句,替换掉第30行。先比对第五个循环语句的for语句和中间循环体相同的关键信息,包括循环变量s,数组a[m],再比对两个循环语句的中间循环体这些关键信息对应的信息,包括循环变量他,数组b[n],然后将模板循环语句中的信息进行对应替换,s替换为t,m替换为n,即将第30行修改为for(t=1;t<n;t=t+2),修复结果如图6右半部分第30行所示。
Claims (1)
1.一种针对程序中循环问题的自动修复方法,其特征在于如下步骤:
(1)将循环语句分为两类,一类为计次循环,即程序员知道该语句要循环的次数,一类为目的循环,即该循环语句是为了达到某种结果,程序员并不知道要循环的准确次数;
(2)对于计次循环,分析上下文识别程序员的计次习惯:根据末尾循环体是‘++’或者‘--’判定循环格式,若是‘++’,则识别单次表达式通常是赋值为0还是1,若是‘--’,则识别条件表达式谓词中的值通常是0还是1,然后根据习惯将对应的0改为1或1改为0;
(3)若步骤二没有修复成功,则将条件表达式中的谓词替换为以下五种谓词之一,这里的谓词包括‘>’、‘>=’、‘<’、‘<=’、‘!=’,且若末尾循环体是‘++’,则不考虑‘>’、‘>=’,若末尾循环体是‘--’,则不考虑‘<’、‘<=’,通过逐个替换测试的方法,依次将原来的谓词修改为上述五种谓词之一,直到获得正确的测试结果,来确定谓词到底要替换为哪一个;
(4)若步骤(3)依旧没有成功,则寻找特殊的常量或者变量,包括特殊的数字,const定义的常变量,#define宏定义的值,数组的长度,循环语句内if语句中条件表达式涉及到的值,循环语句前需要输入的值,函数参数值,将他们的关键信息和数值集合成一个候补循环次数空间,用每个数值对应的关键信息和循环语句的中间循环体进行比对,将这些关键信息,根据大小写,拆分为多个词,只要中间循环体出现其中一个词一次,则给这个值记1分,最后根据总分进行排序;设定单次表达式赋值为0,条件表达式的谓词为‘<’,末尾循环体用‘++’,条件表达式的谓词后的值根据排序结果取前五个从高到低依次进行尝试,直到输出正确的测试结果;
(5)对于目的循环,利用克隆检测技术,从当前程序中寻找中间循环体与当前要修复的循环语句中的中间循环体相似的循环语句,并摘取它的单次表达式,条件表达式和末尾循环体作为模板;将模板套入到当前循环语句,并识别原来的循环语句中单次表达式,条件表达式和末尾循环体是否有关键信息与中间循环体相同,若有相同部分,则对应的修改当前循环语句中单次表达式,条件表达式和末尾循环体对应的关键信息使之与当前循环语句的中间循环体相同。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810047683.4A CN108228232B (zh) | 2018-01-12 | 2018-01-12 | 一种针对程序中循环问题的自动修复方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810047683.4A CN108228232B (zh) | 2018-01-12 | 2018-01-12 | 一种针对程序中循环问题的自动修复方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108228232A CN108228232A (zh) | 2018-06-29 |
CN108228232B true CN108228232B (zh) | 2021-04-30 |
Family
ID=62667488
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810047683.4A Active CN108228232B (zh) | 2018-01-12 | 2018-01-12 | 一种针对程序中循环问题的自动修复方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108228232B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112463424B (zh) * | 2020-11-13 | 2023-06-02 | 扬州大学 | 一种基于图的端到端程序修复方法 |
CN112528074B (zh) * | 2020-12-14 | 2023-06-16 | 扬州大学 | 一种知识图谱结合自编码机的电影推荐方法 |
CN113590167B (zh) * | 2021-07-09 | 2023-03-24 | 四川大学 | 一种面向对象程序中条件语句缺陷补丁生成与验证方法 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103559131A (zh) * | 2013-11-07 | 2014-02-05 | 中国科学院软件研究所 | 一种有效的层次化错误定位方法 |
CN104794059A (zh) * | 2015-05-08 | 2015-07-22 | 北京理工大学 | 一种基于函数调用记录的缺陷定位方法及装置 |
CN106156633A (zh) * | 2016-06-23 | 2016-11-23 | 扬州大学 | 面向软件修改的风险分析方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8621430B2 (en) * | 2011-03-03 | 2013-12-31 | International Business Machines Corporation | Method for code transformation supporting temporal abstraction of parameters |
-
2018
- 2018-01-12 CN CN201810047683.4A patent/CN108228232B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103559131A (zh) * | 2013-11-07 | 2014-02-05 | 中国科学院软件研究所 | 一种有效的层次化错误定位方法 |
CN104794059A (zh) * | 2015-05-08 | 2015-07-22 | 北京理工大学 | 一种基于函数调用记录的缺陷定位方法及装置 |
CN106156633A (zh) * | 2016-06-23 | 2016-11-23 | 扬州大学 | 面向软件修改的风险分析方法 |
Non-Patent Citations (3)
Title |
---|
Automatic Repair of Conditional;Jifeng Xuan等;《IEEE TRANSACTIONS ON SOFTWARE ENGINEERING》;20170131;1-22 * |
Automatic Repair of Infinite Loops;Sebastian R. Lamelas Marcote等;《Computer Science》;20150420;1-26 * |
自动程序修复方法研究述评;王赞等;《计算机学报》;20170728;1-23 * |
Also Published As
Publication number | Publication date |
---|---|
CN108228232A (zh) | 2018-06-29 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108932192B (zh) | 一种基于抽象语法树的Python程序类型缺陷检测方法 | |
CN109144882B (zh) | 一种基于程序不变量的软件故障定位方法及装置 | |
US20190317879A1 (en) | Deep learning for software defect identification | |
CN108228232B (zh) | 一种针对程序中循环问题的自动修复方法 | |
CN101866317A (zh) | 一种基于聚类分析的回归测试用例选择方法 | |
CN109492106B (zh) | 一种文本代码相结合的缺陷原因自动分类方法 | |
CN112463424B (zh) | 一种基于图的端到端程序修复方法 | |
CN107729258B (zh) | 一种面向软件版本问题的程序故障定位方法 | |
CN105808438A (zh) | 一种基于函数调用路径的测试用例复用方法 | |
CN111858323B (zh) | 一种基于代码表示学习的即时软件缺陷预测方法 | |
US20070245327A1 (en) | Method and System for Producing Process Flow Models from Source Code | |
CN110825642A (zh) | 一种基于深度学习的软件代码行级缺陷检测方法 | |
CN111913874B (zh) | 一种基于语法结构变更分析的软件缺陷溯源方法 | |
CN104750608A (zh) | 一种程序中基于动态符号执行的自动错误定位方法 | |
WO2016157563A1 (ja) | 自律型問題解決機 | |
CN117112400A (zh) | 测试用例自动生成平台 | |
CN114064472B (zh) | 基于代码表示的软件缺陷自动修复加速方法 | |
CN114398278A (zh) | 程序依赖图引导修复模板的空指针引用自动修复方法 | |
CN117390130A (zh) | 一种基于多模态表示的代码搜索方法 | |
CN104615535A (zh) | 一种基于扩展的数据流模型来生成测试用例的方法与装置 | |
CN117193733B (zh) | 示例库的构建、使用方法及生成的示例代码的评估方法 | |
CN117435246B (zh) | 一种基于马尔可夫链模型的代码克隆检测方法 | |
CN113591484B (zh) | 一种基于语义分析的专家系统规则库建立方法 | |
Cao et al. | Automatic Repair of Java Programs Weighted Fusion Similarity via Genetic Programming | |
WO2022226716A1 (zh) | 基于深度学习的Java程序内部注释的生成方法及系统 |
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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |