GenProg方法介绍|安装|避坑指南

GenProg方法介绍|安装|避坑指南

GenProg方法是软件自动修复中的一个基本的方法,是每一个这个方向的研究人员避不开的一个基本知识点。
在此,我从我了解到的知识中简单地介绍以下GenProg方法,并且记录一下该软件的安装过程和踩过的坑,希望可以帮助到有需要的小伙伴。



GenProg官网

github

注意,在安装和使用GenProg方法之前一定要仔细阅读 github中的README文件,虽然是很长的英文,但是也不要着急。我就是没有注意这个问题,浪费了挺长的时间。

GenProg方法

1. 简介

GenProg方法是由Weimer等人在2009年提出的一种用来自动程序修复方法。该方法在生成补丁阶段使用的是基于遗传规划的方法,其首先将源程序转化成对应的抽象语法树,然后迭代使用交叉算子和变异算子对已有的抽象语法树中的节点进行随机删除、增加或者替换,以生成新的AST并且转换成对应的程序补丁。
随后的许多研究人员就从语义等价补丁的识别、搜索方法的选择以及代码的修改操作等方面对GenProg方法进行了优化。

2. OCaml 和opam是什么?

在这里插入图片描述
从github上可以看到,GenpProg大部分都是由OCaml语言编写的。OCaml,最早称为 Objective Caml,是 Caml 编程语言的主要实现,开发工具包含交互式顶层解释器,字节码编译器以及最优本地代码编译器。Ocaml有一个巨大标准库,使得可以像 Python 或者 Perl 语言一样可以方便地开发各种应用程序。
说白了OCaml就是一门语言,并且这门语言呢编译运行地特别快。
opam 则是Ocaml语言的一种包管理器,通过包管理器,开发人员可以很方便地进行包的下载、上传和使用等,大大提高了程序开发的效率。

二、GenProg的安装

1.系统环境

在这里我先贴出我使用到的环境,具体Ocaml、opam等安装方法在下面具体地进行介绍
Ubuntu 18.04
OCaml 4.12.0
opam 2.1
Cil 1.7.3 (依赖num模块)

2.将命令行dash->bash

We have been able to build this in general linux environments, including OS X. It was once the case that you needed to ensure sh is symlinked to bash rather than dash (the default on Ubuntu); as of 2017- we’re not sure this matters any more. But if you run into trouble, try that.

作者说我们需要将sh由dash模式改成bash模式。

cd /bin
ls -l /bin/sh
#输出 lrwxrwxrwx 1 root root 4 8月 16 19:57 /bin/sh -> dash
ln -sf bash /bin/sh
# 再次执行$ ls -l /bin/sh,输出如下内容:
#lrwxrwxrwx 1 root root 4 2008-05-01 22:51 /bin/sh -> bash

3.安装Opam和OCaml

OCaml
We use opam to install and manage OCaml. This release assumes you are past 4.05.0 (we have most recently built it successfully using 4.12.0). Follow opam instructions to make and initialize a suitable ocaml installation switch.

作者说,使用opam去安装和管理OCaml,同时这个版本的不再支持OCaml4.05.0版的编译器了(作者使用的是4.12.0版OCaml),这个版本我们需要注意,如果版本不对的话那么GenProg项目就不能正常构建了。
我们去OCaml 官网下载最新版的OCaml。
在这里插入图片描述
显然,该教程告诉我们应该先下载 opam,然后再通过这个包管理器 创建相应的环境。
进入opam官网
找到
在这里插入图片描述
我们执行如下命令,安装opam和OCaml

#将opam网址添加到apt库中
add-apt-repository ppa:avsm/ppa
#更新镜像源
apt update
#安装最新版opam
apt install opam


# environment setup,初始化opam并刷新
opam init
eval `opam env`

# install given version of the compiler
#在这里我们按照github的来,安装最新版的opam 4.12.0
#安装过程很慢,需要等一会
opam switch create 4.12.0
#再刷新环境
eval `opam env`

检查是否安装成功

opam --version

ocaml --version

在这里插入图片描述

4. 安装Cil

We use CIL to parse C and manipulate ASTs. CIL is abandonware; the last version appears to be 1.7.3. It does not build after OCaml 4.05, and opam will complain if you try to install the vanilla version.
We have forked CIL and made minor updates to (a) get it to build post 4.05, and (b) compute pointer analysis the way we want it to (addressing the strong-update problem) in repair. We recommend:
opam install num
opam pin cil https://github.com/squareslab/cil.git
(cil depends on num)

作者说在OCaml4.05版本之后的CIL都被抛弃了,但是呢作者它们为了程序能成功构建,它们修改了一下cil 1.7.3版本(该模块依赖于num模块),并且我们可以通过如下方法安装:

opam install num
#因为是从github上拉取文件,所以很慢,如果失败了多安装几次试试
opam pin cil https://github.com/squareslab/cil.git

至此,我们的环境算是搭建成功了。可以运行opam list检查下安装的包
在这里插入图片描述

5.进行构建

# 拉取gibhub中的genprog项目
git clone https://github.com/squaresLab/genprog-code.git
# 修改可执行权限
chmod -R 777 genprog-code/
# 进行编译
cd ./genprog-code/src
make

构建成功后,会在src目录下产生repair这个可执行文件

在这里插入图片描述

6. 测试执行

在这里插入图片描述

Genprog 项目给我们提供了一个标准的示例文件。为 genprog-code/test/gcd-test/gcd.c文件,该程序是一个求两个输入数据最大公因数的程序。其具有的软件缺陷是如果其中一个数为0,应该直接返回return 。而这里缺失了,我们测试一下程序看看能否将这个缺陷进行修复。
在这里插入图片描述

cd /study/autoRepair/genprog-code/test
./gcd-1-findsrepair.test
#如果是第一次执行,因为缺少cache会报错,不用慌,直接进入到该目录下的gcd-test目录中
#执行  ../../src/repair  ../gcd-1-findsrepair.config

#执行成功后,会在genprog-code/test/gcd-test/目录下生成修复后的repair.c
cat repair.c

在这里插入图片描述

可以看到,该程序被修复了,搞定!

三、GenProg安装过程中报错处理

  1. 我遇到的问题都出现在 在src目录下执行make语句的时候,
    Error: Unbound module Cil genprog 或者 *** Could not find CIL include path. Is $CIL set correctly?. Stop.
    这二者应该由于cil安装不好或者 未设置环境变量导致的。解决方法就是 严格按照作者要求的 OCaml和opam、cil版本安装,作者已经说过了,genprog不再支持4.0.5版本(包括4.0.5)的OCaml了,而4.0.5往后的OCaml中是将CIL 1.7.3版本不支持的。
    基于此,作者在README中要求我们使用opam先安装num,再通过github ,poam pin 指令安装cil,这一点一定要注意。
  2. opam安装OCaml 时,提示fork" failed: Cannot allocate memory,即空间不足
    解决方法
$ free -m     #查看空余分区大小
$ dd if=/dev/zero of=/var/swap.1 bs=1M count=1024	#从/dev/zero设备复制出一个1G大小的文件/var/swap.1
$ mkswap /var/swap.1								# 格式化/var/swap.1
$ swapon /var/swap.1								# 将swap分区挂在到文件系统

总结

这就是关于genprog方法的简介+安装+避坑指南啦。接下来我会对genprog方法做更加深入的研究学习,希望我的文章可以帮助到你,欢迎收藏!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wumbuk

您的支持是我坚持的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值