動靜態(tài)結(jié)合的中斷驅(qū)動程序數(shù)據(jù)競爭檢測方法
【專利摘要】本發(fā)明設(shè)計一種動靜態(tài)結(jié)合的中斷驅(qū)動程序數(shù)據(jù)競爭檢測方法,該方法通過共享資源的檢測技術(shù)、控制流圖生成技術(shù)、數(shù)據(jù)流分析技術(shù)、模擬器運行控制技術(shù),利用靜態(tài)方法來對源程序進行靜態(tài)分析得到潛在的數(shù)據(jù)競爭序列,通過對靜態(tài)分析的結(jié)果進行動態(tài)執(zhí)行,驗證潛在競爭的真實性,并根據(jù)潛在競爭的嚴重性進行排序,得到測試結(jié)果報告。通過本發(fā)明實現(xiàn)的工具對中斷驅(qū)動程序的測試,可以有效地檢測出真實的中斷相關(guān)的競爭關(guān)系,并根據(jù)嚴重性提供一系列的潛在競爭關(guān)系作為指導(dǎo),能夠極大地促進測試人員的工作效率,突破解決了中斷驅(qū)動的數(shù)據(jù)競爭檢測問題,保障嵌入式系統(tǒng)的安全和穩(wěn)定,可以為航天、醫(yī)療等高穩(wěn)定性嵌入式程序需求的關(guān)鍵性安全領(lǐng)域提供可靠性保證。
【專利說明】動靜態(tài)結(jié)合的中斷驅(qū)動程序數(shù)據(jù)競爭檢測方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及中斷驅(qū)動程序的測試方法,主要涉及中斷引發(fā)的嵌入式系統(tǒng)中的數(shù)據(jù) 競爭檢測,屬于軟件工程、軟件測試、嵌入式系統(tǒng)交叉【技術(shù)領(lǐng)域】。
【背景技術(shù)】
[0002] 嵌入式系統(tǒng)被廣泛應(yīng)用在各個領(lǐng)域,包括汽車電子、航天電子、醫(yī)療電子等。這些 領(lǐng)域往往對安全性和穩(wěn)定性的要求特別高,任何的系統(tǒng)運行故障都會導(dǎo)致及其嚴重的后 果,比如著名的Therac-25事件,就是在某些種特殊場景下的一次不小心的按鍵動作,導(dǎo)致 了中斷引發(fā)的數(shù)據(jù)競爭,最終了嚴重的醫(yī)療后果。
[0003] 中斷驅(qū)動的嵌入式系統(tǒng)的穩(wěn)定和安全具有很高的重要性,但嵌入式系統(tǒng)程序的錯 誤,尤其是其并發(fā)性錯誤,被認為是極其難以檢測、定位和修復(fù)的。這主要是因為并發(fā)錯誤 對執(zhí)行序列很敏感,即使是同一測試用例,每次的執(zhí)行序列都有可能不同,最終造成無法預(yù) 測程序的執(zhí)行結(jié)果。因此,依賴傳統(tǒng)的通過檢查程序輸出結(jié)果來判斷程序錯誤的方法,無法 檢測出大多數(shù)的并發(fā)錯誤。此外,中斷本身和硬件緊密相關(guān),系統(tǒng)運行環(huán)境復(fù)雜,更加劇了 對并發(fā)錯誤的檢測、定位和修復(fù)的難度。
[0004] 如何設(shè)計一個較為完整的能夠檢測中斷驅(qū)動的嵌入式系統(tǒng)中數(shù)據(jù)競爭的自動化 方法,來有效、高效地幫助測試人員提供工作效率,保障安全性嵌入式系統(tǒng)的穩(wěn)定性和魯棒 性,是我們一直在思考的問題。
[0005] 傳統(tǒng)的解決方法有:通過將中斷驅(qū)動程序轉(zhuǎn)換成多線程程序,然后利用多線程中 的數(shù)據(jù)檢測工具找到競爭問題,然而,中斷驅(qū)動程序和多線程程序在諸多方面的特性存在 著本質(zhì)的區(qū)別,二者的轉(zhuǎn)換勢必造成信息量的丟失,導(dǎo)致報告結(jié)果的誤報;采用隨機化調(diào) 度、基于共享變量訪問的調(diào)度等方法,通過對程序的插樁來動態(tài)執(zhí)行程序,找到競爭問題, 但是,由于其強制的路徑執(zhí)行方法造成了諸多誤報,且大量的人工操作影響了工具的實用 性,導(dǎo)致了該方法不具備可使用性;還有基于模擬器的方法,雖然能夠一定程度上檢測到數(shù) 據(jù)競爭問題,卻因為需要監(jiān)控系統(tǒng)的全部狀態(tài),且需要進行多次重復(fù)運行,系統(tǒng)開銷大,時 間成本高。
[0006] 目前對中斷驅(qū)動程序的數(shù)據(jù)競爭檢測仍存在著兩個瓶頸:一是結(jié)果的準確性問 題,在避免誤報的同時能夠盡量避免漏報;二是實用性問題,其測試方法應(yīng)該能夠不依賴于 具體的系統(tǒng)和平臺,具有廣泛的應(yīng)用場景。本發(fā)明設(shè)計一種動靜態(tài)結(jié)合的競爭檢測方法,通 過共享資源的檢測技術(shù),控制流圖生成技術(shù),數(shù)據(jù)流分析技術(shù),模擬器運行控制技術(shù),檢測 并驗證出系統(tǒng)的競爭關(guān)系,突破了上述的兩個瓶頸,解決了中斷驅(qū)動的數(shù)據(jù)競爭檢測問題, 保障嵌入式系統(tǒng)的安全和穩(wěn)定,為我國航天事業(yè)、醫(yī)療事業(yè)等高穩(wěn)定性嵌入式程序需求的 關(guān)鍵性安全領(lǐng)域提供可靠性保證。
【發(fā)明內(nèi)容】
[0007] 技術(shù)問題:本發(fā)明的目的是設(shè)計一種動靜態(tài)結(jié)合的中斷驅(qū)動程序數(shù)據(jù)競爭檢測方 法,以保障安全性嵌入式系統(tǒng)的穩(wěn)定性和魯棒性,解決中斷驅(qū)動的嵌入式系統(tǒng)程序中存在 的嚴重威脅系統(tǒng)安全和穩(wěn)定性的數(shù)據(jù)競爭問題。
[0008] 技術(shù)方案:本發(fā)明提供一種動靜態(tài)結(jié)合的中斷驅(qū)動程序數(shù)據(jù)競爭檢測方法,利用 靜態(tài)方法來對源程序進行靜態(tài)分析得到潛在的數(shù)據(jù)競爭序列,通過對靜態(tài)分析的結(jié)果進行 動態(tài)執(zhí)行,驗證潛在競爭的真實性,并根據(jù)潛在競爭的嚴重性進行排序,得到測試結(jié)果報 生 1=1 〇
[0009] 本發(fā)明的動靜態(tài)結(jié)合的中斷驅(qū)動程序數(shù)據(jù)競爭檢測方法包含的步驟為:
[0010] 步驟1 :用戶指定受測試的中斷驅(qū)動程序源文件,所述的中斷驅(qū)動程序源文件包 含若干個函數(shù)構(gòu)成的主任務(wù)的源代碼,以及該任務(wù)涉及到的中斷所對應(yīng)的中斷處理程序的 源代碼;
[0011] 步驟2:用戶指定測試的配置文件,所述配置文件是XML文件,XML的全稱是可擴展 標記語言,可以用來標記數(shù)據(jù)、定義數(shù)據(jù)類型,是一種允許用戶對自己的標記語言進行定義 的源語言;所述的測試配置文件包括主函數(shù)的入口說明、各個中斷處理程序的中斷向量號 和中斷優(yōu)先級;
[0012] 步驟3 :對受測試的中斷驅(qū)動程序源文件進行共享資源檢測,得到共享資源列表;
[0013] 步驟4:對受測試的中斷驅(qū)動程序源文件進行中斷操作行為檢測,得到中斷操作 列表;
[0014] 步驟5 :對中斷驅(qū)動程序源文件進行分析,得到簡要控制流圖RCFG,
[0015] 步驟6 :將所有的RCFG互聯(lián)起來,得到全局的中斷互聯(lián)控制流圖IICFG ;
[0016] 步驟7 :對IICFG進行深度優(yōu)先遍歷,得到中斷驅(qū)動源程序的靜態(tài)分析結(jié)果;
[0017] 步驟8:在西米克斯Simics仿真平臺中執(zhí)行中斷驅(qū)動程序源文件,驗證PR中的所 有靜態(tài)分析結(jié)果,
[0018] 步驟9 :對驗證后的驗證結(jié)果進行嚴重性排序,從而得到了對受測試的中斷驅(qū)動 程序源文件的競爭檢測結(jié)果。
[0019] 所述步驟3具體過程如下:
[0020] 步驟31 :設(shè)置共享資源列表,將該表初始化為空,所述的共享資源列表包含五個 屬性,分別是共享資源所在的函數(shù)名、該共享資源所在該函數(shù)中的行號、共享資源在該函數(shù) 中的別名、該共享資源的全局的實質(zhì)名稱、該共享資源的讀寫訪問類型;
[0021] 步驟32 :打開中斷驅(qū)動程序源文件,逐行讀取源文件數(shù)據(jù),每當(dāng)讀入源文件的一 行數(shù)據(jù)時,通過語法分析該行數(shù)據(jù)中所包含的語句是否屬于共享資源聲明語句;所述的共 享資源包括:可全局被訪問的共享變量、可共享訪問的端口號、寄存器地址、可全局被訪問 的文件句柄,以及上述所有的共享資源的有效的指針形式傳播;如果該語句是共享資源聲 明語句,則將該語句中包含的共享資源的具體信息作為共享資源列表的一行,添入到共享 資源列表中;共享資源的具體信息包括共享資源所在的函數(shù)名、該共享資源所在該函數(shù)中 的行號、共享資源在該函數(shù)中的別名、該共享資源的全局的實質(zhì)名稱、該共享資源的讀寫訪 問類型。
[0022] 所述步驟4具體過程如下:
[0023] 步驟41 :讀取用戶指定測試的配置文件,讀入本次測試的函數(shù)主入口信息、各個 中斷處理程序的中斷向量號、中斷優(yōu)先級,
[0024] 步驟42 :設(shè)置中斷操作列表,將該表初始化為空;所述的中斷操作列表包含四個 屬性,分別是中斷操作所在的函數(shù)名、該中斷操作所在該函數(shù)中的行號、該中斷的向量號、 該中斷操作的操作類型;
[0025] 步驟43 :打開中斷驅(qū)動程序源文件,逐行讀取源文件數(shù)據(jù),每當(dāng)讀入源文件的一 行數(shù)據(jù)時,通過語法分析判斷該行數(shù)據(jù)中包含的語句是否是中斷控制語句,如果是,將該中 斷操作添入到中斷操作列表中。
[0026] 所述步驟5具體過程如下:
[0027] 步驟51 :使用編譯器LLVM對源程序進行分析,得到每個函數(shù)和中斷處理程序的控 制流圖CFG ;
[0028] 步驟52 :讀取所有CFG,對每個CFG,依次讀取其包含的每個結(jié)點;
[0029] 步驟53 :對于CFG中的每個結(jié)點,根據(jù)前述得到的共享資源列表和中斷操作列表, 判斷該結(jié)點是否包含有會影響共享資源的操作,即是否屬于共享資源操作、中斷開關(guān)操作、 條件分支判斷操作;如果是,則將當(dāng)前結(jié)點從當(dāng)前CFG中刪除,如果否,則什么都不做,判斷 完當(dāng)前結(jié)點后,繼續(xù)往下判斷下一個結(jié)點;
[0030] 步驟54 :每遍歷完成一個CFG,則得到了該CFG對應(yīng)的RCFG。
[0031] 所述步驟6的具體過程如下:
[0032] 步驟61 :設(shè)置一個變量INTB,將INTB初始化為0,所述INTB是用來記錄當(dāng)前中斷 的開關(guān)情況,
[0033] 步驟62 :讀取所有RCFG,對每個RCFG,進行深度優(yōu)先遍歷,
[0034] 所述深度優(yōu)先遍歷,是圖的最普遍的搜索算法中的一種,它可以沿著樹的深度依 次遍歷樹的每個結(jié)點,盡可能深地探索到樹的各個分支,
[0035] 步驟63 :對于遍歷到的每個結(jié)點,如果其中的語句包含函數(shù)調(diào)用操作,轉(zhuǎn)到步驟 64 ;如果其中的語句包含對共享變量的操作,轉(zhuǎn)到步驟65 ;如果其中的語句包含中斷開關(guān) 操作,轉(zhuǎn)到步驟66,否則,則什么都不做,回到步驟63繼續(xù)往下遍歷,
[0036] 步驟64 :將進行函數(shù)調(diào)用的結(jié)點的指針指向當(dāng)前被調(diào)用函數(shù)的RCFG的入口結(jié)點, 回到步驟63繼續(xù)往下遍歷,
[0037] 步驟65 :根據(jù)共享資源列表,找到可能會對當(dāng)前語句所包含的共享資源進行操作 的中斷,考察INTB中該中斷狀態(tài)是否為開,如果是,則將該中斷處理程序的入口結(jié)點指向 本結(jié)點,回到步驟63繼續(xù)往下遍歷,
[0038] 步驟66 :根據(jù)該中斷開關(guān)操作的情況,更新INTB,回到步驟63繼續(xù)往下遍歷。
[0039] 所述步驟7的具體過程如下:
[0040] 步驟71 :從IICFG的主函數(shù)入口結(jié)點開始,對IICFG進行深度優(yōu)先遍歷,
[0041] 步驟72 :生成執(zhí)行序列記錄表RQ,將RQ初始化為空,生成靜態(tài)預(yù)測結(jié)果PR,將PR 初始化為空,RQ用來記錄深度優(yōu)先遍歷過程中的執(zhí)行序列,PR用來記錄遍歷過程中發(fā)現(xiàn)的 競爭關(guān)系,
[0042] 步驟73 :在深度優(yōu)先遍歷過程中,每往下遍歷一個結(jié)點,則將當(dāng)前結(jié)點壓入RQ ;每 往后回退一個結(jié)點,將當(dāng)前結(jié)點退出RQ,
[0043] 步驟74:對每個結(jié)點,考察它是否包含共享資源操作語句,如果是,轉(zhuǎn)到步驟75, 如果否,則回到步驟74繼續(xù)往下遍歷,
[0044] 步驟75 :考察所有指向當(dāng)前結(jié)點的函數(shù)中,其優(yōu)先級是否比當(dāng)前結(jié)點所屬的函數(shù) 的優(yōu)先級高;如果是,轉(zhuǎn)到76,如果否,則回到步驟74繼續(xù)往下遍歷,
[0045] 步驟76 :將當(dāng)前操作的共享資源信息和RQ中的執(zhí)行序列聯(lián)接,構(gòu)成一條競爭關(guān)系 的預(yù)測結(jié)果,添加到PR中,回到步驟74繼續(xù)往下遍歷。
[0046] 所述步驟8的具體過程如下:
[0047] 步驟81 :打開中斷驅(qū)動程序源文件,根據(jù)已有的共享資源列表,對源文件插樁,將 源文件中的每個共享資源訪問位置設(shè)置成西米克斯的讀寫斷點,并將每個讀寫斷點都綁定 到西米克斯的訪問控制回調(diào)函數(shù)中,
[0048] 步驟82 :將靜態(tài)的預(yù)測分析結(jié)果轉(zhuǎn)換成西米克斯的訪問控制回調(diào)函數(shù)的執(zhí)行控 制腳本,
[0049] 步驟83 :在西米克斯中輸入所有的測試用例,在自然執(zhí)行狀態(tài)下依次執(zhí)行每個測 試用例,運行插樁后的中斷驅(qū)動程序源文件,當(dāng)預(yù)測的執(zhí)行序列發(fā)生時,西米克斯的控制腳 本自動觸發(fā)對應(yīng)的中斷向量號,如果該中斷能夠真實觸發(fā),則將該執(zhí)行序列、測試用例、真 實發(fā)生與否的信息,作為一行數(shù)據(jù),打印到驗證結(jié)果文件中,
[0050] 步驟84:西米克斯中輸入所有的測試用例,在自然執(zhí)行狀態(tài)下依次執(zhí)行每個測試 用例,運行插樁后的中斷驅(qū)動程序源文件,當(dāng)預(yù)測的執(zhí)行序列即將發(fā)生偏離時,通過西米克 斯的插值方式強制將偏離的分支更正成與預(yù)測的執(zhí)行序列相吻合的方向,如果在需要觸發(fā) 中斷時能夠真實觸發(fā)對應(yīng)的中斷,則將該執(zhí)行序列、測試用例、真實發(fā)生與否的信息,作為 一行數(shù)據(jù),打印到驗證結(jié)果文件中。
[0051] 所述步驟9具體過程如下:
[0052] 步驟91 :讀取驗證結(jié)果文件,合并執(zhí)行序列相同的驗證結(jié)果,每個驗證結(jié)果增加 "發(fā)生次數(shù)"這一列,以統(tǒng)計相同的執(zhí)行序列發(fā)生的次數(shù),
[0053] 步驟92 :針對每個驗證結(jié)果的真實發(fā)生與否這一屬性,按照有真實發(fā)生在前,非 真實發(fā)生在后的順序,進行一次排序,
[0054] 步驟93 :針對每個驗證結(jié)果的的發(fā)生次數(shù)這一屬性,按照發(fā)生次數(shù)由大到小的順 序,對前述排序進行微調(diào),
[0055] 步驟94:將最終的排序結(jié)果輸入到測試結(jié)果文件中,從而得到了對受測試的中斷 驅(qū)動程序源文件的競爭檢測結(jié)果。
[0056] 有益效果:本發(fā)明給出一種動靜態(tài)結(jié)合的中斷驅(qū)動程序競爭檢測方法,通過靜態(tài) 的共享資源檢測技術(shù),控制流圖生成技術(shù),數(shù)據(jù)流分析技術(shù),以及動態(tài)的模擬器控制中斷調(diào) 度技術(shù),能夠得到程序中真實的競爭關(guān)系,具有如下的有益效果:
[0057] (1)本發(fā)明所述的方法能夠有效地檢測出中斷驅(qū)動程序中存在的競爭關(guān)系,發(fā)現(xiàn) 潛在的競爭錯誤,具有高效的特點;
[0058] (2)本發(fā)明能夠?qū)撛诘母偁庩P(guān)系進行驗證,在避免誤報的同時,提高了檢測結(jié) 果的準確率,并對驗證后的競爭關(guān)系進行了嚴重性排序,有效地提高了人工審核的時間效 率;
[0059] (3)本發(fā)明自動化程度高,在整個測試過程中需要人工的參與很少;
[0060] (4)本發(fā)明能夠應(yīng)用于幾乎任何系統(tǒng)和平臺,具有較強的實用性。
【專利附圖】
【附圖說明】
[0061] 圖1為本發(fā)明的總體系統(tǒng)及流程框圖。
[0062] 圖2為動態(tài)驗證過程的流程圖。
【具體實施方式】
[0063] 下面通過附圖對本發(fā)明的技術(shù)方案做進一步的詳細描述。
[0064] 參照圖1,本發(fā)明由三個大的功能部件構(gòu)成,其中每個功能部件又可細分為若干個 小的功能組件,共計七個功能組件,分別是:共享資源檢測器,中斷操作檢測器,RCFG生成 器,IICFG生成器,潛在競爭關(guān)系預(yù)測器,動態(tài)驗證執(zhí)行器,競爭關(guān)系排序器。其中,共享資源 檢測器將源代碼中的共享資源檢測出來,中斷操作檢測器將源代碼中的所有中斷相關(guān)操作 檢測出來,RCFG生成器在共享資源檢測器和中斷操作檢測器的基礎(chǔ)上構(gòu)建出只跟共享資源 相關(guān)的控制流圖,而IICFG生成器則在RCFG生成器的基礎(chǔ)上構(gòu)建出中斷互聯(lián)的控制流圖, 潛在競爭關(guān)系預(yù)測器將IICFG作為輸入,預(yù)測出潛在的競爭關(guān)系,動態(tài)驗證執(zhí)行器會把潛 在競爭關(guān)系預(yù)測器的預(yù)測結(jié)果執(zhí)行動態(tài)的執(zhí)行驗證,其結(jié)果作為競爭關(guān)系排序器的輸入, 進行排序后得到最終的檢測結(jié)果。
[0065] 在具體的實施過程中,各功能組件的工作過程以及輸入輸出如下:
[0066] (1)共享資源檢測器
[0067] 參照圖1,共享資源檢測器將檢測出源代碼中涉及到的所有的共享資源。它將源 程序作為輸入,將共享資源列表作為輸出,其具體過程是:首先,初始化共享資源列表為空; 接著,打開中斷驅(qū)動程序源文件,逐行讀取源文件數(shù)據(jù);每當(dāng)讀入源文件的一行數(shù)據(jù)時,通 過語法分析該語句是否是一個共享資源聲明語句,如果是,將該共享資源的信息添入到共 享資源列表中;所有的共享資源包括如下幾種類別:可全局被訪問的共享變量、可共享訪 問的端口號、寄存器地址、可全局被訪問的文件句柄,以及上述所有的共享資源的有效的 指針形式傳播;當(dāng)源程序掃描完畢時,將共享資源列表保存入共享資源記錄文件中,后綴名 為· SR。
[0068] 如下為對一個源程序進行共享資源檢測的實例結(jié)果,通過如下的元組表示:
[0069] SV1 :<task2, 14, bufferAddr, bufferAddr, R>
[0070] SV2 :<task2, 14, RBR, bufferAddr, W>
[0071] SV3 :<task2, 15, bufferAddr, bufferAddr, R>
[0072] SV4 :<task2, 15, LSR, bufferAddr, R>
[0073] SV5 :<task2, 20, LSR, bufferAddr, W>
[0074] SV6 :<task2, 21, packetsNumber, packetsNumber, R>
[0075] SV7 :<task2, 21, packetsNumber, packetsNumber, W>
[0076] SV8 :<taskl, 30, bufferAddr, bufferAddr, W>
[0077] SV9 :<irq_handlerl, 5, bufferAddr, bufferAddr, W>
[0078] SV10 :<irq_handlerl, 7, bufferAddr, bufferAddr, R>
[0079] SV11 :<irq_handlerl, 9, packetsNumber, packetsNumber, R>
[0080] SV12 :<irq_handlerl, 9, packetsNumber, packetsNumber, W>
[0081] SV13 :<irq_handlerl, 10, bufferRemainCap, bufferRemainCap, R>
[0082] SV14 :<irq_handlerl, 12, bufferRemainCap, bufferRemainCap, R>
[0083] SV15 :<irq_handlerl, 12, bufferRemainCap, bufferRemainCap, ff>
[0084] SV16 :<irq_handler2, 27, bufferRemainCap, bufferRemainCap, ff>
[0085] (2)中斷操作檢測器
[0086] 參照圖1,中斷操作檢測器將源代碼中涉及到的所有的中斷操作檢測出來。它的輸 入是源程序,輸出是中斷操作記錄,其具體過程是:打開中斷驅(qū)動程序源文件,逐行讀取源 文件數(shù)據(jù);每當(dāng)讀入源文件的一行數(shù)據(jù)時,通過語法分析判斷該語句是否是中斷控制語句, 如果是,將該中斷操作添入到中斷操作記錄表中;將中斷操作記錄表保存如中斷記錄文件 中,后綴名為.ITR。
[0087] 如下為對一個源程序進行中斷操作檢測之后的實例結(jié)果,通過元組表示:
[0088] ITR1 :<task2, 13, 1, E>
[0089] ITR2 :<task2, 16, 1, D>
[0090] (3) RCFG 生成器
[0091] RCFG生成器在共享資源檢測器和中斷操作檢測器的基礎(chǔ)上構(gòu)建出只跟共享資 源相關(guān)的控制流圖,它的輸入是共享資源列表、中斷操作記錄,輸出是所有的函數(shù)對應(yīng)的 RCFG,其具體流程是:使用LLVM對源程序進行語法分析,得到每個函數(shù)和中斷處理程序的 CFG (Control Flow Graph);讀取LLVM生成的所有CFG,對每個CFG,根據(jù)其對應(yīng)的.SR文件 和.ITR文件,判斷該CFG是否含有會影響共享資源的操作;如果是,則遍歷該CFG,過濾出 跟影響共享資源有關(guān)的操作,得到該CFG對應(yīng)的RCFG(Reduced_Control Flow Graph);最 后,將所有生成的RCFG分別保存到函數(shù)RCFG文件中,后綴名.RCFG。
[0092] (4)IICFG 生成器
[0093] IICFG生成器在RCFG生成器的基礎(chǔ)上構(gòu)建出中斷互聯(lián)的控制流圖,它以所有函數(shù) 的RCFG為輸入,將一個中斷互聯(lián)的控制流圖IICFG作為輸出,其流程為:深入優(yōu)先遍歷所有 的RCFG,當(dāng)RCFG中的某個結(jié)點為函數(shù)調(diào)用操作時,將進行函數(shù)調(diào)用的結(jié)點的指針指向被調(diào) 用函數(shù)的RCFG的入口結(jié)點;當(dāng)RCFG中的某個結(jié)點為對共享變量的操作時,從共享變量記錄 表中找到對同一共享變量可能會進行操作的中斷處理程序,考察INTB中該中斷是否為開 狀態(tài),如果是,則將該中斷處理程序的入口結(jié)點指向本結(jié)點;當(dāng)RCFG中的某個結(jié)點為中斷 開關(guān)操作時,根據(jù)該中斷開關(guān)操作的情況,更新INTB ;最后,深入優(yōu)先遍歷完成后,將生成 的IICFG保存到記錄文件中,后綴名.IICFG。
[0094] (5)潛在競爭關(guān)系預(yù)測器
[0095] 潛在競爭關(guān)系預(yù)測器將IICFG作為輸入,預(yù)測出潛在的競爭關(guān)系。以下是其具體 流程:從IICFG的main函數(shù)入口開始對IICFG進行深入優(yōu)先遍歷,并首先初始化執(zhí)行序列 RQ為空,初始化靜態(tài)預(yù)測結(jié)果PR為空;每往下遍歷一步,將當(dāng)前結(jié)點壓入RQ ;每往后回退 一步,當(dāng)當(dāng)前結(jié)點退出RQ;當(dāng)某個結(jié)點是共享資源操作語句時,考察所有插入到該結(jié)點的 函數(shù)(包括中斷處理程序的函數(shù))中,優(yōu)先級是否比當(dāng)前函數(shù)的優(yōu)先級高;如果是,將當(dāng)前 操作的共享資源信息和RQ中的執(zhí)行序列合并,共同輸入PR中,得到一條預(yù)測結(jié)果;最后,將 PR中所有的預(yù)測結(jié)果及其執(zhí)行序列,保存到預(yù)測結(jié)果記錄文件中,后綴名.PR。
[0096] 如下為對一個源程序的IICFG經(jīng)過潛在競爭關(guān)系預(yù)測器分析后,得到的分析結(jié) 果:
[0097] PDR(SRA1, SRA12) = {taskl<30>} | {irq_handlerl<5>}
[0098] PDR(SRA2, SRA12) = {taskl<31>, task2<20>} | {irq_handlerl<5>}
[0099] PDR(SRA4, SRA7) = {taskl<31>, task2<21>} | {irq_handlerl<7 | T>, irq_ handlerl<9>}
[0100] PDR (SRA5, SRA7) = {taskl<31>, task2<21>} | {irq_handlerl<7 | T>, irq_ handlerl<9>}
[0101] PDR (SRA8, SRA11) = {irq_handlerl<7 | T>, irq_handlerl<10>} | {irq_ handlerl<5>}
[0102] PDR (SRA9, SRA11) = {irq_handler 1<7 | T>, irq_handler 1<10 | T>, irq_ handlerl〈12>}I{irq_handler2〈27>}
[0103] PDR (SRA10, SRA11) = {irq_handlerl<7 | T>, irq_handler 1<10 | T>, irq_ handlerl〈12>}I{irq_handler2〈27>}
[0104] (6)動態(tài)驗證執(zhí)行器
[0105] 動態(tài)驗證執(zhí)行器會把潛在競爭關(guān)系預(yù)測器的預(yù)測結(jié)果執(zhí)行動態(tài)的執(zhí)行驗證,它以 潛在競爭關(guān)系預(yù)測器的預(yù)測結(jié)果作為輸入,將動態(tài)驗證的結(jié)果作為輸出,以下是其具體流 程:打開PR文件,將所有的執(zhí)行序列轉(zhuǎn)換成Simics的執(zhí)行控制腳本;第一輪執(zhí)行,將系統(tǒng) 在測試用例下自然執(zhí)行,當(dāng)預(yù)測的執(zhí)行序列發(fā)生時,Simics的控制腳本自動觸發(fā)對應(yīng)的中 斷向量號,如果該中斷能夠真實觸發(fā),則將該中斷、測試用例、執(zhí)行序列的信息,輸入到驗 證結(jié)果文件.DV文件中;對于第一輪執(zhí)行中沒有能夠真實觸發(fā)的預(yù)測結(jié)果中的執(zhí)行序列, 進行第二輪執(zhí)行,將系統(tǒng)在測試用例下執(zhí)行,當(dāng)預(yù)測的執(zhí)行序列即將偏離時強制系統(tǒng)向預(yù) 測方向執(zhí)行,并在需要中斷時觸發(fā)對應(yīng)的中斷向量號,如果該中斷能夠真實觸發(fā),則將該 中斷、測試用例、執(zhí)行序列的信息,輸入到驗證結(jié)果文件.DV文件中;對驗證后的潛在競爭 進行歸納整合,統(tǒng)計每個潛在競爭發(fā)生的次數(shù),標記潛在競爭的真實發(fā)生與否,重新輸入 至丨J .DV文件中。
[0106] 圖2為動態(tài)驗證執(zhí)行器的驗證流程圖。
[0107] (7)競爭關(guān)系排序器
[0108] 競爭關(guān)系排序器將經(jīng)過動態(tài)驗證執(zhí)行器驗證過的潛在競爭關(guān)系,進行排序后,得 到最終的檢測結(jié)果。以下是其具體流程:打開.DV文件,對于每個驗證后的潛在競爭,根據(jù) 該競爭真實發(fā)生與否,進行第一次排序;對于每個驗證后的潛在競爭,根據(jù)該競爭的發(fā)生次 數(shù),由大到小進行第二次排序;將排序結(jié)果輸入到結(jié)果文件中,后綴名.RESULT,得到對該 源程序的競爭檢測結(jié)果。
[0109] 經(jīng)過對是否能夠真實發(fā)生、發(fā)生次數(shù)兩個維度的考量后,排過序的競爭關(guān)系如下 所示:
[0110] <PDR(SRA1, SRA12), E, 8, <tcl, tc2, tc3, tc5, tc6, tc7, tc8, tc9>>
[0111] <PDR (SRA2, SRA12), NE, 3, _ >
[0112] <PDR(SRA4, SRA7), E, 4, <tcl, tc5, tc6, tc8?
[0113] <PDR(SRA5, SRA7), E, 4, <tcl, tc5, tc6, tc8?
[0114] <PDR (SRA8, SRA11), N, 0, _ >
[0115] <PDR(SRA9, SRA11), E, 3, <tc5, tc8, tc9?
[0116] <PDR(SRA10, SRA11), E, 3, <tc5, tc8, tc9?
[0117] 本發(fā)明所述的動靜態(tài)結(jié)合的中斷驅(qū)動程序數(shù)據(jù)競爭檢測方法包括以下步驟:
[0118] 步驟1 :用戶指定受測試的中斷驅(qū)動程序源文件。所述的中斷驅(qū)動程序源文件一 般包含若干個函數(shù)構(gòu)成的主任務(wù)的源代碼,以及該任務(wù)涉及到的中斷所對應(yīng)的中斷處理程 序的源代碼。
[0119] 步驟2 :用戶指定測試的配置文件。所述配置文件一般是XML文件,XML的全稱是 可擴展標記語言,可以用來標記數(shù)據(jù)、定義數(shù)據(jù)類型,是一種允許用戶對自己的標記語言進 行定義的源語言。所述的測試配置文件應(yīng)該包括主函數(shù)的入口說明,各個中斷處理程序的 中斷向量號、中斷優(yōu)先級。
[0120] 步驟3 :對受測試的中斷驅(qū)動程序源文件進行共享資源檢測,得到共享資源列表。 步驟3具體過程如下:
[0121] 步驟31 :設(shè)置共享資源列表,將該表初始化為空,所述的共享資源列表包含五個 屬性,分別是共享資源所在的函數(shù)名,該共享資源所在該函數(shù)中的行號,共享資源在該函數(shù) 中的別名,該共享資源的全局的實質(zhì)名稱,該共享資源的讀寫訪問類型。
[0122] 步驟32 :打開中斷驅(qū)動程序源文件,逐行讀取源文件數(shù)據(jù),每當(dāng)讀入源文件的一 行數(shù)據(jù)時,通過語法分析該行數(shù)據(jù)中所包含的語句是否屬于共享資源聲明語句。所述的共 享資源包括:可全局被訪問的共享變量、可共享訪問的端口號、寄存器地址、可全局被訪問 的文件句柄,以及上述所有的共享資源的有效的指針形式傳播。
[0123] 如果該語句是共享資源聲明語句,則將該語句中包含的共享資源的具體信息,包 括共享資源所在的函數(shù)名,該共享資源所在該函數(shù)中的行號,共享資源在該函數(shù)中的別名, 該共享資源的全局的實質(zhì)名稱,該共享資源的讀寫訪問類型,作為共享資源列表的一行,添 入到共享資源列表中。
[0124] 步驟4:對受測試的中斷驅(qū)動程序源文件進行中斷操作行為檢測,得到中斷操作 列表。步驟4具體過程如下:
[0125] 步驟41 :讀取用戶指定測試的配置文件,讀入本次測試的函數(shù)主入口信息、各個 中斷處理程序的中斷向量號、中斷優(yōu)先級。
[0126] 步驟42 :設(shè)置中斷操作列表,將該表初始化為空;所述的中斷操作列表包含四個 屬性,分別是中斷操作所在的函數(shù)名,該中斷操作所在該函數(shù)中的行號,該中斷的向量號, 該中斷操作的操作類型(開中斷或關(guān)中斷)。
[0127] 步驟43 :打開中斷驅(qū)動程序源文件,逐行讀取源文件數(shù)據(jù),每當(dāng)讀入源文件的一 行數(shù)據(jù)時,通過語法分析判斷該行數(shù)據(jù)中包含的語句是否是中斷控制語句,如果是,將該中 斷操作添入到中斷操作列表中。
[0128] 步驟5 :對中斷驅(qū)動程序源文件進行分析,得到簡要控制流圖(RCFG)。步驟5具體 過程如下:
[0129] 步驟51 :使用LLVM對源程序進行分析,得到每個函數(shù)和中斷處理程序的控制流圖 (CFG)。
[0130] 所述的LLVM是Low Level Virtual Machine的簡稱,是一個業(yè)界最知名的編譯器 之一,它提供了很多與編譯器相關(guān)的庫支持,能夠進行程序語言的編譯期優(yōu)化、鏈接優(yōu)化、 在線編譯優(yōu)化、代碼生成。我們這里使用它來得到中斷驅(qū)動程序源文件的CFG。
[0131] 步驟52 :讀取所有CFG,對每個CFG,依次讀取其包含的每個結(jié)點;
[0132] 步驟53 :對于CFG中的每個結(jié)點,根據(jù)前述得到的共享資源列表和中斷操作列表, 判斷該結(jié)點是否包含有會影響共享資源的操作,即是否屬于共享資源操作、中斷開關(guān)操作、 條件分支判斷操作;如果是,則將當(dāng)前結(jié)點從當(dāng)前CFG中刪除,如果否,則什么都不做,判斷 完當(dāng)前結(jié)點后,繼續(xù)往下判斷下一個結(jié)點;
[0133] 步驟54 :每遍歷完成一個CFG,則得到了該CFG對應(yīng)的RCFG。
[0134] 步驟6 :將所有的RCFG互聯(lián)起來,得到全局的中斷互聯(lián)控制流圖IICFG。步驟6的 具體過程如下:
[0135] 步驟61 :設(shè)置一個變量INTB,將INTB初始化為0,所述INTB是用來記錄當(dāng)前中斷 的開關(guān)情況。
[0136] 步驟62 :讀取所有RCFG,對每個RCFG,進行深度優(yōu)先遍歷。
[0137] 所述深度優(yōu)先遍歷,是圖的最普遍的搜索算法中的一種,它可以沿著樹的深度依 次遍歷樹的每個結(jié)點,盡可能深地探索到樹的各個分支。
[0138] 步驟63 :對于遍歷到的每個結(jié)點,如果其中的語句包含函數(shù)調(diào)用操作,轉(zhuǎn)到步驟 64 ;如果其中的語句包含對共享變量的操作,轉(zhuǎn)到步驟65 ;如果其中的語句包含中斷開關(guān) 操作,轉(zhuǎn)到步驟66,否則,則什么都不做,回到步驟63繼續(xù)往下遍歷。
[0139] 步驟64:將進行函數(shù)調(diào)用的結(jié)點的指針指向當(dāng)前被調(diào)用函數(shù)的RCFG的入口結(jié)點, 回到步驟63繼續(xù)往下遍歷。
[0140] 步驟65 :根據(jù)共享資源列表,找到可能會對當(dāng)前語句所包含的共享資源進行操作 的中斷,考察INTB中該中斷狀態(tài)是否為開,如果是,則將該中斷處理程序的入口結(jié)點指向 本結(jié)點。回到步驟63繼續(xù)往下遍歷
[0141] 步驟66 :根據(jù)該中斷開關(guān)操作的情況,更新INTB。回到步驟63繼續(xù)往下遍歷。
[0142] 步驟7 :對IICFG進行深度優(yōu)先遍歷,得到中斷驅(qū)動源程序的靜態(tài)分析結(jié)果。步驟 7的具體過程如下:
[0143] 步驟71 :從IICFG的主函數(shù)入口結(jié)點開始,對IICFG進行深度優(yōu)先遍歷。
[0144] 步驟72 :生成執(zhí)行序列記錄表RQ,將RQ初始化為空。生成靜態(tài)預(yù)測結(jié)果PR,將PR 初始化為空。RQ用來記錄深度優(yōu)先遍歷過程中的執(zhí)行序列,PR用來記錄遍歷過程中發(fā)現(xiàn)的 競爭關(guān)系。
[0145] 步驟73 :在深度優(yōu)先遍歷過程中,每往下遍歷一個結(jié)點,則將當(dāng)前結(jié)點壓入RQ ;每 往后回退一個結(jié)點,將當(dāng)前結(jié)點退出RQ。
[0146] 步驟74:對每個結(jié)點,考察它是否包含共享資源操作語句,如果是,轉(zhuǎn)到步驟75, 如果否,則回到步驟74繼續(xù)往下遍歷。
[0147] 步驟75 :考察所有指向當(dāng)前結(jié)點的函數(shù)中,其優(yōu)先級是否比當(dāng)前結(jié)點所屬的函數(shù) 的優(yōu)先級高;如果是,轉(zhuǎn)到76,如果否,則回到步驟74繼續(xù)往下遍歷。
[0148] 步驟76 :將當(dāng)前操作的共享資源信息和RQ中的執(zhí)行序列聯(lián)接,構(gòu)成一條競爭關(guān)系 的預(yù)測結(jié)果,添加到PR中?;氐讲襟E74繼續(xù)往下遍歷。
[0149] 步驟8 :在西米克斯(Simics)仿真平臺中執(zhí)行中斷驅(qū)動程序源文件,驗證PR中的 所有靜態(tài)分析結(jié)果。
[0150] 所述的西米克斯仿真平臺是英特爾公司開發(fā)的一款全系統(tǒng)的模擬器,它可以為軟 件和系統(tǒng)開發(fā)人員、架構(gòu)師、測試工程師提供為各種目的構(gòu)建和使用虛擬系統(tǒng)或創(chuàng)建多個 虛擬連接系統(tǒng)的方法,因其功能強大且學(xué)術(shù)版本免費向高校開放,是業(yè)界內(nèi)最聞名的系統(tǒng) 仿真模擬器之一。
[0151] 步驟8的具體過程如下:
[0152] 步驟81 :打開中斷驅(qū)動程序源文件,根據(jù)已有的共享資源列表,對源文件插樁,將 源文件中的每個共享資源訪問位置設(shè)置成西米克斯的讀寫斷點,并將每個讀寫斷點都綁定 到西米克斯的訪問控制回調(diào)函數(shù)中。
[0153] 步驟82 :將靜態(tài)的預(yù)測分析結(jié)果轉(zhuǎn)換成西米克斯的訪問控制回調(diào)函數(shù)的執(zhí)行控 制腳本。
[0154] 步驟83 :在西米克斯中輸入所有的測試用例,在自然執(zhí)行狀態(tài)下依次執(zhí)行每個測 試用例。運行插樁后的中斷驅(qū)動程序源文件,當(dāng)預(yù)測的執(zhí)行序列發(fā)生時,西米克斯的控制腳 本自動觸發(fā)對應(yīng)的中斷向量號,如果該中斷能夠真實觸發(fā),則將該執(zhí)行序列、測試用例、真 實發(fā)生與否的信息,作為一行數(shù)據(jù),打印到驗證結(jié)果文件中。
[0155] 步驟84:西米克斯中輸入所有的測試用例,在自然執(zhí)行狀態(tài)下依次執(zhí)行每個測試 用例。運行插樁后的中斷驅(qū)動程序源文件,當(dāng)預(yù)測的執(zhí)行序列即將發(fā)生偏離時,通過西米克 斯的插值方式強制將偏離的分支更正成與預(yù)測的執(zhí)行序列相吻合的方向,如果在需要觸發(fā) 中斷時能夠真實觸發(fā)對應(yīng)的中斷,則將該執(zhí)行序列、測試用例、真實發(fā)生與否的信息,作為 一行數(shù)據(jù),打印到驗證結(jié)果文件中。
[0156] 步驟9 :對驗證后的驗證結(jié)果進行嚴重性排序。具體過程如下:
[0157] 步驟91 :讀取驗證結(jié)果文件,合并執(zhí)行序列相同的驗證結(jié)果,每個驗證結(jié)果增加 "發(fā)生次數(shù)"這一列,以統(tǒng)計相同的執(zhí)行序列發(fā)生的次數(shù)。
[0158] 步驟92 :針對每個驗證結(jié)果的真實發(fā)生與否這一屬性,按照有真實發(fā)生在前,非 真實發(fā)生在后的順序,進行一次排序。
[0159] 步驟93 :針對每個驗證結(jié)果的的發(fā)生次數(shù)這一屬性,按照發(fā)生次數(shù)由大到小的順 序,對前述排序進行微調(diào)。
[0160] 步驟94:將最終的排序結(jié)果輸入到測試結(jié)果文件中,從而得到了對受測試的中斷 驅(qū)動程序源文件的競爭檢測結(jié)果。
[0161] 最后應(yīng)當(dāng)說明的是:以上步驟僅用于說明本發(fā)明的技術(shù)方案而非對其限制。盡管 上述步驟對本發(fā)明進行了詳細的說明,相關(guān)領(lǐng)域的技術(shù)人員應(yīng)當(dāng)理解,依然可以對本發(fā)明 的具體技術(shù)進行修改或者對部分技術(shù)進行等同替換;而不脫離本發(fā)明技術(shù)方案的精神,其 均應(yīng)涵蓋在本發(fā)明請求保護的技術(shù)方案范圍當(dāng)中。
【權(quán)利要求】
1. 一種動靜態(tài)結(jié)合的中斷驅(qū)動程序數(shù)據(jù)競爭檢測方法,其特征在于該方法包含的步驟 為: 步驟1 :用戶指定受測試的中斷驅(qū)動程序源文件,所述的中斷驅(qū)動程序源文件包含若 干個函數(shù)構(gòu)成的主任務(wù)的源代碼,以及該任務(wù)涉及到的中斷所對應(yīng)的中斷處理程序的源代 碼; 步驟2 :用戶指定測試的配置文件,所述配置文件是XML文件,XML的全稱是可擴展標記 語言,可以用來標記數(shù)據(jù)、定義數(shù)據(jù)類型,是一種允許用戶對自己的標記語言進行定義的源 語言;所述的測試配置文件包括主函數(shù)的入口說明、各個中斷處理程序的中斷向量號和中 斷優(yōu)先級; 步驟3 :對受測試的中斷驅(qū)動程序源文件進行共享資源檢測,得到共享資源列表; 步驟4 :對受測試的中斷驅(qū)動程序源文件進行中斷操作行為檢測,得到中斷操作列表; 步驟5 :對中斷驅(qū)動程序源文件進行分析,得到簡要控制流圖RCFG, 步驟6 :將所有的RCFG互聯(lián)起來,得到全局的中斷互聯(lián)控制流圖IICFG ; 步驟7 :對IICFG進行深度優(yōu)先遍歷,得到中斷驅(qū)動源程序的靜態(tài)分析結(jié)果; 步驟8 :在西米克斯Simics仿真平臺中執(zhí)行中斷驅(qū)動程序源文件,驗證PR中的所有靜 態(tài)分析結(jié)果, 步驟9 :對驗證后的驗證結(jié)果進行嚴重性排序,從而得到了對受測試的中斷驅(qū)動程序 源文件的競爭檢測結(jié)果。
2. 如權(quán)利要求1所述的動靜態(tài)結(jié)合的中斷驅(qū)動程序數(shù)據(jù)競爭檢測方法,其特征在于所 述步驟3具體過程如下: 步驟31 :設(shè)置共享資源列表,將該表初始化為空,所述的共享資源列表包含五個屬性, 分別是共享資源所在的函數(shù)名、該共享資源所在該函數(shù)中的行號、共享資源在該函數(shù)中的 別名、該共享資源的全局的實質(zhì)名稱、該共享資源的讀寫訪問類型; 步驟32 :打開中斷驅(qū)動程序源文件,逐行讀取源文件數(shù)據(jù),每當(dāng)讀入源文件的一行數(shù) 據(jù)時,通過語法分析該行數(shù)據(jù)中所包含的語句是否屬于共享資源聲明語句;所述的共享資 源包括:可全局被訪問的共享變量、可共享訪問的端口號、寄存器地址、可全局被訪問的文 件句柄,以及上述所有的共享資源的有效的指針形式傳播;如果該語句是共享資源聲明語 句,則將該語句中包含的共享資源的具體信息作為共享資源列表的一行,添入到共享資源 列表中;共享資源的具體信息包括共享資源所在的函數(shù)名、該共享資源所在該函數(shù)中的行 號、共享資源在該函數(shù)中的別名、該共享資源的全局的實質(zhì)名稱、該共享資源的讀寫訪問類 型。
3. 如權(quán)利要求1所述的動靜態(tài)結(jié)合的中斷驅(qū)動程序數(shù)據(jù)競爭檢測方法,其特征在于所 述步驟4具體過程如下: 步驟41 :讀取用戶指定測試的配置文件,讀入本次測試的函數(shù)主入口信息、各個中斷 處理程序的中斷向量號、中斷優(yōu)先級, 步驟42 :設(shè)置中斷操作列表,將該表初始化為空;所述的中斷操作列表包含四個屬性, 分別是中斷操作所在的函數(shù)名、該中斷操作所在該函數(shù)中的行號、該中斷的向量號、該中斷 操作的操作類型; 步驟43 :打開中斷驅(qū)動程序源文件,逐行讀取源文件數(shù)據(jù),每當(dāng)讀入源文件的一行數(shù) 據(jù)時,通過語法分析判斷該行數(shù)據(jù)中包含的語句是否是中斷控制語句,如果是,將該中斷操 作添入到中斷操作列表中。
4. 如權(quán)利要求1所述的動靜態(tài)結(jié)合的中斷驅(qū)動程序數(shù)據(jù)競爭檢測方法,其特征在于所 述步驟5具體過程如下: 步驟51 :使用編譯器LLVM對源程序進行分析,得到每個函數(shù)和中斷處理程序的控制流 圖 CFG ; 步驟52 :讀取所有CFG,對每個CFG,依次讀取其包含的每個結(jié)點; 步驟53:對于CFG中的每個結(jié)點,根據(jù)前述得到的共享資源列表和中斷操作列表,判斷 該結(jié)點是否包含有會影響共享資源的操作,即是否屬于共享資源操作、中斷開關(guān)操作、條件 分支判斷操作;如果是,則將當(dāng)前結(jié)點從當(dāng)前CFG中刪除,如果否,則什么都不做,判斷完當(dāng) 前結(jié)點后,繼續(xù)往下判斷下一個結(jié)點; 步驟54 :每遍歷完成一個CFG,則得到了該CFG對應(yīng)的RCFG。
5. 如權(quán)利要求1所述的動靜態(tài)結(jié)合的中斷驅(qū)動程序數(shù)據(jù)競爭檢測方法,其特征在于所 述步驟6的具體過程如下: 步驟61 :設(shè)置一個變量INTB,將INTB初始化為0,所述INTB是用來記錄當(dāng)前中斷的開 關(guān)情況, 步驟62 :讀取所有RCFG,對每個RCFG,進行深度優(yōu)先遍歷, 所述深度優(yōu)先遍歷,是圖的最普遍的搜索算法中的一種,它可以沿著樹的深度依次遍 歷樹的每個結(jié)點,盡可能深地探索到樹的各個分支, 步驟63 :對于遍歷到的每個結(jié)點,如果其中的語句包含函數(shù)調(diào)用操作,轉(zhuǎn)到步驟64 ;如 果其中的語句包含對共享變量的操作,轉(zhuǎn)到步驟65;如果其中的語句包含中斷開關(guān)操作, 轉(zhuǎn)到步驟66,否則,則什么都不做,回到步驟63繼續(xù)往下遍歷, 步驟64 :將進行函數(shù)調(diào)用的結(jié)點的指針指向當(dāng)前被調(diào)用函數(shù)的RCFG的入口結(jié)點,回到 步驟63繼續(xù)往下遍歷, 步驟65 :根據(jù)共享資源列表,找到可能會對當(dāng)前語句所包含的共享資源進行操作的中 斷,考察INTB中該中斷狀態(tài)是否為開,如果是,則將該中斷處理程序的入口結(jié)點指向本結(jié) 點,回到步驟63繼續(xù)往下遍歷, 步驟66 :根據(jù)該中斷開關(guān)操作的情況,更新INTB,回到步驟63繼續(xù)往下遍歷。
6. 如權(quán)利要求1所述的動靜態(tài)結(jié)合的中斷驅(qū)動程序數(shù)據(jù)競爭檢測方法,其特征在于所 述步驟7的具體過程如下: 步驟71 :從IICFG的主函數(shù)入口結(jié)點開始,對IICFG進行深度優(yōu)先遍歷, 步驟72 :生成執(zhí)行序列記錄表RQ,將RQ初始化為空,生成靜態(tài)預(yù)測結(jié)果PR,將PR初始 化為空,RQ用來記錄深度優(yōu)先遍歷過程中的執(zhí)行序列,PR用來記錄遍歷過程中發(fā)現(xiàn)的競爭 關(guān)系, 步驟73 :在深度優(yōu)先遍歷過程中,每往下遍歷一個結(jié)點,則將當(dāng)前結(jié)點壓入RQ ;每往后 回退一個結(jié)點,將當(dāng)前結(jié)點退出RQ, 步驟74 :對每個結(jié)點,考察它是否包含共享資源操作語句,如果是,轉(zhuǎn)到步驟75,如果 否,則回到步驟74繼續(xù)往下遍歷, 步驟75 :考察所有指向當(dāng)前結(jié)點的函數(shù)中,其優(yōu)先級是否比當(dāng)前結(jié)點所屬的函數(shù)的優(yōu) 先級高;如果是,轉(zhuǎn)到76,如果否,則回到步驟74繼續(xù)往下遍歷, 步驟76 :將當(dāng)前操作的共享資源信息和RQ中的執(zhí)行序列聯(lián)接,構(gòu)成一條競爭關(guān)系的預(yù) 測結(jié)果,添加到PR中,回到步驟74繼續(xù)往下遍歷。
7. 如權(quán)利要求1所述的動靜態(tài)結(jié)合的中斷驅(qū)動程序數(shù)據(jù)競爭檢測方法,其特征在于所 述步驟8的具體過程如下: 步驟81 :打開中斷驅(qū)動程序源文件,根據(jù)已有的共享資源列表,對源文件插樁,將源文 件中的每個共享資源訪問位置設(shè)置成西米克斯的讀寫斷點,并將每個讀寫斷點都綁定到 西米克斯的訪問控制回調(diào)函數(shù)中, 步驟82 :將靜態(tài)的預(yù)測分析結(jié)果轉(zhuǎn)換成西米克斯的訪問控制回調(diào)函數(shù)的執(zhí)行控制腳 本, 步驟83:在西米克斯中輸入所有的測試用例,在自然執(zhí)行狀態(tài)下依次執(zhí)行每個測試用 例,運行插樁后的中斷驅(qū)動程序源文件,當(dāng)預(yù)測的執(zhí)行序列發(fā)生時,西米克斯的控制腳本自 動觸發(fā)對應(yīng)的中斷向量號,如果該中斷能夠真實觸發(fā),則將該執(zhí)行序列、測試用例、真實發(fā) 生與否的信息,作為一行數(shù)據(jù),打印到驗證結(jié)果文件中, 步驟84:西米克斯中輸入所有的測試用例,在自然執(zhí)行狀態(tài)下依次執(zhí)行每個測試用 例,運行插樁后的中斷驅(qū)動程序源文件,當(dāng)預(yù)測的執(zhí)行序列即將發(fā)生偏離時,通過西米克斯 的插值方式強制將偏離的分支更正成與預(yù)測的執(zhí)行序列相吻合的方向,如果在需要觸發(fā)中 斷時能夠真實觸發(fā)對應(yīng)的中斷,則將該執(zhí)行序列、測試用例、真實發(fā)生與否的信息,作為一 行數(shù)據(jù),打印到驗證結(jié)果文件中。
8. 如權(quán)利要求1所述的動靜態(tài)結(jié)合的中斷驅(qū)動程序數(shù)據(jù)競爭檢測方法,其特征在于所 述步驟9具體過程如下: 步驟91 :讀取驗證結(jié)果文件,合并執(zhí)行序列相同的驗證結(jié)果,每個驗證結(jié)果增加"發(fā)生 次數(shù)"這一列,以統(tǒng)計相同的執(zhí)行序列發(fā)生的次數(shù), 步驟92 :針對每個驗證結(jié)果的真實發(fā)生與否這一屬性,按照有真實發(fā)生在前,非真實 發(fā)生在后的順序,進行一次排序, 步驟93:針對每個驗證結(jié)果的的發(fā)生次數(shù)這一屬性,按照發(fā)生次數(shù)由大到小的順序, 對前述排序進行微調(diào), 步驟94:將最終的排序結(jié)果輸入到測試結(jié)果文件中,從而得到了對受測試的中斷驅(qū)動 程序源文件的競爭檢測結(jié)果。
【文檔編號】G06F9/445GK104090798SQ201410324303
【公開日】2014年10月8日 申請日期:2014年7月8日 優(yōu)先權(quán)日:2014年7月8日
【發(fā)明者】王林章, 陳園軍, 陳志 , 李宣東 申請人:南京大學(xué)