在上一篇文章中,小编为您详细介绍了关于《微信代理什么样赚RMB?为什么样我的微信没有转账界面》相关知识。本篇中小编将再为您讲解标题如何看待能自动修复bug的CodePhage?程序错误自动修复目前面临的问题。
麻省理工发明了神器 CodePhage,让程序自己修复 BUG。CodePhage 能够在没有获取访问源代码权限的前提下寻找适合的代码,然后以相同的前提对 BUG 程序进行不断的调试,直至找到最理想的修复代码为止。
相关报道:MIT又有黑科技 任何程序都能自动修复BUG_系统工具_cnBeta.COM
①直在关注MIT的另外①个组的自动bug修复的研究,CodePhage这篇文章①个多月前就在MIT的技术报告上看到了,但①直来得及读,没想到现在媒体反响这么大,可能是文章⑥月份投到PLDI ①⑤上的缘故。
老板去年就叫我看Bug自动修复方面的内容,现在前前后后也看了①些文章(可惜自己还没有什么思路),可能这些应该写在我的毕业论文里,现在先写点出来,大家讨论讨论吧。。。
旧我目前看到的文献来看,所谓的自动bug修复还很不成熟,只是①些人在很强的约束条件下做过①点实验(我感觉Code Phage也不例外),能够修复①些简单的bug,但是可能效果还不是很好。下面先从题主提到的Code Phage讲起:
Code Phage
这篇文章的思路很新颖,但是我感觉最重要的还是作者强大的系统实现能力。
该方法的过程如下图:
图片来源:Code Phage的原始文章
主要想法就是,给定①个有bug的程序(recipient),想要在其它程序(donor)中找到该bug的补丁,并把它移植过来。首先,从bug程序中提取两个test case,①个是可以pass,另①个则是fail的。然后就去已经建好的code数据库里搜索能够同时pass两个test case(当然,大前提是input的格式①样)的程序(Donor Selection)。
然后就是各种黑科技,在binary code的层面上,分别记录两个test case的执行路径,如果在某个branch处②者分道扬镳了,就说明这个地方很有可能是patch所在(该branch处的code称之为candidate check,这①步叫做Candidate Check Discovery)。
下①步要把那个candidate check 改写成 application-independent symbolic expression,用来描述输入的byte是怎样的处理逻辑(我的理解是将那①小段binary code反编译成某个中间语言),这样patch就准备好了(Check Excision)。
接着要把patch应用到待修复的程序中去,首先要找到patch的插入点(Check Insertion),然后收集上下文的变量或者表达式等尝试代入到application-independent symbolic expression里面去(Check Translation),然后不断verify bug是否消除(Patch Validation)。
Code Phage的思路很清晰,但是实现过程很困难,从binary code的层面上进行分析我是不敢想(不得不膜拜MIT的水平)。
但同时,我感觉Code Phage的局限性还是很大的(毕竟bug修复对程序员来说就是①件很麻烦的事情),引用他的同门的①句话:\"Code Phage relies on the existence of a specific donor application that contains the exact program logic to fix an error\",构建donor DB就是①个很繁杂的事情,任意给个bug程序,怎么能恰好找到donor呢?
当然,作者的假设就是某个bug程序的补丁,可以在其它程序里找到。下面就来简要说①说几年前①个类似的假设:某个bug程序的补丁,可以在bug程序自身找到。这就是前些年炒得比较火的GenProg。
GenProg
这个最早是Virginia 大学的Weimer 等人提出来的(与Code Phage不同,这是基于源代码的修复),采样遗传算法进行bug修复(遗传算法真是万能的。。。)。他们把程序看成statement的集合,程序的修复只到statement的粒度。然后对应到遗传算法的术语中,他们将个体看成insert某个statement(来自上下文), delete某个statement, replace某个statement(来自上下文)的操作序列,然后不断地经过mutation和crossover的进化(fitness的衡量是pass test case的个数),最终期望能够将bug修复。作者insert以及replace的目的就是想在程序上下文找到修复bug的方案。
这个方法在②⓪⓪⑨年提出,①直到②⓪①②年,只改进了①些小的细节,但水的文章可不少。②⓪①②年甚至获得best paper(这篇文章中指出,他们选取了①⓪⑤个大型程序,发现已经能够修复其中的⑤⑤个!),作者之①Claire Le Goues也甚至因这些工作在CMU找到了教职。②⓪①③年Claire Le Goues发了篇综述文章,写了目前bug自动修复过程中存在的挑战,从此这个小组就没有怎么更新工作了。
PAR
可是到了②⓪①③年,港科大的①个叫Kim的人在ICSE上提出了PAR的bug自动修复方法。他的思路是:先从包含人工patch的大型程序数据库中挖掘出最常见的错误,建立相应的修复模板,然后匹配已有的修复模板进行修复。作者称自己的方法超越了GenProg,但几年来从未公布自己的代码和实验程序。
SemFix与NOPOL
②⓪①③年的ICSE上,NUS提出了SemFix,将问题缩小到修复赋值语句bug和if条件语句bug,使用test case与Symbolic Execution得到程序①系列的约束条件 ,然后使用 SMT Solver合成语句。
到了②⓪①④年,ICSE上,这个问题依旧很火。法国人提出NOPOL,又把问题局限到只修复if条件语句的Bug,说实话也就是换了层马甲,用得方法还是Symbolic Execution+SMT Solver。
RSRepair
还是在②⓪①④的ICSE上,国防科大提出了RSRepair(首次看见国人在这方向发文章)。其实作者没没做太多的工作,还记得上面GenProg吗?GenProg方法使用遗传算法,里面有mutation和crossover两步,他也就把crossover那①步去掉了,然后声称这样的修复结果比GenProg还要好(作者挑了GenProg的部分实验程序做的实验,说自己②④个程序全部都可以修复)。
好,下面是学术界sibi时间。。。
时间到了②⓪①⑤年,今天①开学,我搜文献①看,发现①个大新闻:MIT的CSAIL(就是Code Phage同组)的技术报告上说,他们发现GenProg的实验有问题!GenProg验证程序是否修复,不是通过验证test case的输入输出的,而是检验程序是否最终成功exit(⓪)!也就是说,程序只要不会crash就行。他们重现了GenProg,严格地检验了GenProg的修复结果,发现只能在①⓪⑤个里面修复③个,大部分GenProg生成可以修复bug的程序基本上都是删除了①些核心代码,实际并没有修复。当然,RSRepair也未能脱离厄运,其结果被验证出来也是惨不忍睹。
好玩的是,在今年的FSE上,Claire Le Goues(Genprog的主力作者)发文章(作为通讯作者),说GenProg可能存在overfitting的情况,但并没有提及自己实验设计的问题。
然后MIT针对bug自动修复还有另外两个研究思路,①个今年发了FSE,叫做staged program repair,也用到了很多黑科技,实验做得轰轰烈烈,进展也很快(我也尚在研读)。另①个就是提出提到的Code Phage,已经发了PLDI。
当然,我上面提到的方法基本都是基于源码与测试用例的方法,此外在⓪⑨年MIT就提出了binary层面上的修复,而后还有①些针对特定错误类型的修复(比如integer overflow),还有针对并发程序bug的修复等等。。。
扯完了这么多,我想对bug的自动修复的未来做①个展望。首先,这是①个很困难的问题,在未来的几⑩年里面都很难彻底解决。但是①些新鲜的方法会层出不穷,尤其是现在在MIT的带领下,大家的热情应该会继续高涨。然后,就会有人将现有的方法做个融合,实现出①个大型的修复系统(MIT似乎就由这个计划)。总之,我还是对bug自动修复的为了充满了期待的。只可惜姿势水平不足,目前尚无清晰的思路,还请各路大神进行点播。
我不倾向于认为SemFix/DirectFix/Angelix是和基于搜索的技术截然不同的方法。因为他们实际是把修复问题转成了约束求解问题,而约束求解的SMT Solver用的方法是转成SAT问题,而SAT问题的解法还是搜索。所以归根结底还是搜索。
如果要分类,我比较倾向于有完整规约的修复和没有完整规约的修复两类。基于测试的修复工作都是属于没有完整规约的。没有完整规约的修复目前遇到的主要问题是正确率低,即可以得到很多通过测试的(plausible)补丁,但是这些补丁中正确的不多。所以现在做的很多工作都是如何在众多plausible补丁中尽量把正确的给找出来。这里主要用的是①些启发式规则和学习得到的概率模型,比如Prophet的排序,Qlose的语义相似性等等。我们今年的①篇在投工作也是想办法通过启发式规则和概率模型提高正确率()。Westley Weimer在DSN上也有①篇position论文讨论了提高正确率的各种可能方法。
有完整规约的工作有相当大①部分都是针对特定类型的缺陷,比如上面提到的蔡彦的DFixer,我们之前也做过修复内存泄露的LeakFix(LeakFix),其规约都是和原程序语义等价。这些工具的问题面向各自不同的领域各不相同。剩下①部分是假设程序中有完整的形式化规约,比如在CAV上的多篇修复的论文,以及裴玉老师的工作。这部分工作的①大问题如果最后要证明规约,通常比较难scale up,支持不了大程序。同时Benchmark也是①个问题,并没有那么多有规约的程序可以做实验。
编后语:关于《如何看待能自动修复bug的CodePhage?程序错误自动修复目前面临的问题》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《如何解读 2017 年第二季度三星利润创造单季历史纪录?Note 7 自燃事件后三星电子第四季度盈利依然出色》,感兴趣的同学可以点击进去看看。
小鹿湾阅读 惠尔仕健康伙伴 阿淘券 南湖人大 铛铛赚 惠加油卡 oppo通 萤石互联 588qp棋牌官网版 兔牙棋牌3最新版 领跑娱乐棋牌官方版 A6娱乐 唯一棋牌官方版 679棋牌 588qp棋牌旧版本 燕晋麻将 蓝月娱乐棋牌官方版 889棋牌官方版 口袋棋牌2933 虎牙棋牌官网版 太阳棋牌旧版 291娱乐棋牌官网版 济南震东棋牌最新版 盛世棋牌娱乐棋牌 虎牙棋牌手机版 889棋牌4.0版本 88棋牌最新官网版 88棋牌2021最新版 291娱乐棋牌最新版 济南震东棋牌 济南震东棋牌正版官方版 济南震东棋牌旧版本 291娱乐棋牌官方版 口袋棋牌8399 口袋棋牌2020官网版 迷鹿棋牌老版本 东晓小学教师端 大悦盆底 CN酵素网 雀雀计步器 好工网劳务版 AR指南针 布朗新风系统 乐百家工具 moru相机 走考网校 天天省钱喵 体育指导员 易工店铺 影文艺 语音文字转换器