KLEE應用例項1

2021-08-18 11:09:20 字數 2422 閱讀 8676



原文(),這個例項用來引導你完成乙個最簡單的測試。

1 下面是乙個待測試的函式,

int get_sign(int x)

這個函式就是根據輸入的x,返回-1\0\1表示x的符號。

2 符號化輸入

為了利用klee測試這個函式,首先需要設定符號化輸入,也就是把輸入變數符號化。這裡用到 klee_make_symbolic() 函式,該函式輸入三個引數,分別是變數位址、變數大小、變數名(這個名可以自己隨便取,就是用作標識)。之後設定乙個main函式,呼叫klee-make-symbolic函式,再利用符號化的輸入變數呼叫所要測試的函式get_sign。具體main函式的定義如下:

int main()

3 編譯程式生成llvm bitcode

klee的分析是基於llvm bitcode的,所以首先需要用llvm-gcc編譯c檔案生成檔案,命令如下:

$ llvm-gcc --emit-llvm -c -g get_sign.c

生成get_sign.o檔案,-g引數用於在編譯中加入debug資訊,以便於產生源**級別的程式資訊。同時編譯中不要使用優化設定的引數。

4 執行klee分析程式

$ klee get_sign.o

可以得到如下的輸出:

klee: output directory = "klee-out-0"

klee: done: total instructions = 51

klee: done: completed paths = 3

klee: done: generated tests = 3

從中可以看出,該測試函式有3條路徑,並且為每一條路徑都生成了乙個測試例。klee執行輸出資訊都在檔案klee-out-n中,不過最近一次的執行生成的目錄由klee-last快捷方式指向。

檢視生成的檔案:

$ ls klee-last/

assembly.ll      run.istats       test000002.ktest

info             run.stats        test000003.ktest

messages.txt     test000001.ktest warnings.txt

5 klee生成的測試例檢視

擴充套件名為.ktest的都是生成的測試例,這個程式有三條path,所以三個測試例,這些檔案都是二進位制**,可以用ktest-tool命令檢視,具體如下:

$ ktest-tool --write-ints klee-last/test000001.ktest

ktest file : 'klee-last/test000001.ktest'

args       : ['get_sign.o']

num objects: 1

object    0: name: 'a'

object    0: size: 4

object    0: data: 1

$ ktest-tool --write-ints klee-last/test000002.ktest 

...object    0: data: -2147483648

$ ktest-tool --write-ints klee-last/test000003.ktest

...object    0: data: 0

很明顯的可以看到,每乙個路徑對應的輸入變數值,分別是1,  -2147483648, 0。

6 利用測試例執行程式

用生成的測試例作為輸入執行程式,命令如下:

$ export ld_library_path=path-to-klee-root/release+asserts/lib/:$ld_library_path

#ld_library_path中的path-to-klee-root需要用具體的路徑代替,後面的也一樣

$ gcc -l path-to-klee-root/release+asserts/lib/ get_sign.c -lkleeruntest

#gcc編譯生成a.out,乙個可執行程式,然後用下面的方式指定其輸入為test000001.ktest。

$ ktest_file=klee-last/test000001.ktest ./a.out

$ echo $?

#檢視返回值

1$ ktest_file=klee-last/test000002.ktest ./a.out

$ echo $?

#255實際上對應的是-1

255$ ktest_file=klee-last/test000003.ktest ./a.out

$ echo $?

02015-1-26: while running a.out, you can run ./a.out directly. klee will ask you input .ktest file.

hive應用例項1

我們沿用之前hadoop wordcount的結果資料 hadoop icity0 hadoop fs cat wc out part r 00000 warning hadoop home is deprecated.beautiful1 day1 dear2 hello2 hometown1 h...

awk sed 應用例項1

昨天,一位群友在群裡面問如何使用 sed 生成目標格式的問題。問題的詳細描述如下 乙個檔案中有多行資料,每一行資料的格式如下 a b c d x y輸出資料格式如下 a b b i c i d e v b g e 通過對輸入與輸出的分析,不難看出開頭的乙個欄位要新增 b 字尾,中間字段新增 i 字尾...

Java Date應用例項集1

清單4演示了org.apache.commons.lang.dateutils和 org.apache.commons.lang.dateformatstringutils類的部分功能。還有其他許多方法可以進行同樣的操作,但輸入格式不同。故而,如果萬一您必須分析和格式化乙個日期值,只需要借助提供的方...