使用的GenProg版本为V3.2 ( github源码),下面是利用genprog修复bug的配置、安装与实现。
将sh修改为bash(ubuntu的sh默认是dash)
-
$ cd /bin
-
执行
$ ls -l /bin/sh
,会输出如下内容:
lrwxrwxrwx 1 root root 4 8月 16 19:57 /bin/sh -> dash
-
进行如下操作:
3.1
$ ln -sf bash /bin/sh
3.2 再次执行$ ls -l /bin/sh
,输出如下内容:
lrwxrwxrwx 1 root root 4 2008-05-01 22:51 /bin/sh -> bash
dash与bash的区别:
- 有人把ash从NetBSD移植到Linux并更名为 dash (Debian Almquist Shell),并建议将 /bin/.sh 指向它,以获得更快的脚本执行速度。Dash Shell 比 Bash Shell 小的多,符合POSIX标准。
- Debian和Ubuntu中,/bin/.sh默认已经指向dash,这是一个不同于bash的shell,它主要是为了执行脚本而出现,而不是交互,它速度更快,但功能相比bash要少很多,语法严格遵守POSIX标准。
安装opam
(opam会方便CIL的安装。)
$ apt-get install opam
$ opam init
$ eval opam config env
安装ocaml
OCaml是函数式编程语言,强项是程序分析。
$ apt-get install ocaml
安装CIL,v1.3.7
需要使用CIL来解析C,对AST进行操作。
- 如果安装了opam
$ opam install cil
- 如果安装失败,按照提示执行
$ opam depext conf-m4.1
- 如果没有安装opam
- 下载CIL package,并确认已经安装了OCaml compiler,perl,和ocamlfind
$ cd cil
$ ./configure
$ make
$ make cillib
- 在~/.bashrc文件中添加:
export CIL=/home/claire/cil
修改genprog源代码的权限
- cd到genprog源代码的上层目录,执行
$ chmod -R 777 genprog-code-master/
编译repair
- cd到genprog-code-master/src目录下,执行
$ make
,执行成功之后会产生一个repair可执行文件
执行repair
- cd到test目录下,打开gcd-1-findsrepair.test,查看其中的内容并了解gcd-1-findsrepair.configure中的执行参数。
--seed 560680701 //设置随机种子
--compiler gcc //指定编译器为gcc
--program gcd.c //指定需要修复的程序为gcd.c
--pos-tests 5 //指定正测试用例个数
--neg-tests 1 //指定反测试用例个数
--search ga //使用遗传方式搜索
--promut 1 //每次变异产生的变异体个数
--popsize 40 //用来产生变异体的人口个数
--generations 0 //执行的迭代的代数
--label-repair //显示修复的位置
- 若是第一次执行,则需要先执行一次gcd-1-findsrepair.test,然后cd到gcd-test文件夹下,执行gcd-1-findsrepair.test中的后半部分,即
$ ../../src/repair ../gcd-1-findsrepair.config
。因为第一次执行.test时,缺少gcd.cache,会报错。如果再次执行时,直接执行.test,gcd.cache会被清理,仍然出现错误。所以需要先执行一次完整的.test,产生gcd.cache,然后再执行.test的后半部分。 - 执行成功之后,gcd-test文件夹内会出现新的文件repair.c,这就是修复gcd.c之后的新的程序。
- 如需修复其他文件,则按照上述流程,修改.test中的相应位置即可。