復(fù)雜系統(tǒng)中不可達函數(shù)調(diào)用路徑檢測方法【專利摘要】本發(fā)明提供一種復(fù)雜系統(tǒng)中不可達函數(shù)調(diào)用路徑檢測方法,包括:步驟1、針對源代碼進行函數(shù)指針處理,以區(qū)分出函數(shù)指針的聲明、賦值、使用;步驟2、將經(jīng)過函數(shù)指針處理的源代碼生成源代碼的中間代碼;其中所述中間代碼包括多個函數(shù)單元,每一函數(shù)單元以一個函數(shù)為基本處理單元,且每一函數(shù)單元中包括至少一個基本代碼塊;提取每個基本代碼塊內(nèi)部的數(shù)據(jù)流信息和各個基本代碼塊之間的控制流信息,并存放在json文件中;步驟3、判斷控制流信息中分支節(jié)點是否具有確定的走向以進行不可達控制流的檢測?!緦@f明】復(fù)雜系統(tǒng)中不可達函數(shù)調(diào)用路徑檢測方法
技術(shù)領(lǐng)域:
[0001]本發(fā)明設(shè)及計算機
技術(shù)領(lǐng)域:
,尤其設(shè)及一種復(fù)雜系統(tǒng)中不可達函數(shù)調(diào)用路徑檢測方法。【
背景技術(shù):
】[0002]隨著社會的不斷進步和計算機技術(shù)的迅速發(fā)展,軟件作為計算機的靈魂,在國民經(jīng)濟和社會生活等方面的應(yīng)用日益廣泛。與此同時,隨著用戶需求的不斷提高,在軟件功能不斷增強的同時其規(guī)模也在不斷擴大,從而導(dǎo)致整個軟件系統(tǒng)越來越復(fù)雜。由于軟件復(fù)雜度是產(chǎn)生軟件缺陷的主要根源,因此復(fù)雜度的不斷提高對軟件的測試和維護工作也是一個新的挑戰(zhàn)。[0003]路徑測試法作為一種基本的測試方法,其關(guān)鍵在于如何準(zhǔn)確地獲取測試路徑的集合。其中基路徑測試是TomMc化be首先提出的一種路徑測試技術(shù),該方法的分析粒度定位在語句級,因此對于復(fù)雜系統(tǒng)來說,基于基路徑的測試工作量就會非常繁重。[0004]而基于函數(shù)調(diào)用的路徑測試方法將分析粒度擴展為函數(shù),W函數(shù)為基本單元,在單個函數(shù)完成單元測試的前提下,該方法不僅可W有效地對測試路徑集進行優(yōu)化,同時也可保證測試完全。針對于復(fù)雜系統(tǒng),該測試方法的優(yōu)勢更為突出,在保證測試充分的同時在很大程度上提高了測試的效率。[0005]函數(shù)調(diào)用路徑集的獲取是使用面向函數(shù)調(diào)用路徑測試方法的關(guān)鍵。由于動態(tài)執(zhí)行系統(tǒng)耗時耗力,因此針對復(fù)雜系統(tǒng)可通過靜態(tài)分析源代碼獲取系統(tǒng)的函數(shù)調(diào)用路徑。其中提高該測試方法效率的關(guān)鍵在于不可達路徑的檢測。首先,不可達路徑的檢測和去除不僅提高了函數(shù)調(diào)用路徑提取的準(zhǔn)確度、避免了冗余測試用例的生成耗費,同時降低了不可達路徑對測試覆蓋率的影響。其次,排除了不可達路徑上信息的干擾,更有助于軟件系統(tǒng)的理解、分析和錯誤定位。但是現(xiàn)有技術(shù)中缺少準(zhǔn)確高效的復(fù)雜系統(tǒng)中不可達函數(shù)調(diào)用路徑的檢測方法?!?br/>發(fā)明內(nèi)容】[0006]針對現(xiàn)有技術(shù)中存在的缺陷,本發(fā)明要解決的技術(shù)問題是提供一種復(fù)雜系統(tǒng)中不可達函數(shù)調(diào)用路徑檢測方法。[0007]為了解決上述問題,本發(fā)明實施例提出了一種復(fù)雜系統(tǒng)中不可達函數(shù)調(diào)用路徑檢測方法,包括:[0008]步驟1、針對源代碼進行函數(shù)指針處理,W區(qū)分出函數(shù)指針的聲明、賦值、使用;[0009]步驟2、將經(jīng)過函數(shù)指針處理的源代碼生成源代碼的中間代碼;其中所述中間代碼包括多個函數(shù)單元,每一函數(shù)單元W-個函數(shù)為基本處理單元,且每一函數(shù)單元中包括至少一個基本代碼塊;提取每個基本代碼塊內(nèi)部的數(shù)據(jù)流信息和各個基本代碼塊之間的控制流信息,并存放在jsonQavaScriptObjectNo1:ation)文件中;[0010]步驟3、判斷控制流信息中分支節(jié)點是否具有確定的走向W進行不可達控制流的檢測。[0011]其中,所述步驟巧體包括:[0012]根據(jù)預(yù)設(shè)的第一匹配模式對源代碼進行匹配,所述第一匹配模式的表達式為:[3-z]*[O[]*[*][_a-zA-Z]*[_a-zA-Z0-9]*[]][]*[();如果源代碼與第一匹配模式匹配,貝lJ該部分源代碼為函數(shù)指針的聲明或使用;判斷字典中是否存在該指針記錄;如果不存在,說明匹配的是函數(shù)指針的聲明,需將函數(shù)指針名作為鍵存放在字典中;如果存在,說明匹配的是函數(shù)指針的使用,則先從字典中查找該指針對應(yīng)的函數(shù),然后將源代碼中的指針名和函數(shù)名進行等效替換;[0013]根據(jù)預(yù)設(shè)的第二匹配模式對源代碼進行匹配,所述第二匹配模式的表達式為:[]*[_a-zA-Z]*[_a-zA-Z0-9]*[]*[=][]*[_a-zA-Z]*[_a-zA-Z0-9]*;如果源代碼與第二匹配模式匹配,則該部分源代碼為函數(shù)指針的賦值;將其所指向的函數(shù)存放在字典內(nèi)該鍵所對應(yīng)的值中。[0014]其中,所述步驟2具體包括:[0015]步驟21、W經(jīng)過函數(shù)指針處理的源代碼作為輸入,通過GCC編譯器生成源代碼的中間代碼;其中所述中間代碼包括多個函數(shù)單元,每一函數(shù)單元W-個函數(shù)為基本處理單元,且每一函數(shù)單元中包括至少一個基本代碼塊;[0016]步驟22、針對每一函數(shù)單元中的函數(shù)生成數(shù)據(jù)流信息,所述數(shù)據(jù)流信息W結(jié)構(gòu)樹的形式表示,該結(jié)構(gòu)樹中的葉子節(jié)點為其父節(jié)點的解釋說明;[0017]步驟23、提取基本代碼塊之間的控制流信息并同時提取基本代碼塊中的函數(shù)調(diào)用信息,將所述控制流信息W結(jié)構(gòu)樹的形式進行存儲。[001引其中,所述步驟3具體包括:[0019]步驟31、分析所述控制流信息的結(jié)構(gòu)樹,W獲取控制流中的起始節(jié)點;[0020]步驟32、判斷該當(dāng)前節(jié)點是否為分支節(jié)點,如果否則只保存其控制流路徑信息;如果是則對起始節(jié)點到當(dāng)前節(jié)點之間的路徑采用路徑敏感分析方法,獲取該局部路徑上的數(shù)據(jù)流信息;[0021]步驟33、分析該控制流信息的結(jié)構(gòu)樹中的各個節(jié)點之間數(shù)據(jù)流信息是否存在沖突;如果有沖突則該路徑為不可達控制流路徑;如果沒有沖突則采用深度優(yōu)先方法遍歷控制流信息中的下一個節(jié)點,并W該節(jié)點作為當(dāng)前節(jié)點,返回步驟32。[0022]其中,所述步驟33中還包括:針對不可達控制流,刪除該分支下的所有控制流信息。[0023]本發(fā)明的上述技術(shù)方案的有益效果如下:上述方案中提出了一種基于程序靜態(tài)分析的不可達函數(shù)調(diào)用路徑檢測方法,將函數(shù)指針和函數(shù)調(diào)用對數(shù)據(jù)流的分析因素考慮在內(nèi),結(jié)合數(shù)據(jù)流分析和探測分支相關(guān)性方法,W控制流中的分支節(jié)點為關(guān)鍵點,進行不可達控制流的檢測與去除,通過對處理后的控制流進行分析提取排除不可達路徑的函數(shù)調(diào)用路徑信息。實驗結(jié)果表明,該方法可W有效地對數(shù)據(jù)流的變化進行分析,準(zhǔn)確地對函數(shù)調(diào)用路徑中的不可達路徑進行檢測?!靖綀D說明】[0024]圖1為本發(fā)明實施例中的函數(shù)調(diào)用效果比對圖;[0025]圖2為本發(fā)明實施例中的數(shù)據(jù)流存儲結(jié)構(gòu)示例圖;[0026]圖3為本發(fā)明實施例中的數(shù)據(jù)流信息提取實例圖;[0027]圖4為本發(fā)明實施例中的控制流存儲結(jié)構(gòu)示例圖;[0028]圖5為本發(fā)明實施例中的控制流信息提取實例圖;[0029]圖6為函數(shù)調(diào)用路徑提取實例圖;[0030]圖7為函數(shù)調(diào)用路徑信息對比圖?!揪唧w實施方式】[0031]為使本發(fā)明要解決的技術(shù)問題、技術(shù)方案和優(yōu)點更加清楚,下面將結(jié)合附圖及具體實施例進行詳細描述。[0032]首先對本發(fā)明實施例中所使用概念進行說明W便于理解。[00削1、控制流圖:[0034]控制流圖由節(jié)點(N)和邊化)組成,其中每個節(jié)點表示一個基本代碼塊,每條邊有一個起始節(jié)點(B)和一個終止節(jié)點(D),表示基本代碼塊中的一個控制流。因此控制流圖可W用一個四元組表示<n,e,b,dxegnxn,bgn,dgn)。[0035]2、函數(shù)調(diào)用路徑集:針對程序源代碼,由函數(shù)調(diào)用關(guān)系得到的從程序入口點到出口點的函數(shù)名序列的集合,表示為G={P〇,Pl,,,,,Pn},Pi={F〇,F(xiàn)l,,,,,F(xiàn)n}表示其中的一條函數(shù)調(diào)用路徑,F(xiàn)j表示一個函數(shù),門和Fw的相鄰關(guān)系表示Fj調(diào)用了Fw,或Fj與Fw順序執(zhí)行。[0036]3、不可達函數(shù)調(diào)用路徑:在靜態(tài)分析得到的函數(shù)調(diào)用路徑集(G)中,如果存在一條路徑(P),任何輸入都不會使該路徑從起點完整地執(zhí)行到終點,則稱該路徑為不可達函數(shù)調(diào)用路徑??杀硎緸椋瑒tPGGinfeasible。其中Pin表示函數(shù)調(diào)用路徑P的輸入,Pex表示函數(shù)調(diào)用路徑P的動態(tài)執(zhí)行序列,Ginfeasible表示不可達函數(shù)調(diào)用路徑集。[0037]本發(fā)明實施例提出了一種不可達函數(shù)調(diào)用路徑檢測方法,包括:[003引1、函數(shù)指針處理[0039]函數(shù)指針處理旨在排除其對函數(shù)調(diào)用路徑靜態(tài)提取的干擾及對數(shù)據(jù)流的影響。如圖1所示,用存在關(guān)聯(lián)關(guān)系的兩段源代碼進行實驗:其中源代碼A中采用了函數(shù)指針的形式對函數(shù)進行調(diào)用操作,而源代碼B僅在源代碼A的基礎(chǔ)上對函數(shù)指針的使用部分略微調(diào)整,將函數(shù)指針和其所指向的函數(shù)進行替換。針對于源代碼A通過動態(tài)執(zhí)行的方法提取其函數(shù)調(diào)用路徑。針對于源代碼B借鑒W下的參考文獻12中的靜態(tài)提取函數(shù)調(diào)用路徑的方法提取其函數(shù)調(diào)用路徑。實驗顯示兩個源代碼獲取的函數(shù)調(diào)用路徑完全一致,該結(jié)果表明在使用函數(shù)指針進行函數(shù)調(diào)用的代碼中,無論是顯示指針名還是顯示其所指向的函數(shù)名,其調(diào)用效果是等效的。[0040]鑒于如圖1所示的實驗得出的結(jié)論,可將蟻變測試的原理運用于函數(shù)指針的處理中,在不影響函數(shù)調(diào)用路徑提取和后期測試效果的前提下,根據(jù)函數(shù)指針和函數(shù)間的關(guān)聯(lián)關(guān)系將兩者進行等效替換。在對源代碼進行靜態(tài)分析時采用一種pattern:action的方式。操作時先設(shè)定模式(pattern)和動作(action)之間的對應(yīng)關(guān)系,當(dāng)匹配到某條模式時執(zhí)行相應(yīng)的動作。對于函數(shù)指針的處理,主要匹配的模式是函數(shù)指針的聲明、賦值和使用。針對于普通的函數(shù)指針,將使用字典對指針和函數(shù)之間的關(guān)聯(lián)信息進行保存。字典是一個由鍵值對構(gòu)成的簡易的存儲結(jié)構(gòu),便于數(shù)據(jù)的存取和快速檢索。[0041]模式pattern如表1所示:[0042]表1模式列表[0043][0044]表中共有巧巾模式,左側(cè)為模式序號,右側(cè)為該模式的類正則表達式。匹配到模式Ml和M2時其執(zhí)行的操作各不相同:[0045]匹配到模式Ml時,首先判斷字典中是否存在該指針記錄;如果不存在,說明匹配的是函數(shù)指針的聲明,需將函數(shù)指針名作為鍵存放在字典中;如果存在,說明匹配的是函數(shù)指針的使用,可先從字典中查找該指針對應(yīng)的函數(shù),然后將源代碼中的指針名和函數(shù)名進行等效替換。[0046]匹配到模式M2,說明出現(xiàn)了函數(shù)指針的賦值操作,需將其所指向的函數(shù)存放在字典內(nèi)該鍵所對應(yīng)的值中。[0047]在靜態(tài)分析過程中采用自頂向下的分析策略,如果一個函數(shù)指針的指向發(fā)生變化,則及時更新字典中該函數(shù)指針?biāo)鶎?yīng)的函數(shù)名,保證信息提取的準(zhǔn)確性。[004引2、信息提取步驟;[0049]函數(shù)調(diào)用路徑是W函數(shù)為分析粒度提取出的程序執(zhí)行路徑。但進行不可達函數(shù)調(diào)用路徑信息提取時如果仍W函數(shù)為分析粒度,將遺漏大量的控制流和數(shù)據(jù)流信息,從而極大的降低后期檢測的效率和準(zhǔn)確度。因此在進行信息提取時W函數(shù)為處理單元,將粒度縮小為基本代碼塊,針對每個基本代碼塊中的控制流和數(shù)據(jù)流信息進行提取。W經(jīng)過函數(shù)指針處理的源代碼作為輸入,借助于GCC編譯器生成源代碼的中間代碼。中間代碼中W函數(shù)為基本處理單元,每個函數(shù)單元由若干個基本代碼塊組成。可從中提取每個基本代碼塊內(nèi)部的數(shù)據(jù)信息和各個基本代碼塊之間的控制信息,然后存放在特定格式的json文件中。[0050]-個程序可能由多個函數(shù)構(gòu)成,一個函數(shù)內(nèi)又可能包含多個基本代碼塊,并且每個基本代碼塊中設(shè)及到的變量可能也不止一個。運種復(fù)雜對應(yīng)關(guān)系的存儲結(jié)構(gòu)樹如圖2所示。其中一個結(jié)構(gòu)樹存放一個函數(shù)內(nèi)的數(shù)據(jù)流信息,樹中的葉子節(jié)點是對其父節(jié)點的解釋說明。針對于圖3左側(cè)的程序源代碼,其數(shù)據(jù)流信息的提取結(jié)果如圖3右側(cè)所示。[0051]同數(shù)據(jù)流類似,控制流信息也是W函數(shù)為基本處理單元。在提取控制流信息的同時對代碼塊中的函數(shù)調(diào)用信息也進行提取,并將其作為代碼塊中的一個屬性值保存在json文件中,其文件結(jié)構(gòu)樹如圖4所示。一個結(jié)構(gòu)樹存放一個函數(shù)內(nèi)的控制流信息。[0052]針對圖3中的源代碼,其控制流信息的提取過程如圖5所示。其中為了更加直觀地展示函數(shù)內(nèi)的控制結(jié)構(gòu),通過對json文件中的控制流信息進行分析可得到單個函數(shù)的控制流圖。[0化3]3、不可達判定步驟[0054]由于提取的控制流信息中包含函數(shù)調(diào)用信息,因此可通過對不可達控制流的檢測來達到檢測不可達函數(shù)調(diào)用路徑的目的。所W研究重點應(yīng)放在如何通過靜態(tài)分析檢測含有函數(shù)調(diào)用信息的不可達控制流。[0055]肖慶等人在文獻[13]中用實例證明路徑敏感方法能夠精確地獲取路徑上各分支節(jié)點的組合關(guān)系、區(qū)分不同路徑上的控制信息,可用于不可達路徑的檢測和去除。其中完整路徑分析方法需要準(zhǔn)確記錄每條不同路徑上的狀態(tài)信息,所W其復(fù)雜性和代價比較大[13]。基于運一情況,論文提出沿著控制流圖中的執(zhí)行路徑,采用自頂向下的分析策略,針對路徑起點到待分析節(jié)點之間采用路徑敏感分析方法進行不可達信息的檢測。[0056]靜態(tài)分析檢測不可達路徑常用的方法有兩種,其中基于路徑條件可滿足性[14-15]過于復(fù)雜,進行不可達路徑的檢測耗費太大,針對于復(fù)雜系統(tǒng)來說實用性比較差。關(guān)于探測分支相關(guān)性[16-1引,1997年Bod化等人指出一個復(fù)雜程序9%至40%的條件語句都存在相關(guān)性,通過分析條件相關(guān)性可W高效地進行不可達路徑的檢測[19]。[0057]基于W上分析,在利用路徑敏感分析方法自頂向下檢測不可達控制流時,可W控制流中分支節(jié)點為關(guān)鍵點,結(jié)合節(jié)點中的數(shù)據(jù)流進行分析,通過探測該分支節(jié)點的走向是否確定來進行不可達控制流的檢測。當(dāng)檢測到一個不可達分支時,可直接將該分支下的所有控制流信息移除,運樣可在很大程度上提高檢測的效率。[0058]在獲得單個函數(shù)內(nèi)控制流和數(shù)據(jù)流信息的基礎(chǔ)上進行不可達判定的步驟如下:[0059]1)從函數(shù)內(nèi)控制流中的節(jié)點入手分析,獲得控制流中的起始節(jié)點。[0060]2)判斷該節(jié)點是否為分支節(jié)點,如果不是,則只保存其控制流路徑信息。如果是分支節(jié)點,則針對于起始節(jié)點到該分支節(jié)點之間的路徑采用路徑敏感分析方法,獲取該局部路徑上的數(shù)據(jù)流信息。[0061]3)分析各節(jié)點中的數(shù)據(jù)流信息間是否存在沖突。若產(chǎn)生沖突,則判定存在不可達控制流,即可將沖突分支下的所有控制流信息移除。如果不存在沖突,則按深度優(yōu)先遍利的思想獲取控制流中的下一個節(jié)點,然后執(zhí)行第二步的操作。[0062]如此循環(huán)執(zhí)行,直到控制流中的所有節(jié)點都遍歷完畢,即可得到單個函數(shù)處理后的控制流信息,然后利用課題組已有算法從中提取函數(shù)調(diào)用路徑。[0063]針對W上研究思路,給出檢測單個函數(shù)內(nèi)不可達控制流信息的核屯、算法(optimize)如下:其中funcation_name為函數(shù)名,所需全局信息為該函數(shù)的控制流信息(Ctokens)和數(shù)據(jù)流信息(Dnodes),輸入為控制流中節(jié)點名稱(node_name)及從控制流中起始節(jié)點沿遍歷序列到該節(jié)點之前局部路徑上的數(shù)據(jù)流信息集合(Dfront),node_name的初始值為控制流圖中的起始節(jié)點,Dfrcnt的初始值可設(shè)為Null。輸出為該函數(shù)中經(jīng)處理后的控制流信息(Ctol《ens)O[0064][00化][0066]其中g(shù)et_tokens、get_nodes、find_token、del_token是針對控制流和數(shù)據(jù)流存儲文件的相關(guān)操作。detect扣打。nt,Dnode)用于檢測化ront和Dnode中的數(shù)據(jù)流信息是否存在沖突,該方法的返回值為Bool類型,如果存在沖突返回True,否則返回化1Se。combine(Dfront,Dnode)表示將Dfront和Dnode中的數(shù)據(jù)流信息進行集成。〇ptimize(n〇de,Dfront)表示遞歸調(diào)用本算法,Wnode和扣rnnt為新的輸入再次執(zhí)行。[0067]該控制流信息的節(jié)點中含有函數(shù)調(diào)用信息,因此可通過檢測不可達控制流來進行不可達函數(shù)調(diào)用路徑的檢測。由于不可達函數(shù)調(diào)用路徑在程序動態(tài)執(zhí)行時不存在,故檢測到不可達信息將進行去除操作。[006引5實驗與評測[0069]在實驗中,通過分析函數(shù)指針及函數(shù)調(diào)用對程序中數(shù)據(jù)流的影響,靜態(tài)獲取程序中的函數(shù)調(diào)用路徑,從而對論文中提出的不可達函數(shù)調(diào)用路徑的檢測方法進行驗證。[0070]圖6中左側(cè)部分為實驗源代碼,不進行函數(shù)指針的處理直接對源代碼進行靜態(tài)分析,且并未對不可達函數(shù)調(diào)用路徑進行檢測與去除,得函數(shù)調(diào)用路徑圖如圖6右側(cè)所示。其中<66旨;[]1〉和<6]1(1〉節(jié)點分別表示main函數(shù)的開始和結(jié)束。[0071]針對圖6中的源代碼進行函數(shù)指針的處理,然后考慮不同因素對數(shù)據(jù)流的影響,獲取其函數(shù)調(diào)用信息。其中條件Tl表示是否考慮函數(shù)指針對數(shù)據(jù)流的影響,Tl表示考慮,"-Tl表示不考慮。條件T2表示是否考慮函數(shù)調(diào)用對數(shù)據(jù)流的影響,T2表示考慮,表示不考慮。針對不同的情況進行分析得其函數(shù)調(diào)用路徑信息如圖7所示。[0072]圖7中不同情況下函數(shù)調(diào)用路徑信息的對比分析結(jié)果如表2、表3所示,其中路徑的可達性用'日日3比1日八址日日3比1日表示。[0073]夫2巧掛調(diào)巧路巧編號對脈夫[0074][0075][0076][0077]本發(fā)明實施例中引用的參考文獻列表如下,本發(fā)明實施例將W下參考文獻全文引用于此:[0078][1]單錦輝,姜琪,孫萍.軟件測試研究進展[J].北京大學(xué)學(xué)報(自然科學(xué)版),2005,41(1):134-145.[0079][2]蔡開元.軟件可靠性工程基礎(chǔ)[M].北京:清華大學(xué)出版社,1995.[0080][3]梅玲霞,張忠林.軟件測試中基路徑獲取方法的研究[J].蘭州交通大學(xué)學(xué)報,2011,1:6-9.[0081][4]解圣霞.基于基本路徑測試的程序圖自動生成的應(yīng)用研究[J].通化師范學(xué)院學(xué)報,2009,12:32-35.[0082][5]WatsonAH,McCabeTJ,WallaceDR.Structuredtesting:Atestingmethodologyusingthecyclomaticcomplexitymetric[J].NISTspecialPubIication,I996,500(235):1-114.[0083][6]MUYongmin,Z皿NGYuhui,ZHANGZhihuaetal.Thealgorithmofinfe曰siblep曰thsextr曰ctionorientedthefunctionc曰Ilingrel曰tionship[J].CHI肥沈JOURNALOFELECTRONICS,2012,21(2):236-240.[0084][7]MARTIN沈,TOYOTACM'YANAGAWA化.Constructingself-testablesoftwarecomponents[C]//Proceedingsofthe2001InterMtionalConferenceonDependableSystemsandNetworks.Washington:IEEEComputerSociety,2001:151-160.[00化][8]YANJ,ZHANGJ.Anefficientmethodtogeneratefeasiblepathsforbasispathtesting[J].InformationProcessingLetters,2008,3(107):87-92.[0086][9]NgoMN,TanHBK.Detectinglargenumberofinfeasiblepathsthroughrecognizingtheirpatterns[C]//Proceedingsofthe6thJointMeetingoftheEuropeanSoftwareEngineeringConferenceandtheACMSIGSOFTSymposiumontheFoundationsofSoftwareEngineering(ESEC/FSE),CavatnearDubrovnik,Croatia,2007.NewYork,NY,USA:ACM,2007:215-224.[0087][lOjBangL,AydinA,Bultan!.Automaticallycomputingpathcomplexityofprograms[C]//Proceedingsofthe201510thJointMeetingonFoundationsofSoftwareEngineering.ACM,2015:61-72.[0088][11]牟永敏,姜智焚,張志華.面向C程序插裝的路徑提取[J].計算機工程與應(yīng)用,2011,47(1):67-69.[0089][12]牟永敏,楊志嘉.基于函數(shù)調(diào)用路徑的軟件實現(xiàn)與設(shè)計一致性驗證[J].中國科學(xué):信息科學(xué),2014(10):1290-1304.[0090][13]肖慶,宮云戰(zhàn),楊朝紅,金大海,王雅文.一種路徑敏感的靜態(tài)缺陷檢測方法[J].軟件學(xué)報.2010(02):209-217.[0091][14]PeresLM,VergilioSR,JinoM,etal.Pathselectioninthestructuraltesting:proposition,implementationandapplicationofstrategies[C]//ComputerScienceSociety,2001.SCCC'Ol.Proceedings.XXIInternatinalConferenceof化eQiilean.IE邸,2001:240-246.[0092][15]GillesA,SylvianeSE.Explanation-BasedGeneralizationofInfeasiblePath[C]//SoftwareTesting,VerificationandValidation(ICST),2010ThirdInternationalConferenceon.IEEE,2010:215-224.[0093][16]ChenT,MitraT,民oychoudhuryA,etal.Exploitingbranchconstraintswithoutexhaustivepathenumeration[C]//Proceedingsofthe5thInternationalWorkshoponWorst-CaseExecutionTimeAnalysis(WCET'05),PalmadeMallorca,Spain,2005:40-43.[0094][17]SuhendraV'MitraT'RoychoudhuryA,etal.Efficientdetectionandexploitationofinfeasiblepathsforsoftwaretiminganalysis[C]//Proceedingsofthe43rdannualDesignAutomationConference.ACM,2006:358-363.[009己][18]ZhimagX,ZhangT,Pa打deS.UsingBranchCorrelationtoIdentifyInfeasiblePathsforAnomalyDetection.[J].ProceedingsofAnnuallEEE/ACMInternationalSymposiumonMicroarchitecture,2006:113-122.[0096][19]Bodik民,Gupta民,SoffaML.民efiningdataflowinformationusinginfeasiblepaths[J].LectureNotesinComputerScience,1997,22(6):361-377.[0097]W上所述是本發(fā)明的優(yōu)選實施方式,應(yīng)當(dāng)指出,對于本
技術(shù)領(lǐng)域:
的普通技術(shù)人員來說,在不脫離本發(fā)明所述原理的前提下,還可W作出若干改進和潤飾,這些改進和潤飾也應(yīng)視為本發(fā)明的保護范圍?!局鳈?quán)項】1.一種復(fù)雜系統(tǒng)中不可達函數(shù)調(diào)用路徑檢測方法,其特征在于,包括:步驟1、針對源代碼進行函數(shù)指針處理,以區(qū)分出函數(shù)指針的聲明、賦值、使用;步驟2、將經(jīng)過函數(shù)指針處理的源代碼生成源代碼的中間代碼;其中所述中間代碼包括多個函數(shù)單元,每一函數(shù)單元以一個函數(shù)為基本處理單元,且每一函數(shù)單元中包括至少一個基本代碼塊;提取每個基本代碼塊內(nèi)部的數(shù)據(jù)流信息和各個基本代碼塊之間的控制流信息,并存放在json文件中;步驟3、判斷控制流信息中分支節(jié)點是否具有確定的走向以進行不可達控制流的檢測。2.根據(jù)權(quán)利要求1所述的復(fù)雜系統(tǒng)中不可達函數(shù)調(diào)用路徑檢測方法,其特征在于,其中所述步驟1具體包括:根據(jù)預(yù)設(shè)的第一匹配模式對源代碼進行匹配,所述第一匹配模式的表達式為:[a-z]*[0[]*[*][_a-zA-Z]*[_a-zA-Z0-9]*[]][]*[();如果源代碼與第一匹配模式匹配,則該部分源代碼為函數(shù)指針的聲明或使用;判斷字典中是否存在該指針記錄;如果不存在,說明匹配的是函數(shù)指針的聲明,需將函數(shù)指針名作為鍵存放在字典中;如果存在,說明匹配的是函數(shù)指針的使用,則先從字典中查找該指針對應(yīng)的函數(shù),然后將源代碼中的指針名和函數(shù)名進行等效替換;根據(jù)預(yù)設(shè)的第二匹配模式對源代碼進行匹配,所述第二匹配模式的表達式為:[]*[_3_zA-Z]*[_a-zA_Z〇-9]*[]*[=][]*[_a-zA-Z]*[_a-zA_Z〇-9]*;如果源代碼與第二匹配模式匹配,則該部分源代碼為函數(shù)指針的賦值;將其所指向的函數(shù)存放在字典內(nèi)該鍵所對應(yīng)的值中。3.根據(jù)權(quán)利要求1所述的復(fù)雜系統(tǒng)中不可達函數(shù)調(diào)用路徑檢測方法,其特征在于,其中所述步驟2具體包括:步驟21、以經(jīng)過函數(shù)指針處理的源代碼作為輸入,通過GCC編譯器生成源代碼的中間代碼;其中所述中間代碼包括多個函數(shù)單元,每一函數(shù)單元以一個函數(shù)為基本處理單元,且每一函數(shù)單元中包括至少一個基本代碼塊;步驟22、針對每一函數(shù)單元中的函數(shù)生成數(shù)據(jù)流信息,所述數(shù)據(jù)流信息以結(jié)構(gòu)樹的形式表示,該結(jié)構(gòu)樹中的葉子節(jié)點為其父節(jié)點的解釋說明;步驟23、提取基本代碼塊之間的控制流信息并同時提取基本代碼塊中的函數(shù)調(diào)用信息,將所述控制流信息以結(jié)構(gòu)樹的形式進行存儲。4.根據(jù)權(quán)利要求3所述的復(fù)雜系統(tǒng)中不可達函數(shù)調(diào)用路徑檢測方法,其特征在于,其中所述步驟3具體包括:步驟31、分析所述控制流信息的結(jié)構(gòu)樹,以獲取控制流中的起始節(jié)點;步驟32、判斷該當(dāng)前節(jié)點是否為分支節(jié)點,如果否則只保存其控制流路徑信息;如果是則對起始節(jié)點到當(dāng)前節(jié)點之間的路徑采用路徑敏感分析方法,獲取該局部路徑上的數(shù)據(jù)流信息;步驟33、分析該控制流信息的結(jié)構(gòu)樹中的各個節(jié)點之間數(shù)據(jù)流信息是否存在沖突;如果有沖突則該路徑為不可達控制流路徑;如果沒有沖突則采用深度優(yōu)先方法遍歷控制流信息中的下一個節(jié)點,并以該節(jié)點作為當(dāng)前節(jié)點,返回步驟32。5.根據(jù)權(quán)利要求4所述的復(fù)雜系統(tǒng)中不可達函數(shù)調(diào)用路徑檢測方法,其特征在于,所述步驟33中還包括:針對不可達控制流,刪除該分支下的所有控制流信息?!疚臋n編號】G06F11/36GK106021116SQ201610397496【公開日】2016年10月12日【申請日】2016年6月7日【發(fā)明人】牟永敏【申請人】北京信息科技大學(xué),牟永敏