程序員的福音,AI能夠自動修復bug了!

人工智能徹底學會本身編程,可能提及來還有一種科幻感,但 AI 幫程序員找 bug 這件事,已經達到了不錯的水平。程序員


 

 

北京大學、微軟亞洲研究院和中國電子科技大學就一塊兒嘗試着讓 AI 找 bug。微軟亞洲研究院的 Lily Sun 在微軟官方博客上介紹稱,他們開發的精確狀態系統(Accurate Condition System, ACS),能在人類不加干預的狀況下自動修復軟件系統中的 Bug。算法

 

他們關於 ACS 的論文 Precise Condition Synthesis for Program Repair 發表在世界軟件工程大會 ICSE 2017 上。編程

ACS 會自動修復什麼樣的 bug 呢?Lily Sun 舉了個例子:測試

 

int lcm=Math.abs (mulAndCheck (a/gdc (a,b), b));
return lcm;

 

這是 Apache Math 中的一段代碼,用來計算兩個數的最小公倍數,而且引入了 Math.abs 來確保返回的值是正數。可是,這個程序有缺陷,有時候仍是會返回負值。人工智能

 

咱們能夠建立一個測試來找到其中的錯誤。測試的輸入是a=Integer.MIN_VALUE、b=1,預期的輸出是 throw ArithmeticException。rest

 

把這個程序和相應的測試輸入到 ACS 中,ACS 會自動生成第二、3 行的路徑,修復程序缺陷:htm

 

int lcm=Math.abs (mulAndCheck (a/gdc (a,b), b));
+ if (lcm == Integer.MIN_VALUE) {
+ throw new ArithmeticException ();
+ }
return lcm;

 

讓算法本身改 bug 這件事,從 2009 年開始就有研究,弗吉尼亞大學計算機系的 Westley Weimer、新墨西哥大學的 Stephanie Forrest 和卡耐基梅隆大學的 Claire Le Goues,就一塊兒開發了 Genprogblog

 

而 ACS,在前人研究的基礎上大幅提高了準確率。在 Defects4J 基準上的測試結果顯示,ACS 生成的 23 個補丁中,有 18 個是正確的,準確率近 80%。排序

 

ACS 準確率的提高主要得益於有更多的信息來源,特別是網上的大量代碼。與以往的方法相比,ACS 有如下三種新的信息來源:ci

 

一是用局部性原則信息對補丁中的變量進行排序;

 

二是用天然語言分析技術來分析 Javadoc,而後用 Javadoc 中的信息來過濾不正確的補丁;

 

三是經過對網上的開源程序進行統計分析,發現對變量進行操做的條件機率,進而生成正確的補丁。

相關文章
相關標籤/搜索