首先从约束生成入手,研究如何从git的patch log中生成约束。

image-20220814215838958

先从论文中给出的算法入手,输入是改变位置的集合。

首先对每个位置遍历,并根据规则区分它们

  • 新的条件、包含异常抛出
  • 条件互斥
  • 变量被替换
  • 其他

接下来对CnTars进行判断,TSs为target site集合,DCs为 data condition集合。

如果C1Tars不空,如果C1Tars的post都相同,那么TSs设置为C1Tars.pre的位置,DCs设置为post的条件。

如果C2Tars不空,且C2Tars.pre都相同,C2Tars.post也相同,则TSs设置为C2Tars.pre的位置,C为C2Tars的条件,DCs为C的pre条件和post条件的互斥。

如果C3Tars不空,并且C3Tars的变量改变处都相同,则TSs设置为C3Tars.pre的位置,V为C3Tars的改编后的变量,DCs设置为V.pre与V.post的不相等。

剩下就是TSs为C4Tars,DCs为空,即nT模板。

最后将TSs通过哨兵函数连接起来。

同时把target site的形式规定为 文件名:行号:列号