本發(fā)明涉及程序切片和軟件度量的相關方法,提供了一種基于llvm中間表示程序切片的度量模型,屬于計算機程序技術領域。
背景技術:
隨著計算機產(chǎn)業(yè)的迅速發(fā)展,大量軟件產(chǎn)品被運用到社會生活中。在軟件系統(tǒng)的數(shù)量和規(guī)模不斷壯大的同時,軟件開發(fā)、測試中出現(xiàn)的問題和軟件維護的成本也不斷地增加。許多傳統(tǒng)的軟件分析手段已經(jīng)無法滿足現(xiàn)有的軟件分析的需求,需要查找新的技術和方法來幫助解決這一問題。由此,程序分析成為了軟件領域中非常重要的組成部分。
自m.weiser于1979年在其博士論文中提出程序切片以后,程序切片的理論和應用開發(fā)都取得了很大的發(fā)展,使之在軟件測試、維護、程序理解、優(yōu)化等方面均占有非常重要的地位。程序切片是一種分析和理解程序的技術,是通過對源程序中每個興趣點分別進行切片來達到對程序的分析和理解。簡單來說,程序切片技術就是通過簡化程序來方便人們對程序進行研究。
軟件度量是保證軟件質(zhì)量的重要指標。在halstead、maccabe、cyclomaticcomplexity、designcomplexity等度量指標不斷地運用到軟件分析后?;诔绦蚯衅亩攘恐笜艘脖贿\用到軟件的模塊化分析中去了?;谇衅亩攘科鋵嵕褪抢贸绦蚯衅夹g對模塊中的輸出變量進行切片,并對切片結果進行處理,從而通過計算得到一系列量化指標,通過指標量化模塊中元素的函數(shù)相關性的強度,從而對所開發(fā)的程序進行分析?,F(xiàn)在基于切片的度量方法在衡量軟件再造工程的進展情況或者通過對軟件錯誤模塊的分析,來預測新的可能出現(xiàn)的軟件漏洞方面都起著巨大的作用。
雖然基于程序切片的度量已經(jīng)被運用的程序分析中去,但是由于程序切片的分析的基本單位是語句,系統(tǒng)依賴圖的構建也是基于程序行號的,得到的切片結果的切片集是語句行號集。而片的對象一般都是c、c++、python等某種特定語言編寫的程序,通用性不強。
llvmir(lowlevelvirtualmachineintermediaterepresentation,底層虛擬機中間表示)是一種介于c語言和匯編語言的格式,既有高級語言的可讀性,又能比較全面地反映計算機底層數(shù)據(jù)的運算和傳輸?shù)那闆r,精煉而又高效。任何一種編程語言都可以轉(zhuǎn)化成llvmir,llvmir也可以轉(zhuǎn)化為任何一種編程語言。由llvmir構建的系統(tǒng)依賴圖和進行程序切片的結果集的基本單位都是指令,這樣可以加大程序切片的通用性和分析程序的精度。
本發(fā)明使用llvmir進行程序切片,并將切片結果及指令集進行度量計算,大大提高了程序切片的通用性和度量的精度。
技術實現(xiàn)要素:
本發(fā)明的目的在于克服現(xiàn)有技術的不足之處,提供一種基于llvm中間表示程序切片的度量模型,可以使程序切片的通用性和度量的精度有效提高。
為解決上述現(xiàn)有技術的問題,本發(fā)明采用以下技術方案。
本發(fā)明的一種基于llvm中間表示程序切片的度量模型,其特征在于,包括以下步驟:
步驟(1)將源程序通過llvm的命令行轉(zhuǎn)換成對應的llvmir語言;
步驟(2)將llvmir構建系統(tǒng)依賴圖,得到對應的程序切片;
步驟(3)得到源程序的輸出變量對應的指令及指令集、程序操作符和操作數(shù)的信息,即:根據(jù)程序切片的結果和源程序轉(zhuǎn)換得到的llvmir語句得到程序中每個模塊的模塊大小,輸出變量的個數(shù),根據(jù)每個度量模塊所有輸出變量的切片集中最大的切片集大小和最小的切片集的大小,和所有變量的公共切片集;
步驟(4)根據(jù)llvmir的切片結果和各種度量公式計算函數(shù)模塊的各度量值,即:將步驟(3)中得到的值帶入到度量函數(shù)中,完成對函數(shù)的llvmir度量,然后計算程序的halstead度量;
步驟(5)根據(jù)各度量值計算評估,即:將程序所有的度量結果先去除具有相同作用的度量值,再將剩余的度量值根據(jù)對程序的可靠性,穩(wěn)定性的影響情況進行排序,得到對程序如果出錯或者發(fā)布前的模塊檢查順序。
所述步驟(1)的具體過程為:
步驟1.1)使用命令clang-emit-llvm-chello.c-ohello.bc得到二進制的.bc文件:
步驟1.2)使用命令llvm-dishello.bc得到對應的可讀的hello.ll文件,再通過文本編輯器打開。
所述步驟(2)的具體過程為:
步驟2.1)構造程序的控制流圖cfg;
步驟2.2)添加入口節(jié)點,formal-in節(jié)點,formal-out節(jié)點,actual-in節(jié)點,actual-out節(jié)點;
步驟2.3)添加控制依賴邊;
步驟2.4)添加數(shù)據(jù)依賴邊;
步驟2.5)根據(jù)formal-in/-out和actual-in/-out節(jié)點的對應關系,獲得程序調(diào)用過程中actual-out點對actual-in點的依賴,添加summary邊;
步驟2.6)基于切片準則,利用hrb的兩階段圖形可達性算法對系統(tǒng)依賴圖進行后向遍歷。
所述步驟(3)的具體過程為:
步驟3.1)找到源程序中每個子程序的的返回值rv,輸出語句中的輸出變量pv,程序中被改變的全局變量gv,函數(shù)應用參數(shù)rfv作為輸出變量,放入輸出變量集ovs;
步驟3.2)從切片集中找到每個子程序ovs對應的指令切片集;
步驟3.3)通過ovs的指令集計算該子程序的#ovs、#mod、{modi}、maxmod、minmod、conmod;
所述的#ovs是指ovs的個數(shù),#mod是指子程序的指令條數(shù),{modi}是指ovs中每個元素的指令條數(shù),maxmod是指每個模塊中ovs中的元素中有最大指令切片集的指令條數(shù),minmod是指每個模塊中ovs中的元素中有最小指令切片集的指令條數(shù),conmod是指ovs中所有元素對應的切片集中具有的相同的指令的條數(shù);
步驟3.4)根據(jù)程序?qū)膌lvmir程序,得到程序的唯一操作數(shù)數(shù)量η1、唯一操作符數(shù)量η2、程序中出現(xiàn)的所有操作數(shù)n1和程序中出現(xiàn)的所有操作符n2。
所述步驟(4)的具體過程為:
步驟4.1)根據(jù)函數(shù)的基本屬性和切片基本值得到程序的totalirs;
步驟4.2)根據(jù)
步驟4.3)根據(jù)
步驟4.4)根據(jù)
步驟4.5)根據(jù)
步驟4.6)根據(jù)
步驟4.7)得到該程序中的所有子程序之間的耦合情況couplingir(f,g),f和g為程序中不同的子程序;
步驟4.8)根據(jù)n=n1+n2,v=n×log(η),得到halstead中程序長度n,和程序容量v;
步驟4.9)根據(jù)程序的依賴圖得到cyclmaticcomp=e-n+2p,e,n,p分別為控制流圖中邊的數(shù)量、節(jié)點的數(shù)量和連接組件數(shù)目。
所述步驟(5)的具體過程為:
步驟5.1)將多個度量指標進行主成分分析,根據(jù)主成分分析的方法去除對程序具有相同影響作用的度量指標;
步驟5.2)將步驟5.1)處理后得到的度量指標分別根據(jù)其各自的貢獻值將這些度量指標進行排序;
步驟5.3)根據(jù)步驟5.2)構建復雜性度量函數(shù)
步驟5.4)根據(jù)各度量指標對程序的分析,按照其影響作用的不同情況,得到各子程序的在復雜度方面的一個排序;復雜度函數(shù)考慮到的各方面包括:穩(wěn)定性、可移植性、容易出錯的情況;與現(xiàn)有技術相比,本發(fā)明具有以下優(yōu)點和有益效果:
(1)本發(fā)明使用llvmir作為程序切片的基本單位,而不是某種具體的編程語言,并將切片結果對應行號取出來,用程序切片結果及源程序轉(zhuǎn)換成的llvm進行度量計算,這提高了程序切片的通用性和基于程序切片的軟件度量的精確度。
(2)本發(fā)明所提出的度量模型中對程序的分析粒度更細,由語句級變成llvmir指令級,由此得到的度量結果更精確。
(3)本發(fā)明將基于切片度量的內(nèi)聚度,耦合度、halstead結合起來使用,并提出了基于切片度量的復雜性度量complexity,可以幫助開發(fā)人員合理的分配開發(fā)資源。
附圖說明
圖1是本發(fā)明的一種實施例的方法流程圖。
具體實施方式
下面結合附圖對本發(fā)明做進一步詳細說明。
圖1是本發(fā)明一種基于llvm中間表示程序切片的度量模型的一種實施例的方法流程圖。如圖1所示,該實施例方法包括以下步驟:
步驟(1)將源程序通過llvm的命令行轉(zhuǎn)換成對應的llvmir語言;
步驟(2)將llvmir構建系統(tǒng)依賴圖,得到對應的程序切片;
步驟(3)得到源程序的輸出變量對應的指令及指令集、程序操作符和操作數(shù)的信息,即:根據(jù)程序切片的結果和源程序轉(zhuǎn)換得到的llvmir語句得到程序中每個模塊的模塊大小,輸出變量的個數(shù),根據(jù)每個度量模塊所有輸出變量的切片集中最大的切片集大小和最小的切片集的大小,和所有變量的公共切片集;
步驟(4)根據(jù)llvmir的切片結果和各種度量公式計算函數(shù)模塊的各度量值,即:將步驟(3)中得到的值帶入到度量函數(shù)中,完成對函數(shù)的llvmir度量,然后計算程序的halstead度量和圈復雜度度量;
步驟(5)根據(jù)各度量值計算評估,即:將程序所有的度量結果先去除具有相同作用的度量值,再將剩余的度量值根據(jù)對程序的可靠性,穩(wěn)定性的影響情況進行排序,得到對程序如果出錯或者發(fā)布前的模塊檢查順序。
所述步驟(1)的具體過程為:
步驟1.1)使用命令clang-emit-llvm-chello.c-ohello.bc得到二進制的.bc文件:
步驟1.2)使用命令llvm-dishello.bc得到對應的可讀的hello.ll文件,再通過文本編輯器打開。
所述步驟(2)的具體過程為:
步驟2.1)構造程序的控制流圖cfg;
步驟2.2)添加入口節(jié)點,formal-in節(jié)點,formal-out節(jié)點,actual-in節(jié)點,actual-out節(jié)點;
步驟2.3)添加控制依賴邊;
步驟2.4)添加數(shù)據(jù)依賴邊;
步驟2.5)根據(jù)formal-in/-out和actual-in/-out節(jié)點的對應關系,獲得程序調(diào)用過程中actual-out點對actual-in點的依賴,添加summary邊;
步驟2.6)基于切片準則,利用hrb的兩階段圖形可達性算法對系統(tǒng)依賴圖進行后向遍歷。
所述步驟(3)的具體過程為:
步驟3.1)找到源程序中每個子程序的的返回值rv,輸出語句中的輸出變量pv,程序中被改變的全局變量gv,函數(shù)應用參數(shù)rfv作為輸出變量,放入輸出變量集ovs;
步驟3.2)從切片集中找到每個子程序ovs對應的指令切片集;
步驟3.3)通過ovs的指令集計算該子程序的#ovs、#mod、{modi}、maxmod、minmod、conmod;
所述的#ovs是指ovs的個數(shù),#mod是指子程序的指令條數(shù),{modi}是指ovs中每個元素的指令條數(shù),maxmod是指每個模塊中ovs中的元素中有最大指令切片集的指令條數(shù),minmod是指每個模塊中ovs中的元素中有最小指令切片集的指令條數(shù),conmod是指ovs中所有元素對應的切片集中具有的相同的指令的條數(shù);
步驟3.4)根據(jù)程序?qū)膌lvmir程序,得到程序的唯一操作數(shù)數(shù)量η1、惟一操作符數(shù)量η2、程序中出現(xiàn)的所有操作數(shù)n1和程序中出現(xiàn)的所有操作符n2。
所述步驟(4)的具體過程為:
步驟4.1)根據(jù)函數(shù)的基本屬性和切片基本值得到程序的totalirs;
步驟4.2)根據(jù)
步驟4.3)根據(jù)
步驟4.4)根據(jù)
步驟4.5)根據(jù)
步驟4.6)根據(jù)
步驟4.7)得到該程序中的所有子程序之間的耦合情況couplingir(f,g),f和g為程序中不同的子程序;
步驟4.8)根據(jù)n=n1+n2,v=n×log(η),得到halstead中程序長度n,和程序容量v;
步驟4.9)根據(jù)程序的依賴圖得到cyclmaticcomp=e-n+2p,e,n,p分別為控制流圖中邊的數(shù)量、節(jié)點的數(shù)量和連接組件數(shù)目。
所述步驟(5)的具體過程為:
步驟5.1)將多個度量指標進行主成分分析,根據(jù)主成分分析的方法去除對程序具有相同影響作用的度量指標;
步驟5.2)將步驟5.1)處理后得到的度量指標分別根據(jù)其各自的貢獻值將這些度量指標進行排序;
步驟5.3)根據(jù)步驟5.2)構建復雜性度量函數(shù)
步驟5.4)根據(jù)各度量指標對程序的分析,按照其影響作用的不同情況,得到各子程序的在復雜度方面的一個排序;復雜度函數(shù)考慮到的各方面包括:穩(wěn)定性、可移植性、容易出錯的情況;
步驟5.5)若軟件或程序出現(xiàn)問題,則根據(jù)軟件容易出錯的順序進行檢查修改。
綜上所述,本發(fā)明提供了一種基于llvm中間表示程序切片的度量模型。首先,將源程序通過llvm的命令行轉(zhuǎn)換成對應的llvmir語言;構建程序系統(tǒng)依賴圖,對程序的llvmir語句進行切片。然后根據(jù)程序切片的結果和源程序轉(zhuǎn)換得到的llvmir語句得到程序中每個模塊的模塊大小,變量的多少,所有變量的切片集中最大的切片集大大小和最小的切片集的大小,和所有變量的公共切片集。然后將上述步驟中的切片基本值帶入llvmir度量函數(shù)和常用的halstead、cyclomaticcomplexity等度量函數(shù),該度量函數(shù)涉及到對m.weiser及l(fā)ongworth等人提出并改進后的關于函數(shù)間內(nèi)聚和耦合相關的度量函數(shù)的在llvmir的重新使用和halstead度量和圈復雜度度量,計算度量值。最后將程序所有的度量結果先去除具有相同作用的度量值,再將剩余的度量值根據(jù)對程序的可靠性,穩(wěn)定性的影響情況進行排序,得到對程序如果出錯或者發(fā)布前的模塊檢查順序。