CN108228232A - 一种针对程序中循环问题的自动修复方法 - Google Patents

一种针对程序中循环问题的自动修复方法 Download PDF

Info

Publication number
CN108228232A
CN108228232A CN201810047683.4A CN201810047683A CN108228232A CN 108228232 A CN108228232 A CN 108228232A CN 201810047683 A CN201810047683 A CN 201810047683A CN 108228232 A CN108228232 A CN 108228232A
Authority
CN
China
Prior art keywords
statement
value
predicate
cycle
metering
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.)
Granted
Application number
CN201810047683.4A
Other languages
English (en)
Other versions
CN108228232B (zh
Inventor
孙小兵
郑轩昂
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Yangzhou University
Original Assignee
Yangzhou University
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Yangzhou University filed Critical Yangzhou University
Priority to CN201810047683.4A priority Critical patent/CN108228232B/zh
Publication of CN108228232A publication Critical patent/CN108228232A/zh
Application granted granted Critical
Publication of CN108228232B publication Critical patent/CN108228232B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/75Structural analysis for program understanding
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/72Code refactoring
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/75Structural analysis for program understanding
    • G06F8/751Code clone detection

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Debugging And Monitoring (AREA)

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)对于目的循环,利用克隆检测技术,从当前程序中寻找中间循环体与当前要修复的循环语句中的中间循环体相似的循环语句,并摘取它的单次表达式,条件表达式和末尾循环体作为模板;将模板套入到当前循环语句,并识别原来的循环语句上述三个区域中是否有关键信息与中间循环体相同,若有相同部分,则对应的修改当前循环语句上述三个区域对应的关键信息使之与当前循环语句的中间循环体相同。
CN201810047683.4A 2018-01-12 2018-01-12 一种针对程序中循环问题的自动修复方法 Active CN108228232B (zh)

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 true CN108228232A (zh) 2018-06-29
CN108228232B 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)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112463424A (zh) * 2020-11-13 2021-03-09 扬州大学 一种基于图的端到端程序修复方法
CN112528074A (zh) * 2020-12-14 2021-03-19 扬州大学 一种知识图谱结合自编码机的电影推荐方法
CN113590167A (zh) * 2021-07-09 2021-11-02 四川大学 一种面向对象程序中条件语句缺陷补丁生成与验证方法

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20120227029A1 (en) * 2011-03-03 2012-09-06 International Business Machines Corporation Method for code transformation supporting temporal abstraction of parameters
CN103559131A (zh) * 2013-11-07 2014-02-05 中国科学院软件研究所 一种有效的层次化错误定位方法
CN104794059A (zh) * 2015-05-08 2015-07-22 北京理工大学 一种基于函数调用记录的缺陷定位方法及装置
CN106156633A (zh) * 2016-06-23 2016-11-23 扬州大学 面向软件修改的风险分析方法

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20120227029A1 (en) * 2011-03-03 2012-09-06 International Business Machines Corporation Method for code transformation supporting temporal abstraction of parameters
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)

* Cited by examiner, † Cited by third party
Title
JIFENG XUAN等: "Automatic Repair of Conditional", 《IEEE TRANSACTIONS ON SOFTWARE ENGINEERING》 *
SEBASTIAN R. LAMELAS MARCOTE等: "Automatic Repair of Infinite Loops", 《COMPUTER SCIENCE》 *
王赞等: "自动程序修复方法研究述评", 《计算机学报》 *

Cited By (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112463424A (zh) * 2020-11-13 2021-03-09 扬州大学 一种基于图的端到端程序修复方法
CN112463424B (zh) * 2020-11-13 2023-06-02 扬州大学 一种基于图的端到端程序修复方法
CN112528074A (zh) * 2020-12-14 2021-03-19 扬州大学 一种知识图谱结合自编码机的电影推荐方法
CN112528074B (zh) * 2020-12-14 2023-06-16 扬州大学 一种知识图谱结合自编码机的电影推荐方法
CN113590167A (zh) * 2021-07-09 2021-11-02 四川大学 一种面向对象程序中条件语句缺陷补丁生成与验证方法
CN113590167B (zh) * 2021-07-09 2023-03-24 四川大学 一种面向对象程序中条件语句缺陷补丁生成与验证方法

Also Published As

Publication number Publication date
CN108228232B (zh) 2021-04-30

Similar Documents

Publication Publication Date Title
CN107832229B (zh) 一种基于nlp的系统测试用例自动生成方法
CN108228232A (zh) 一种针对程序中循环问题的自动修复方法
JP5963328B2 (ja) 生成装置、生成方法、およびプログラム
US4860203A (en) Apparatus and method for extracting documentation text from a source code program
CN111324647A (zh) 一种生成etl代码的方法及装置
CN104484269A (zh) 一种自动生成测试脚本的方法
CN103049458B (zh) 一种修正用户词库的方法和系统
CN101071378A (zh) 源代码生成方法、设备和程序
CN106874244A (zh) 一种基于工作序列的文档自动生成模型的构建方法
Fu et al. Chinese grammatical error diagnosis using statistical and prior knowledge driven features with probabilistic ensemble enhancement
CN113076133B (zh) 基于深度学习的Java程序内部注释的生成方法及系统
CN116776895A (zh) 一种面向api推荐的知识引导大型语言模型查询澄清方法及系统
Karnalim Promoting code quality via automated feedback on student submissions
CN101017397A (zh) 计算机汉字输入系统及输入方法
CN113377433B (zh) 半导体工艺的执行方法
CN102841988B (zh) 一种对核酸序列信息进行匹配的系统和方法
CN108170466A (zh) 一种基于程序合成的c/c++程序缺陷自动修复方法
CN109918100B (zh) 一种面向版本缺陷的基于修复模式的修复推荐方法
CN111797511A (zh) 一种核电站高精度高保真实时仿真和行为预测方法及装置
CN115827499A (zh) 一种ui自动化测试方法
CN103177064A (zh) 一种自动取录电子文档中指定内容的方法
CN113555130A (zh) 一种基于案例推理的中医临床决策支持系统的构建方法
Wang et al. Data-driven feedback generation for introductory programming exercises
US7120616B2 (en) Method for specifying, executing and analyzing method sequences for recognition
CN109542768A (zh) 一种基于Labview的多国语言自动检测方法

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