原文(),這個例項用來引導你完成乙個最簡單的測試。
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類的部分功能。還有其他許多方法可以進行同樣的操作,但輸入格式不同。故而,如果萬一您必須分析和格式化乙個日期值,只需要借助提供的方...