人工智能完全学会自己编程,可能说起来还有一种科幻感,但 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 中的信息来过滤不正确的补丁;

三是通过对网上的开源程序进行统计分析,发现对变量进行操作的条件概率,进而生成正确的补丁。

程序员的福音,AI可以自动修复bug了!的更多相关文章

  1. 程序员:统治世界or修复bug?

    程序员:统治世界or修复bug? 时至今日,我们依然生活在一个市场和技术受到高度崇拜的世界里,但是历史演化的规律提醒着我们:当一个东西开始成为社会崇拜的对象时,其中暗藏的不利因素将悄然的进行着.有人认 ...

  2. 程序员们,AI来了,机会来了,危机也来了

    程序员们,AI来了,机会来了,危机也来了 1.人工智能真的来了 纵观古今,很少有计算机技术能有较长的发展寿命,大部分昙花一现,比如:昔日的DOS.windows3.2.foxpro.delphi.80 ...

  3. 程序员写的东西出了bug,造成了损失谁来承担?

    这是个持续多年的话题了,很多大公司,尤其是牛逼的独立分包公司(开发公司)都会有代码审核和严格QA程序,一般的公司就很难说咯,在法律上目前还没有完全支持处罚程序员bug经济损失的判例(国内如此),国外也 ...

  4. 社群公会GangSDK:程序员入行AI领域需要哪些技能?

    作为一名Android开发工程师,身边总有些同行很焦虑,看着人工智能越来越火,总是担心Android要不行了,所以,我们需要转行么?Android还能走多久?其实,无论是对于Android还是iOS开 ...

  5. 程序员如何描述清楚线上bug

    案例 一个管理后台的bug,把操作记录中的操作员姓名,写成了该操作员的id.原因是修改了一个返回操作人姓名的函数,返回了操作人的id.但是还有其他地方也用这个函数,导致其他地方把姓名字段填写成了操作员 ...

  6. 初级程序员如何一分钟?解决一个BUG

    博主说明 -- 重要.重要.重要的事情说三遍 写这篇文章是主要锻炼写博客的能力以及记录自己的成长经历,要是写的不对欢迎大佬评论指正,同时希望对大家有所帮助.然后我写博客尽量简洁+图片+宏观的方式,便于 ...

  7. 震惊!程序员的福音!不需要敲代码就能完成复杂的逻辑应用? —— Azure Logic App

    (大家看完标题可能以为是营销号,哈哈哈哈哈哈哈哈哈...客官请留步, 正经博主....好吧) 今天我们的主题是Azure Logic Apps Azure Logic Apps 是什么? 官方解释:h ...

  8. 人才需求之Java程序员与AI程序员

    据100offer报告显示:2018年Java人才市场「高开低走」的动荡局势.整体求职难度变大,且全年波动更剧烈,淡旺季区别明显.企业发出的Java面邀总数几个季度连续下跌,Q4 甚至比去年同期下降了 ...

  9. 那些让程序员目瞪口呆的Bug

    程序员一生与bug奋战,可谓是杀敌无数,见怪不怪了!在某知识社交平台中,一个"有哪些让程序员目瞪口呆的bug"的话题引来了6700多万的阅读,可见程序员们对一个话题的敏感度有多高. ...

随机推荐

  1. hdu 1042 N! 高精度运算

    N!                                                                              Time Limit: 10000/50 ...

  2. C程序设计的抽象思维-递归过程-砝码称重

    [问题] 在狄更斯时代,商人们用砝码和天平来称量商品的重量,假设你仅仅有几个砝码,就仅仅能精确地称出一定的重量.比如,假定仅仅有两个砝码:各自是1kg和3kg. 仅仅用1kg的砝码能够称出1kg重量的 ...

  3. delphi 处理缩放图像

    procedure TTMEImageDeviceIdentifyFrom.DrawText(AImage : TImage; AFile: string);var I: Integer; iWidt ...

  4. MySQL5.6的my.ini配置

    下面这个配置在现网服务器上跑了两年了,里面多项参数都有调整过,这个算是最终的一个配置,这个配置不一定适合每种项目,仅供参考. 如果MySQL出现异常:Out of memory 需要修改这几个参数: ...

  5. ASP.NET Web API中通过ETag实现缓存

    通常情况下Server是无状态的,在ASP.NET Web API中,我们可以让服务端响应体中产生ETag属性,起到缓存的作用.大致实现原理是: 1.服务端的响应体中返回一个ETag属性2.客户端通过 ...

  6. 【C++】STL常用容器总结之五:双端队列deque

    6.双端队列deque 所谓的deque是”double ended queue”的缩写,双端队列不论在尾部或头部插入元素,都十分迅速.而在中间插入元素则会比较费时,因为必须移动中间其他的元素.双端队 ...

  7. script标签加载顺序(defer & async)

    script 拥有的属性 async:可选,表示应该立即下载脚本,但不应妨碍页面中的其他操作,比如下载其他资源或等待加载其他脚本.只对外部脚本文件有效. charset:可选.表示通过 src 属性指 ...

  8. Node.js + Express 构建的订餐系统

    Node.js的版本 - v0.8.12 Express的版本 – v3.3.3  (安装 $ npm install -g express) 系统的登录逻辑是:获取用户名 + 密码,向内网RTX服务 ...

  9. 连接MSSQL2008 Express

    (1)打开Manage Studio. (2)click on the  .\sqlexpress, select property, click security, make sure use mi ...

  10. SpringBoot 使用Swagger2打造在线接口文档(附汉化教程)

    原文地址: https://www.jianshu.com/p/7e543f0f0bd8 SpringBoot + Swagger2 UI界面-汉化教程 1.默认的英文界面UI 想必很多小伙伴都曾经使 ...