专栏名称: 机器之心
专业的人工智能媒体和产业服务平台
目录
相关文章推荐
爱可可-爱生活  ·  【[36星]ncnn-android-ppo ... ·  13 小时前  
宝玉xp  ·  转发微博-20250603202805 ·  昨天  
爱可可-爱生活  ·  《爱可可微博热门分享(6.2)》 ... ·  2 天前  
黄建同学  ·  互联网女王 Mary Meeker ... ·  2 天前  
黄建同学  ·  电子书 Machine Learning ... ·  2 天前  
51好读  ›  专栏  ›  机器之心

业界 | 自动修复Bug正确率达78.3%,北大、微软等提出ACS技术

机器之心  · 公众号  · AI  · 2017-08-08 12:39

正文

请到「今天看啥」查看全文



为此,北京大学、微软亚洲研究院和电子科技大学的研究人员联合开发了一种新技术 ACS (Accurate Condition Synthesis)。该技术可以全自动修复软件系统中的缺陷,无需用户干预。

比如,下面这段代码来源于 Apache Math 库,用于求两个数的最小公倍数。该段代码采用了绝对值函数 Math.abs 来保证返回的值是一个正数。但由于实现上的缺陷,在某些输入的时候会返回负数。

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

return lcm;


这个缺陷的根源是因为负数的数值范围比正数多一个,所以当传给 Math.abs 的值是 Integer.MIN_VALUE 时,Math.abs 并不能将输入转换成正数,进而导致函数产生负数的输出。一个正确的实现应该在这个时候返回 ArithmeticException()。

现在假设有一个测试来捕获这个错误,该测试的输入为 a=Integer.MIN_VALUE 和 b=1,期望的输出为 ArithmeticException。很显然,这个测试将在该程序上运行失败,因为并没有异常被抛出。

但当我们将这个程序和相应的测试提供给 ACS 时,ACS 将会自动生成如下补丁,准确的修复了该缺陷:


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

+ if (lcm == Integer.MIN_VALUE) {

+ throw new ArithmeticException();

+ }

return lcm;


事实上,缺陷修复技术由来已久。自 2009 年的 GenProg 技术以来,学术界已经提出了数十种不同类别的缺陷修复方法。但传统的缺陷修复技术一直面临一个问题——缺陷修复正确率非常低。这是因为传统缺陷修复系统以通过测试为目标,但实际软件系统中,测试往往数量有限,通过测试并不意味着程序就是正确的。

比如上面这个例子,现有系统可能生成如下补丁:


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

+ if (b == 1) {

+ throw new ArithmeticException();

+ }

return lcm;


甚至如下补丁:







请到「今天看啥」查看全文