程序員的福音,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。
把這個程序和相應的測試輸入到 ACS 中,ACS 會自動生成第2、3 行的路徑,修復程序缺陷:
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,就一起開發了 Genprog。
而 ACS,在前人研究的基礎上大幅提升了準確率。在 Defects4J 基準上的測試結果顯示,ACS 生成的 23 個補丁中,有 18 個是正確的,準確率近 80%。
ACS 準確率的提升主要得益于有更多的信息來源,特別是網上的大量代碼。與以往的方法相比,ACS 有以下三種新的信息來源:
一是用局部性原則信息對補丁中的變量進行排序;
二是用自然語言分析技術來分析 Javadoc,然后用 Javadoc 中的信息來過濾不正確的補丁;
三是通過對網上的開源程序進行統計分析,發現對變量進行操作的條件概率,進而生成正確的補丁。
來自: 量子位