北(bei)京大學(xue)、微軟(ruan)亞洲(zhou)研(yan)究院和中(zhong)(zhong)國電(dian)子(zi)科技大學(xue)就一同(tong)嘗試著讓AI找bug。微軟(ruan)亞洲(zhou)研(yan)究院的(de)(de)Lily Sun正(zheng)在微軟(ruan)官(guan)方博客上引見稱,他們開辟的(de)(de)正(zheng)確狀況體(ti)(ti)系(xi)(Accurate Condition System, ACS),能正(zheng)在人類不加干涉的(de)(de)情況下主動(dong)修復軟(ruan)件體(ti)(ti)系(xi)中(zhong)(zhong)的(de)(de)Bug。
他們關于ACS的論(lun)文Precise Condition Synthesis for Program Repair頒(ban)發(fa)正在天下軟件工(gong)程大會ICSE 2017上。
ACS會主動(dong)修復(fu)什么(me)樣的bug呢?Lily Sun舉了個例子:
int lcm=Math.abs(mulAndCheck(a/gdc(a,b), b));
return lcm;
這(zhe)是Apache Math中的(de)一段代碼(ma),用來盤算兩(liang)個數(shu)的(de)最小公倍數(shu),而且引入了Math.abs來確保返回的(de)值是正數(shu)。可是,這(zhe)個法式有缺點,有時(shi)候仍是會返回負值。
我們(men)能夠創立一個(ge)(ge)測試來找(zhao)到個(ge)(ge)中(zhong)的毛病。測試的輸入(ru)是(shi)a=Integer.MIN_VALUE、b=1,預期的輸出是(shi)throw ArithmeticException。
把這(zhe)個法式和相應的(de)測試輸入到ACS中(zhong),ACS會主動生成第2、3行(xing)的(de)途徑,修復法式缺點(dian):
int lcm=Math.abs(mulAndCheck(a/gdc(a,b), b));
+ if (lcm == Integer.MIN_VALUE) {
+ throw new ArithmeticException();
+ }
return lcm;
讓算(suan)法本人改(gai)bug這件事,由2009年最(zui)先就(jiu)有研討,弗吉尼亞(ya)大(da)學(xue)(xue)計(ji)算(suan)機(ji)系的Westley Weimer、新墨西哥(ge)大(da)學(xue)(xue)的Stephanie Forrest和卡耐(nai)基梅隆大(da)學(xue)(xue)的Claire Le Goues,就(jiu)一(yi)起開(kai)發(fa)了Genprog。
而ACS,正在前人(ren)研討的基礎(chu)上大(da)幅提升了準確度。正在Defects4J基準上的測試成(cheng)(cheng)果表現,ACS生成(cheng)(cheng)的23個補釘中(zhong),有18個是(shi)精確的,準確度近80%。
ACS準確度的(de)(de)提拔關鍵得(de)益(yi)于有更多的(de)(de)信息泉源,特別是(shi)網上(shang)的(de)(de)大(da)批代碼(ma)。取以往的(de)(de)方(fang)式相比,ACS有以下(xia)三種新的(de)(de)信息泉源:
一是用(yong)局部性標(biao)準信息對補釘(ding)中的變量(liang)開展排序;
二是用自然(ran)語言闡(chan)發手藝來(lai)闡(chan)發Javadoc,然(ran)后(hou)用Javadoc中的(de)信息來(lai)過濾不(bu)正確的(de)補(bu)釘;
三是(shi)經過對網上的(de)開源步伐開展統計分析,發明(ming)對變量開展操縱的(de)前提幾率,進而生成精確(que)的(de)補釘。