1.一種基于動態(tài)符號執(zhí)行的軟件缺陷檢測方法,其特征在于,包括下列步驟:
步驟1:對待檢測的軟件的源程序中的變量添加符號化標(biāo)識,然后對源程序進(jìn)行編譯處理得到底層虛擬機(jī)LLVM中間碼;
步驟2:根據(jù)指令類型,對LLVM中間碼進(jìn)行分類插樁處理,插入符號執(zhí)行和缺陷檢測指令;
步驟3:將插樁處理后的LLVM中間碼編譯生成可執(zhí)行文件;
步驟4:基于生成的可執(zhí)行文件,進(jìn)行動態(tài)符號執(zhí)行與缺陷檢測:
401:基于測試案例運(yùn)行可執(zhí)行文件,生成符號執(zhí)行約束條件表達(dá)式集合,或符號執(zhí)行約束條件表達(dá)式集合和缺陷檢測條件表達(dá)式集合,其中測試案例的初始值為隨機(jī)輸入;
若存在缺陷檢測條件表達(dá)式集合,則將當(dāng)前生成的符號執(zhí)行約束條件表達(dá)式集合和缺陷檢測條件表達(dá)式集合作為一個隊(duì)列元素存入預(yù)設(shè)隊(duì)列L中;
402:判斷所有生成的符號執(zhí)行約束條件表達(dá)式是否均已取非,若是,則測試案例生成結(jié)束,并設(shè)置軟件檢測結(jié)束標(biāo)識;否則,將其中一個符號執(zhí)行約束條件表達(dá)式取非并通過第一約束求解器進(jìn)行測試案例求解,若有解,則將當(dāng)前求解結(jié)果作為測試案例并執(zhí)行步驟401;若無解,則繼續(xù)執(zhí)行步驟402;
403:判斷隊(duì)列L是否為空,若為空,則檢測是否存在軟件檢測結(jié)束標(biāo)識,若是,則結(jié)束軟件缺陷檢測;若否,則繼續(xù)執(zhí)行步驟403;
若隊(duì)列L不為空,則從隊(duì)列L中取出一個隊(duì)列元素A并執(zhí)行步驟404,其中隊(duì)列元素A包括符號執(zhí)行約束條件表達(dá)式集合S和缺陷條件表達(dá)式集和R;
步驟404:從集合R中取出一個未被求解的缺陷條件表達(dá)式r,將r與集合S合并得到新的條件表達(dá)式集合并通過第二約束求解器進(jìn)行缺陷判定求解,若有解,則顯示對應(yīng)r的缺陷類型;若無解,則判斷集合R是否為空,若是,則執(zhí)行步驟403;否則,執(zhí)行步驟404。
2.如權(quán)利要求1所述的方法,其特征在于,步驟2中,對LLVM中間碼進(jìn)行分類插樁處理具體為:
若當(dāng)前指令是主函數(shù)入口的第一條指令,則在當(dāng)前指令之前插入第一樁函數(shù),第一樁函數(shù)用于讀入符號化變量的值;
若當(dāng)前指令為主函數(shù)的最后一條指令,則在當(dāng)前指令之前插入第二樁函數(shù),第二樁函數(shù)用于檢測內(nèi)存泄漏;
若當(dāng)前指令為非主函數(shù)的第一條指令,則在當(dāng)前指令之前插入第三樁函數(shù),第三樁函數(shù)用于標(biāo)記所述普通函數(shù);
若當(dāng)前指令為分配指令,則判斷分配指令是否用于申請數(shù)組空間,若是,則插入第四樁函數(shù),第四樁函數(shù)用于傳遞數(shù)組信息;
若當(dāng)前指令為加載指令,則插入第五樁函數(shù),第五樁函數(shù)用于獲取加載指令參數(shù)的地址;
若當(dāng)前指令為存儲指令,則插入第六樁函數(shù),第六樁函數(shù)用于提取存儲指令的參數(shù)、并存儲符號執(zhí)行產(chǎn)生的新的符號變量;
若當(dāng)前指令為二元運(yùn)算指令,則插入第七樁函數(shù),第七樁函數(shù)用于加載二元運(yùn)算指令的參數(shù),用符號值模擬二元指令運(yùn)算;
若當(dāng)前指令為比較指令,則插入第八樁函數(shù),第八樁函數(shù)用于加載比較指令的參數(shù),模擬比較指令的比較運(yùn)算;
若當(dāng)前指令為分支指令,則插入第九樁函數(shù),第九樁函數(shù)用于標(biāo)記當(dāng)前程序分支;
若當(dāng)前指令為返回指令,則插入第十樁函數(shù),第十樁函數(shù)用于加載返回指令的參數(shù)、并處理返回指令的返回結(jié)果;
若當(dāng)前指令為函數(shù)調(diào)用指令,則判斷調(diào)用函數(shù)是否為分配內(nèi)存或釋放內(nèi)存,若是,則插入第十一樁函數(shù),第十一樁函數(shù)用于檢測內(nèi)存多次釋放;否則插入第十二樁函數(shù),第十二樁函數(shù)用于加載調(diào)用函數(shù)的參數(shù)并對函數(shù)返回結(jié)果做處理;
若當(dāng)前指令為轉(zhuǎn)換指令,則插入第十三樁函數(shù),第十三樁函數(shù)用于描述轉(zhuǎn)換關(guān)系;
若當(dāng)前指令為取元素指令,則插入第十四樁函數(shù),第十四樁函數(shù)用于檢測所取元素是否存在數(shù)組或指針越界。