1. 程式人生 > >GenProg自動修復bug的實現

GenProg自動修復bug的實現


GenProg V3.2 ( github原始碼

配置環境

將sh修改為bash(ubuntu預設是dash)

  1. # cd /bin
  2. # ls -l /bin/sh,執行之後會輸出如下內容:
    lrwxrwxrwx 1 root root 4 8月 16 19:57 /bin/sh -> dash
  3. 進行如下操作:
    • # ln -sf bash /bin/sh //軟連結 -f表示強制
    • 再次執行# ls -l /bin/sh,輸出如下內容:
      lrwxrwxrwx 1 root root 4 2008-05-01 22:51 /bin/sh -> bash

dash與bash的區別:
1. 有人把ash從NetBSD移植到Linux並更名為 dash (Debian Almquist Shell),並建議將 /bin/.sh 指向它,以獲得更快的指令碼執行速度。Dash Shell 比 Bash Shell 小的多,符合POSIX標準。
2. Debian和Ubuntu中,/bin/.sh預設已經指向dash,這是一個不同於bash的shell,它主要是為了執行指令碼而出現,而不是互動,它速度更快,但功能相比bash要少很多,語法嚴格遵守POSIX標準。

安裝opam

opam會方便CIL的安裝。
1. # apt-get install opam


2. # opam init (執行過程中需要選擇N)
3. # eval opam config env

安裝ocaml

OCaml是函數語言程式設計語言,強項是程式分析。
1. # apt-get install ocaml

安裝CIL,v1.3.7

需要使用CIL來解析C,對AST進行操作。

  • 如果安裝了opam

    1. # opam install cil
    2. 如果安裝失敗,按照提示執行# opam depext conf-m4.1
  • 如果沒有安裝opam

    1. 下載CIL package,並確認已經安裝了OCaml compiler,perl,和ocamlfind
    2. #cd cil
    3. ./configure
    4. make
    5. make cillib
    6. 在~/.bashrc中新增export CIL=/home/claire/cil

修改genprog原始碼的許可權

  1. cd到genprog原始碼的上層目錄,執行# chmod -R 777 genprog-code-master/

編譯repair

  1. 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  //顯示修復的位置
  1. 若是第一次執行,則需要先執行一次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的後半部分。
  2. 執行成功之後,gcd-test資料夾內會出現新的檔案repair.c,這就是修復gcd.c之後的新的程式。
  3. 如需修復其他檔案,則按照上述流程,修改.test中的相應位置即可。