![504eae1fc11d6e187143315ebdc5bad4.png](https://i-blog.csdnimg.cn/blog_migrate/7a7cc630eecf660ac105ad6b09421156.jpeg)
引用
Jiang J, Ren L, Xiong Y, et al. Inferring program transformations from singular examples via big code[C]//2019 34th IEEE/ACM International Conference on Automated Software Engineering (ASE’19). IEEE, 2019: 255-266.
1 摘要
利用具体的程序变更来推理出程序转换具有许多潜在用途,如应用系统的程序编辑,重构和自动程序修复等。关于程序转换推理,现有工作通常依赖于大量程序更改示例集上的统计信息。但是在实际情况下,这种程序变更示例集往往是缺乏的。
本文中,我们完成了基于单独变更示例的程序转换推理任务。其核心思想是,大代码可以为具体变更推广到程序转换中提供有效的指南,也就是说出现在许多文件中的代码元素是通用的,而不应被抽象化。具体我们提首先提出了一套用于转换推理的框架,将程序表示为超图,以实现转换的细粒度概括。然后我们设计一种转换推理方法,GENPAT,该方法基于代码语料库的代码上下文和统计信息来进行推理程序转换。
我们在两种不同的应用场景中评估了 GENPAT,分别是系统编辑和程序修复。(1)对系统编辑的评估表明,GENPAT 的性能明显优于最先进的方法 SYDIT,我们将正确转换案例的数量提升了 5.5 倍。(2)对程序修复的评估表明,GENPAT 有潜力集成到先进的程序修复工具中。具体在 Defects4J 程序集上,GENPAT 从现有补丁中进行推导转换,修复了 19 个真实缺陷。总体而言,评估结果表明了 GENPAT 在转换推理方面的高效性,并在不同的场景中具有应用潜力。
2 引言
现代程序开发通常具有重复性,开发人员在不同的项目会多次地使用相同的代码变更。从变更示例推理程序转换可以自动执行相同类型的变更,具有许多潜在用途,例如系统地编辑源代码中的许多位置,根据重复出现的错误补丁修复错误,在分叉的项目之间移植提交,调整客户端代码以适应不兼容的 API 更改以及重构等等。
转换推理中的关键挑战是确定在转换中需要概括的内容。例如考虑以下更改示例:
![1898e670b62982a373c4d9bee2005071.png](https://i-blog.csdnimg.cn/blog_migrate/98fe93234c63a2488f83e58b97491018.jpeg)
一个可能的转换如下所示:
![6fea064c5ba4d7106545f9ae0ab04943.png](https://i-blog.csdnimg.cn/blog_migrate/e7e7bc0cf191b7d9a56412d89c887ba2.jpeg)
我们还可以考虑让转换更加通用,如下面示例所示:
![80fb0d0620b31921d6c305441871a345.png](https://i-blog.csdnimg.cn/blog_migrate/e4de4161a4c6e8a4f53f9f6aac63a8c1.jpeg)
我们也可以考虑变更的上下文,让转换更加具体,如下面示例所示:
![9159eefaeb3a1462b8475b45bd6e6af6.png](https://i-blog.csdnimg.cn/blog_migrate/d8986f04e7a115e60fb5e8ba0d0b2a1b.jpeg)
但是转换过于具体可能会降低召回率,即可能会丢失应转换的示例。而转换过于通用可能会降低精度,即包含不应转换的示例。因此选择合适的概括粒度对于程序转换的质量至关重要。
许多现有技术采用的一种典型方法是从大量示例中学习,利用学习到的统计信息来确定哪些应该具体而哪些应该抽象出来。在上面的示例中,如果存在很多变更示例,它们将 f 的第一个参数与 g 并在一起,并且第一个参数具有许多不同的名称,那么最后一种转换应该是理想的,并且一些信息比如变量名 a 应被抽象。但是这种方法需要大量示例作为训练集。实际上我们通