genprog svn 1688 操作指南

来源:互联网 发布:讯佳摇杆淘宝 编辑:程序博客网 时间:2024/06/05 00:41

平台:linux ukylin 16.04

看完这篇论文后尝试着运行文中提到的开源代码。为了跑通这个算法也是废了很大的力气,最后终于跑通后发现其结果是随机的(因为算法本身就带有一定的随机性)。一样的命令,一样的测试用例,有的时候就可以产生修复代码,有的时候没有修复结果。

好了,先不讨论算法的学术问题,只讨论其实际操作所需要的命令。读者可以自行编制一个shell文件,而不必每次输入繁杂的命令。相比而言更喜欢3.0版本的,只要配好环境,一个命令便可完成修复。

下面就说一下修复之前都有哪些令人发指的事情要做。

1. 在运行修复之前,必须确保你的sh 是链接bash,而不是dash。(ubuntu默认是指向dash的,所以请读者再次确认是否更改为bash)。参考链接:http://blog.csdn.net/andysun1986/article/details/6320896 (如果提示权限不够,自行在命令之前加sudo)。

2. 因为genprog是用ocaml实现的,所以我们在使用之前一定要配好ocaml环境。可以直接使用bantu的package manager,也可以参考链接 http://caml.inria.fr/ocaml/release.en.html自行下载安装。虽然不知道为什么会选择这样一们的反人类的语言(可能是我习惯了面向对象和面向过程的语言,所以对这种函数式编程无法接受),但是如果你想深入了解这个算法甚至对其进行改进,那么你就需要一本宝典-----real world ocaml,亚马逊链接:https://www.amazon.cn/%E5%9B%BE%E4%B9%A6/dp/B013W98L4C/ref=sr_1_1?s=books&ie=UTF8&qid=1490058442&sr=1-1&keywords=ocaml。愿你和ocaml相处还算愉快。当然,网上也不是没有ocaml文档什么的,参考链接:http://ocaml.org/learn/tutorials/basics.html。这个是从最基础的开始,如果你没接触过函数式编程,你还是一点一点从头开始学习吧,也可以在学习过程中尝试着读genprog代码,刚开始可能会很难难受。慢慢习惯了就会好很多(应该吧,反正我还没习惯)。

3. 配置cil。这个地方搞不好以后会经常报错,很烦。最低版本:1.3.7(同时推荐不要尝试更新的版本,毕竟官方是使用这个版本的)。如何找到cil的package,读者自行搜索吧。下载cilpackage之后,安装就会比较简单了(但是要确保ocaml安装成功)。参考命令:cd cil
        ./configure
        make 
        make cillib

之后要设置CIL的环境变量,参考命令:

cd ~

sudo gedit .bashrc

添加export CIL=${HOME}/program/cil;(此处会因cil安装位置同而需要更改)

修改后若要生效,则还需运行命令source /home/guok/.bashrc。

成功之后可以运行命令echo $CIL,成功则会输出正确路径。

到了这个时候,环境配置就算是结束了。如果你有点烦躁,可以点根烟缓解一下。下面的事情并不会比配置环境轻松。尤其是,当你发现跑官方样例也没有修复的时候,这个时候千万不要放弃,可以尝试换个方法[摊手][哈嘿]。

1. 编译项目。在genprog-code/src目录下打开终端,输入make。如果编译成功,则会生成三个可执行文件:coverage,modify,cdiff(这三个文件也是整个修复过程三个步骤使用到的主要文件)。当然,如果你编译失败了,我觉得你就该试着在服务器上进行测试了。因为这个算法对硬件的要求极高(针对PC来讲)。

好,假设你有服务器,并且编译成功了(或者解压之后就有这三个可执行文件),那就可以进行下一步了。

2. 进入quad目录,用官方所给的gcd作为测试用例对该算法进行测试。在命令行输入:

../coverage --uniq --call gcd.c > gcd-coverage.c

之后编译生成的.c文件即可。

gcc -o gcd-coverage gcd-coverage.c

3. 进行modify操作,生成修复代码。

../modify gcd.c

这样的话所有参数就都是按照默认数值进行修复。修复结果极不靠谱,多次测试均未得到预期的修复代码。具体参数意义可以执行命令

../modify --help

进行查看。可以尝试 --gen 20 --pop 40。如果你已经阅读了论文并且掌握了该算法的核心思想,那么应该可以看懂每个参数的意思。如果修复成功应该会产生一个gcd--best.c文件。

4.minimize

这步操作就很简单也很好理解了。就是把生成的代码进行一下简化,简单讲就是让代码看起来更象是人写的。如果修复成功可以打开gcd-best.c文件,你会发现这个文件可能任何人都不会这么写代码,可读性非常差,费好大劲才能读懂。而这一步就是让修复代码更为友好。

首先把gcd-best.c文件复制到minimize目录并且改名best.c

然后在minimize目录下运行minimize-setup.sh文件即可。如果进行顺利才算是整个修复过程完成。

2 0