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


浙公網(wǎng)安備 33010602011771號