是不是对电脑、手机应用没完没了的升级感到厌倦?但是却又不得不升,因为大多数商业化软件都有着需要定时修补的Bug和安全漏洞。
一般情况下,这些Bug都是一些简单的疏忽造成的。举个例子来说,程序试图读取已经不存在的数据。补丁也很简单,通常就是一行用于验证这些数据是否存在的代码。
既然如此简单,那么可不可以自动生成补丁呢?有一些研究组正在尝试关于此事的研究,其中就包括麻省理工大学的电气工程和计算机科学的教授Martin Rinard,开发出了补丁通常倾向于采用的模板。算法能够用这些模板生成和评估候选补丁。
最近,Rinard和学生Fan Long和加州大学圣地亚哥分校的Peter Amidon又研发出一个新系统,能够通过分析软件成功打出的补丁,学习生成自己的模板。
通常,人们手工编码生成的补丁系统具备5到10个模板,新系统则创建出了85个,不仅更为多样化也更为精确。这种模板更适合于真实世界特定类型的补丁,因此不会产生太多无用的候选补丁。在测试中这个系统被称为“创世纪”,比起最好的手工编码的模型系统,它的修复两近乎于其两倍。
文章第一作者Fan Long表示“你需要权衡”,“一方面你想产生足够多的候选项以便包含有用的补丁,另一方面,你又不想包含如此多的补丁以致于无法找到真正需要的。”
创世纪中数据集的每个条目包括两个代码块:原始的,有漏洞的代码和准备修复它的补丁。创世纪首先构建成对的训练实例,例如数据中的每个条目都与另外的条目所匹配。
然后创世纪开始分析每个配对并创造一个通用的表达——一个模板的草稿——最终使它从两个原始代码中合成两个补丁,也可能合成其他的无用的候选补丁。但是代表性的补丁通常是候选补丁中有用的补丁。
下一步,创世纪将在训练实例中测试每个草稿模板。每个模板都将建立在仅仅两个实例中,但是却可以对其他一些漏洞起作用。每个模板都在两个标准上得分:可以纠正的错误的数量以及生成的无用的候选项的数量。例如,模板生成10个候选项,在训练集中出现4个补丁错误,它的得分可能高于生成1000个候选项却包含5个正确补丁。
在这些得分的基础上,创世纪选择了500个最具潜力的模板。对于其中每一个,它增加了最初的两个事例的训练集并在其上增加了一个,创造了一个巨大的三个事例的训练集。对于每一个模板,它将改变草稿模板,生成更多的通用模板。然后执行相同的评价过程,并提取最具潜力的模板。
重复4轮以后,500个顶尖模板中的每一个都被用5个事例进行了训练。最终采用轻微不同的评价标准,确保训练集中的每个错误都能得到纠正。也就是说,在最终500个模板中的可能有一个模板只能修补一个漏洞,在前面一轮评估中奖获得较低的分数。但如果它是唯一的能够修补该漏洞的模板,它将直接晋级。
在研究者的实验中,最终选择将模板数量从500个减少到85个。创世纪能够与用Java语言写成的程序协同工作,麻省理工的研究者将它的表现与拥有最好性能的手工编码的Java补丁生成器进行了比较。创世纪在41个开源项目中成功的对49个测试案例进行了21处补丁修复,而此前的系统仅修补了11个缺陷。
可能有更多的训练数据和更多的计算能力来评估更多的候选模型,可能产生更好的结果。但是允许程序员只需花一半的时间实现代码修复的修通无论如何都是有用的。
感情是减少程序员的工作。身为应用使用者,还是老老实实打补丁吧。