让AI自动修复程序中的bug:微软亚洲研究院新研究 | 附论文
李林 编译自 微软官方博客 量子位 报道 | 公众号 QbitAI
人工智能完全学会自己编程,可能说起来还有一种科幻感,但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(http://dijkstra.cs.virginia.edu/genprog/)。
而ACS,在前人研究的基础上大幅提升了准确率。在Defects4J基准上的测试结果显示,ACS生成的23个补丁中,有18个是正确的,准确率近80%。
ACS准确率的提升主要得益于有更多的信息来源,特别是网上的大量代码。与以往的方法相比,ACS有以下三种新的信息来源:
一是用局部性原则信息对补丁中的变量进行排序;
二是用自然语言分析技术来分析Javadoc,然后用Javadoc中的信息来过滤不正确的补丁;
三是通过对网上的开源程序进行统计分析,发现对变量进行操作的条件概率,进而生成正确的补丁。
论文地址: https://www.microsoft.com/en-us/research/publication/precise-condition-synthesis-program-repair/
△ 论文部分作者:微软亚洲研究院Shi Han(左一)、微软亚洲研究院Lily Sun(中)、北京大学熊英飞(右)
- 在Keras+TF环境中,用迁移学习和微调做专属图像识别系统
- Tensorflow的LRN是怎么做的
- 存储Tensorflow训练网络的参数
- 用Ansible部署ELK STACK
- 十六个有用的Linux命令行技巧
- keras系列︱深度学习五款常用的已训练模型
- 基于VGG19的识别中国人、韩国人、日本人分类器
- 机器学习算法GBDT的面试要点总结
- 了解、接受和利用Java中的Optional (类)
- 一个强化学习 Q-learning 算法的简明教程
- 天池大赛—商场中精确定位用户所在店铺 作品分享
- 代码实战:从单体式应用到微服务的低风险演变
- 数据转换:从单体式应用到微服务的低风险演变
- JDK8 stream toMap() java.lang.IllegalStateException: Duplicate key异常解决(key重复)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Yii框架getter与setter方法功能与用法分析
- laravel框架中视图的基本使用方法分析
- laravel5 Eloquent 实现事务方式
- Laravel 微信小程序后端搭建步骤详解
- Laravel使用swoole实现websocket主动消息推送的方法介绍
- Laravel框架Eloquent ORM删除数据操作示例
- PHP常用函数之base64图片上传功能详解
- laravel-admin 实现在指定的相册下添加照片
- Laravel框架Eloquent ORM修改数据操作示例
- PHP常用函数之格式化时间操作示例
- 在phpstudy集成环境下的nginx服务器下配置url重写
- 关于laravel-admin ueditor 集成并解决刷新的问题
- PHP常用函数之根据生日计算年龄功能示例
- Laravel 之url参数,获取路由参数的例子
- PHP call_user_func和call_user_func_array函数的简单理解与应用分析