程序員的福音,AI可以自動修復(fù)bug了!
人工智能完全學(xué)會自己編程,可能說起來還有一種科幻感,但AI幫程序員找bug這件事,已經(jīng)達到了不錯的水平。
北京大學(xué)、微軟亞洲研究院和中國電子科技大學(xué)就一起嘗試著讓AI找bug。微軟亞洲研究院的LilySun在微軟官方博客上介紹稱,他們開發(fā)的精確狀態(tài)系統(tǒng)(AccurateConditionSystem,ACS),工業(yè)機器人維修,能在人類不加干預(yù)的情況下自動修復(fù)軟件系統(tǒng)中的Bug。
他們關(guān)于ACS的論文PreciseConditionSynthesisforProgramRepair發(fā)表在世界軟件工程大會ICSE2017上。
ACS會自動修復(fù)什么樣的bug呢?LilySun舉了個例子:
intlcm=Math.abs(mulAndCheck(a/gdc(a,b),b));
returnlcm;
這是ApacheMath中的一段代碼,用來計算兩個數(shù)的最小公倍數(shù),并且引入了Math.abs來確保返回的值是正數(shù)。但是,這個程序有缺陷,有時候還是會返回負值。
我們可以創(chuàng)建一個測試來找到其中的錯誤。測試的輸入是a=Integer.MIN_VALUE、b=1,預(yù)期的輸出是throwArithmeticException。
把這個程序和相應(yīng)的測試輸入到ACS中,ACS會自動生成第2、3行的路徑,修復(fù)程序缺陷:
intlcm=Math.abs(mulAndCheck(a/gdc(a,b),b));
+if(lcm==Integer.MIN_VALUE){
+thrownewArithmeticException();
+}
returnlcm;
讓算法自己改bug這件事,從2009年開始就有研究,弗吉尼亞大學(xué)計算機系的WestleyWeimer、新墨西哥大學(xué)的StephanieForrest和卡耐基梅隆大學(xué)的ClaireLeGoues,庫卡機器人,就一起開發(fā)了Genprog。
而ACS,www.whsntf.cn,在前人研究的基礎(chǔ)上大幅提升了準(zhǔn)確率。在Defects4J基準(zhǔn)上的測試結(jié)果顯示,ACS生成的23個補丁中,有18個是正確的,準(zhǔn)確率近80%。
ACS準(zhǔn)確率的提升主要得益于有更多的信息來源,特別是網(wǎng)上的大量代碼。與以往的方法相比,ACS有以下三種新的信息來源:
一是用局部性原則信息對補丁中的變量進行排序;
二是用自然語言分析技術(shù)來分析Javadoc,然后用Javadoc中的信息來過濾不正確的補;
三是通過對網(wǎng)上的開源程序進行統(tǒng)計分析,發(fā)現(xiàn)對變量進行操作的條件概率,進而生成正確的補丁。