2016年自动修复综述——自动程序修复方法研究进展 [软件学报 Journal of Software 2016]
前言
本文旨在介紹2016年軟件學(xué)報(bào)文章——自動(dòng)程序修復(fù)方法研究進(jìn)展。
1 作者
中文引用格式: 玄躋峰,任志磊,王子元,謝曉園,江賀.自動(dòng)程序修復(fù)方法研究進(jìn)展.軟件學(xué)報(bào),2016,27(4):771?784. http://www.
jos.org.cn/1000-9825/4972.htm
英文引用格式: Xuan JF, Ren ZL, Wang ZY, Xie XY, Jiang H. Progress on approaches to automatic program repair. Ruan Jian
Xue Bao/Journal of Software, 2016,27(4):771?784 (in Chinese). http://www.jos.org.cn/1000-9825/4972.htm
2 摘要內(nèi)容
回顧了基于測(cè)試集的程序修復(fù)的現(xiàn)有文獻(xiàn),按照自動(dòng)修復(fù)方法和實(shí)證基礎(chǔ)兩個(gè)方面陳述了研究進(jìn)展.
首先,將已有的自動(dòng)修復(fù)方法劃分為 3類, 分別是基于搜索的、基于代碼窮舉的和基于約束求解的補(bǔ)丁生成方法;
其次,細(xì)致地描述了程序修復(fù)的實(shí)證研究基礎(chǔ)以及該研究領(lǐng)域中的爭(zhēng)議;
然后,簡(jiǎn)要介紹了程序修復(fù)的相關(guān)技術(shù)作為修復(fù)方法的補(bǔ)充;最后做出總結(jié),描述了面臨的機(jī)遇和挑戰(zhàn).
3 introduction
1) 歷史數(shù)據(jù)表明,超過45%的現(xiàn)代軟件開發(fā)成本消耗于定位和修復(fù) bug 過程中。
[1] Pressman RS. Software Engineering: A Practitioner’s Approach. 7th ed., New York: McGraw-Hill, 2010. 437?443.
文獻(xiàn)引用的好棒
2)隨著軟件測(cè)試和調(diào)試技術(shù)的提高,自動(dòng)化的程序 bug 定位技術(shù)已經(jīng)得到了一定的
研究和發(fā)展[2,3],然而自動(dòng)化的程序 bug 修復(fù)方法仍處在初級(jí)階段.隨著程序 bug 數(shù)量的日益積累,自動(dòng)修復(fù)技術(shù)
的深入研究及應(yīng)用已迫在眉睫.
**就是說現(xiàn)在缺陷定位發(fā)展的比APR成熟一點(diǎn)。
好像確實(shí)是這樣**
[2] Xie X, Chen TY, Kuo FC, Xu B. A theoretical analysis of the risk evaluation formulas for spectrum-based fault localization. ACM
Trans. on Software Engineering and Methodology, 2013,22(4):31:1?31:40. [doi: 10.1145/2522920.2522924]
[3] Wen WZ, Li BX, Sun XB, Liu CC. Technique of software fault localization based on hierarchical slicing spectrum. Ruan Jian Xue
Bao/Journal of Software, 2013,24(5):977?992 (in Chinese with English abstract). http://www.jos.org.cn/1000-9825/4342.htm [doi:
10.3724/SP.J.1001.2013.04342]
疑問:為什么要引用文獻(xiàn)[3]呢,是因?yàn)橥瑯觼碜詊ournal of software嗎
3)自動(dòng)生成程序補(bǔ)丁(patch),進(jìn)而修復(fù)程序中的錯(cuò)誤.修復(fù)中產(chǎn)生的程序補(bǔ)丁既可以自動(dòng)添加
到程序中,也可以用于指導(dǎo)開發(fā)者繼續(xù)改進(jìn)代碼.與現(xiàn)代軟件工業(yè)中廣泛出現(xiàn)的敏捷開發(fā)(agile development)和
持續(xù)集成(continuous integration)相結(jié)合,自動(dòng)程序修復(fù)方法將有效地降低程序修復(fù)的成本.從技術(shù)角度來看,研
究者將程序修復(fù)看作從潛在的搜索空間(search space)中搜索補(bǔ)丁的過程,而優(yōu)秀的修復(fù)技術(shù)可以大幅度提高補(bǔ)
丁搜索的準(zhǔn)確率,并減少用于搜索的時(shí)間消耗[5,6].該研究思路與基于搜索的軟件工程契合[7].例如,自動(dòng)程序修
復(fù)中的先驅(qū)方法 GenProg 就是一種基于遺傳規(guī)劃(genetic programming)的 C 程序修復(fù)算法[8]
這里講了:自動(dòng)生成的補(bǔ)丁的用處 + 工業(yè)化潛力 + 基于搜索的軟件工程 + 補(bǔ)丁搜索、搜索空間(search space)
4 自動(dòng)修復(fù)面臨什么挑戰(zhàn)??
- 一方面,研究者嘗試設(shè)計(jì)算法為程序自動(dòng)生成補(bǔ)丁,而所生成的補(bǔ)丁與真實(shí)人工添加的補(bǔ)丁尚存較大
差別; - 另一方面,研究者正在探索自動(dòng)修復(fù)的實(shí)證基礎(chǔ)(empirical foundation),然而該研究并非一帆風(fēng)順,曾在
2014 年[9]和 2015 年[10,11]掀起了兩次領(lǐng)域內(nèi)的學(xué)術(shù)爭(zhēng)論
第一個(gè),經(jīng)常會(huì)得到可行但非正確補(bǔ)丁;
第二個(gè),我感覺和第一個(gè)一樣的。
[9] Monperrus M. A critical review of automatic patch generation learned from human-written patches: Essay on the problem statement
and the evaluation of automatic software repair. In: Proc. of the 36th Int’l Conf. on Software Engineering (ICSE). 2014. 234?242.
[doi: 10.1145/2568225.2568324]
[10] Qi Z, Long F, Achour S, Rinard M. An analysis of patch plausibility and correctness for generate-and-validate patch generation
systems. In: Proc. of the Int’l Symp. on Software Testing and Analysis (ISSTA). 2015. 24?36. [doi: 10.1145/2771783.2771791]
[11] Smith EK, Barr E, Le Goues C, Brun Y. Is the cure worse than the disease? Overfitting in automated program repair. In: Proc. of
the European Software Engineering Conf. and ACM SIGSOFT Int’l Symp. on Foundations of Software Engineering (ESEC/FSE).
2015. 532?543. [doi: 10.1145/2786805.2786825]
這三篇文獻(xiàn)都值得認(rèn)真一讀,無一不是頂會(huì)
5 截至本文成文之際(2015 年 8 月 31 日),自動(dòng)程序修復(fù)方法尚未有工業(yè)應(yīng)用.
說明,工業(yè)級(jí)應(yīng)用確實(shí)難度太大。
6 APR的修復(fù)框架,我覺得很有用
APR修復(fù)框架,當(dāng)然,是基于測(cè)試用例集的APR
7 震驚,kali竟然沒有做缺陷定位,而且SemFix竟然沒有補(bǔ)丁驗(yàn)證。
需要注意的是:其一,基于代碼窮舉的方法和基于約束求解的方法也可以看作某種程度的搜索,但本文遵從
基于搜索的軟件工程領(lǐng)域的約定,只將第 1 類方法稱為基于搜索的補(bǔ)丁生成方法;其二,圖 1 的流程是經(jīng)過總結(jié)
已有方法而得到的大概流程 [24,26].在一些修復(fù)算法中,某些步驟可能被簡(jiǎn)化.例如:在基于代碼窮舉的方法
Kali[10]中,所有的程序語句沒有經(jīng)過故障定位,而按照自然順序直接排列;而在基于約束求解的方法 SemFix[22]
中,在補(bǔ)丁生成后無需進(jìn)行補(bǔ)丁的驗(yàn)證.第 3 節(jié)詳細(xì)介紹修復(fù)方法
我感覺這句話對(duì)我很有用
8 想問下基于約束求解的方法到底咋實(shí)現(xiàn)的,還不用補(bǔ)丁驗(yàn)證
基于搜索的方法是程序
修復(fù)中的主要部分,尤其在領(lǐng)域創(chuàng)始之初更占有重要地位,代表算法包括基于遺傳規(guī)劃的抽象語法樹修復(fù)算法
GenProg[5]、基于程序等價(jià)性的遺傳修復(fù)算法 AE[20]、基于隨機(jī)搜索的修復(fù)算法 RSRepair[16]等.基于代碼窮舉
的方法無差別地變異全部可疑語句,同時(shí),有策略地窮舉可能出現(xiàn)的代碼修改,追求補(bǔ)丁的有效性而忽略算法效
率.這類算法不多,代表算法包括程序變異算法[21]、代碼消除算法 Kali[10].基于約束求解的方法,顧名思義,將補(bǔ)
丁生成轉(zhuǎn)換為約束求解問題,應(yīng)用求解器直接計(jì)算可行解(feasible solution),進(jìn)而轉(zhuǎn)換為最終補(bǔ)丁,代表算法包
括程序語義修復(fù) SemFix[22]、補(bǔ)丁簡(jiǎn)化算法 DirectFix[23]、條件 bug 修復(fù) Nopol[24,25]等.
9 文章已經(jīng)意識(shí)到了補(bǔ)丁正確性的問題,看來補(bǔ)丁正確性早有關(guān)注
能夠通過測(cè)試集的補(bǔ)丁并不一定正確.正確性(correctness)指的是修復(fù)后的程序達(dá)到了預(yù)期的行為,即,程序
的輸出能夠滿足潛在的測(cè)試預(yù)言(test oracle).例如,一個(gè)修復(fù)劃分三角形類別程序的補(bǔ)丁正確,指的是程序可以
無誤地劃分任何潛在的三角形類別,而不是僅僅滿足有限數(shù)量的測(cè)試用例的通過.正確性目前還不能通過自動(dòng)
技術(shù)完成,只能手動(dòng)驗(yàn)證.近期的一些工作采用了正確性作為評(píng)價(jià)標(biāo)準(zhǔn)[10,25,26].
[10] Qi Z, Long F, Achour S, Rinard M. An analysis of patch plausibility and correctness for generate-and-validate patch generation
systems. In: Proc. of the Int’l Symp. on Software Testing and Analysis (ISSTA). 2015. 24?36. [doi: 10.1145/2771783.2771791]
[25] Xuan JF, Martinez M, DeMarco F, Clément M, Lamelas-Marcote S, Durieux T, Le Berre D, Monperrus M. Nopol: Automatic repair
of conditional statement bugs in Java programs. Technical Report, INRIA, 2015. 1?22.
[26] Martinez T, Durieux T, Xuan JF, Monperrus M. Automatic repair of real bugs in Java: A large-scale experiment on the Defects4J
dataset. Technical Report, arXiv:1505.07002, ArXiv, 2015. 1?11.
10 這些文章都值得一看
2012 年,Qi 等人[12,13]提出通過弱重編譯(weak recompilation)的方法優(yōu)化 GenProg 的修復(fù)效率,能夠較早地
找到補(bǔ)丁.其后的 2013 年,他們[14]應(yīng)用故障記錄的測(cè)試用例排序(fault-recorded test prioritization)方法進(jìn)一步提
高了修復(fù)效率.此外,他們[15]還通過程序修復(fù)的結(jié)果來評(píng)估故障定位方法.
[12] Qi Y, Mao X, Lei Y. Making automatic repair for large-scale programs more efficient using weak recompilation. In: Proc. of the
IEEE Int’l Conf. on Software Maintenance (ICSM). 2012. 254?263. [doi: 10.1109/ICSM.2012.6405280]
[13] Qi Y, Mao X, Wen Y, Dai Z, Gu B. More efficient automatic repair of large-scale programs using weak recompilation. Science
China Information Sciences, 2012,55(12):2785?2799. [doi: 10.1007/s11432-012-4741-1]
[14] Qi Y, Mao X, Lei Y. Efficient automated program repair through fault-recorded testing prioritization. In: Proc. of the IEEE Int’l
Conf. on Software Maintenance (ICSM). 2013. 180?189. [doi: 10.1109/ICSM.2013.29]
[15] Qi Y, Mao X, Lei Y, Wang C. Using automated program repair for evaluating the effectiveness of fault localization techniques. In:
Proc. of the Int’l Symp. on Software Testing and Analysis (ISSTA). 2013. 191?201. [doi: 10.1145/2483760.2483785]
[16] Qi Y, Mao X, Lei Y, Dai Z, Wang C. The strength of random search on automated program repair. In: Proc. of the 36th Int’l Conf.
on Software Engineering (ICSE). 2014. 254?265. [doi: 10.1145/2568225.2568254]
11 APR的發(fā)展
2013 年,Kim 等人[6]從人工書寫的補(bǔ)丁中學(xué)習(xí)代碼模式,并將模式與 GenProg 相融合生成補(bǔ)丁.該方法生成
的補(bǔ)丁可以避免出現(xiàn)通過優(yōu)化算法而得到的無意義的補(bǔ)丁.Weimer 等人[20]考慮增強(qiáng)發(fā)現(xiàn)潛在補(bǔ)丁的能力,提出
了基于程序等價(jià)性(program equivalence)的遺傳修復(fù)算法 AE.
2014 年,Qi 等人[16]通過研究發(fā)現(xiàn),GenProg 算法中的遺傳規(guī)劃算法對(duì)于高效生成補(bǔ)丁并不奏效.他們用隨機(jī)
搜索(random search)替換了遺傳算法,并設(shè)計(jì)了 RSRepair 用于程序修復(fù).實(shí)驗(yàn)結(jié)果表明:相對(duì)于 GenProg 方法,
RSRepair 能夠減少生成補(bǔ)丁的時(shí)間消耗.
2015 年,Martinez 和 Monperrus[33]通過挖掘程序修復(fù)的歷史數(shù)據(jù),建立了概率模型預(yù)測(cè)新 bug 的修復(fù).超過 6
萬個(gè) Java 語言的代碼變更提交(code commit)被轉(zhuǎn)換為抽象語法樹,用于修復(fù)概率模型的建立.同是 2015 年,
Long 和 Rinard[34]提出了 Prophet,一種學(xué)習(xí)現(xiàn)有補(bǔ)丁以指導(dǎo)未來補(bǔ)丁排序的算法.它通過最大似然(maximum
likelihood)模型識(shí)別最可能成功的補(bǔ)丁的概率,其算法本質(zhì)是補(bǔ)丁排序的過程.該方法可以修復(fù) 69 個(gè)真實(shí) bug
中的 15 個(gè),具有一定的準(zhǔn)確度
我感覺這些都可以看一看。
12 基于約束求解的方法——原理
2012 年,該類算法的先驅(qū),Nguyen 等人提出 SemFix[22],一種 C 程序的基于約束的語義修復(fù)算法.該算法將測(cè)
試用例轉(zhuǎn)換為約束,并應(yīng)用 SMT(satisfiability modulo theories)求解器求解,最終轉(zhuǎn)換為補(bǔ)丁并輸出.生成補(bǔ)丁的
過程源自基于組件的程序合成算法(component based program synthesis)[37],該算法將備選語句作為組件,提取預(yù)
期的輸入輸出,并建立約束求解模型.另外,SemFix 采用 Tarantula 算法[38]定位潛在的 bug 位置.與基于搜索的方
法,如 GenProg 不同,SemFix 不需要為生成的補(bǔ)丁調(diào)用測(cè)試用例驗(yàn)證修復(fù)性;約束機(jī)制已將測(cè)試用例作為輸入,
并進(jìn)而轉(zhuǎn)化為解輸出.
2014 年,DeMarco 和 Xuan 等人[24,25]設(shè)計(jì)了 Nopol,一種面向 Java 條件語句 bug 的基于約束求解的方法.該
方法針對(duì)錯(cuò)誤條件或條件語句缺失這兩種常見 bug 進(jìn)行修復(fù).過程中,采用天使定位(angelic fix localization)算
法[39]確定潛在修復(fù)的位置.與 SemFix 不同,Nopol 中的天使定位算法只針對(duì)條件值(即布爾值),其搜索空間小,
計(jì)算成本低,可以應(yīng)用于大規(guī)模程序.該算法中采用利于面向?qū)ο蠊收隙ㄎ坏?Ochiai 算法[40]獲取被修復(fù)語句的
排序.實(shí)驗(yàn)中,Nopol 可以修復(fù) 22 個(gè)大規(guī)模 Java 程序的真實(shí) bug 中的 17 個(gè),具有較高的準(zhǔn)確率.
2015 年,Mechtaev 等人提出了補(bǔ)丁簡(jiǎn)化算法 DirectFix[23].該方法將補(bǔ)丁中潛在的程序組件轉(zhuǎn)換為最大可滿足性問題(maximum satisfiability,即 MaxSat),求解后轉(zhuǎn)換為具體的簡(jiǎn)化后的補(bǔ)丁.
Ke 等人[41]設(shè)計(jì)了 SearchRepair,一種基于語義代碼搜索(semantic code search)的修復(fù)方法.該方法通過將數(shù)
據(jù)庫中的代碼段編碼為基于輸入輸出的 SMT 模型中的約束,進(jìn)而求解補(bǔ)丁.相對(duì)于已有算法 GenProg、 AE 和
RSRepair,算法 SearchRepair 可以獲得更多的補(bǔ)丁,且補(bǔ)丁質(zhì)量較高
13 震驚,原來Nopol如12 中所說: 采用天使定位算法只針對(duì)條件值,使得搜索空間變小,計(jì)算成本低。。。確實(shí)創(chuàng)新了
從這里面我學(xué)到了:
1)因?yàn)榧s束求解,如果不只針對(duì)條件值的話,會(huì)導(dǎo)致搜索空間特別大,這樣的話確實(shí)不適用于大規(guī)模缺陷程序修復(fù)
2)原來idea可以這樣出來,看來平時(shí)得多思考,多讀書、論文。
原來原理就是:(參考SemFix的描述)通過將測(cè)試用例轉(zhuǎn)化成約束。。。進(jìn)行求解。
總結(jié)
以上是生活随笔為你收集整理的2016年自动修复综述——自动程序修复方法研究进展 [软件学报 Journal of Software 2016]的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 英语谚语500句(四)
- 下一篇: 我桌面上的计算机图标打不开了,我桌面上的