專利名稱:一種51匯編語言軟件安全性編碼規(guī)則自動(dòng)檢查方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種軟件編碼規(guī)則自動(dòng)檢查方法,主要應(yīng)用于針對51匯編語言軟件的靜態(tài)測試。
背景技術(shù):
編碼規(guī)則自動(dòng)檢查技術(shù)是針對軟件與所確定的編碼規(guī)則符合性進(jìn)行檢查的技術(shù), 是軟件靜態(tài)測試技術(shù)的一個(gè)分支。目前對于C語言的編碼規(guī)則研究較多,常見的C語言安全編碼規(guī)則集有 MISRA(Motor Industry Software Reliability Association) C 編碼規(guī)則等。而針對 C i吾言的常用軟件測試工具大都包含針對MISRA等C語言軟件編碼規(guī)則的檢查功能。針對匯編語言的編碼規(guī)則自動(dòng)檢查技術(shù)目前研究較少,首先是由于沒有制定針對匯編語言的編程規(guī)則集;其次,軟件的編碼規(guī)則自動(dòng)檢查技術(shù)中最重要的是詞法和語法分析和規(guī)則匹配技術(shù),而目前針對51匯編語言程序的詞法及語法分析、規(guī)則匹配技術(shù)很少被研究。
發(fā)明內(nèi)容
本發(fā)明的技術(shù)解決問題是克服現(xiàn)有技術(shù)的不足,提供了一種操作簡便、準(zhǔn)確率高、可擴(kuò)展性強(qiáng)的51匯編語言軟件安全性編碼規(guī)則自動(dòng)化檢查方法,為針對51匯編語言軟件進(jìn)行安全性編碼規(guī)則的自動(dòng)檢查提供了依據(jù)。本發(fā)明的技術(shù)解決方案是一種51匯編語言軟件安全性編碼規(guī)則自動(dòng)檢查方法, 步驟如下(1)確定針對51匯編語言的安全編碼規(guī)則,包括堆棧處理安全性規(guī)則、中斷處理安全性規(guī)則、指令匹配性檢查規(guī)則、未用中斷向量處理安全性規(guī)則、避免存在不可達(dá)代碼安全性規(guī)則;所述的堆棧處理安全性規(guī)則用于檢查程序中堆棧是否存在堆棧不平衡或者堆棧溢出;所述的中斷處理安全性規(guī)則用于檢查程序的中斷處理是否存在安全性;所述的指令匹配性檢查規(guī)則用于檢查特定指令與所在子程序是否匹配以及指令與所用操作數(shù)之間是否匹配;所述的未用中斷向量處理安全性規(guī)則用于檢查所有未用中斷的中斷向量處理是否符合安全性要求;所述的避免存在不可達(dá)代碼安全性規(guī)則用于檢查程序中是否存在未被調(diào)用的子程序或者不可達(dá)代碼;(2)將源代碼按照統(tǒng)一格式重新排版,進(jìn)行分離代碼和注釋、提取獨(dú)立的單詞助記符;(3)在重新排版的源代碼上增加子程序開始和結(jié)束標(biāo)識,然后從得到的單詞助記符中提取偽指令、指令、操作數(shù)、行號、標(biāo)號并與51匯編語言語法規(guī)則進(jìn)行匹配,識別出變量、相關(guān)指令、操作數(shù)、中斷向量區(qū)、子程序、中斷服務(wù)程序,由此提取各個(gè)子程序、中斷服務(wù)程序的名稱及起始行號和結(jié)束行號,并記錄與步驟(1)中制定的安全性編碼規(guī)則匹配相關(guān)的指令所在的行號,以及子程序調(diào)用指令和無條件跳轉(zhuǎn)指令的操作數(shù)信息;同時(shí)對軟件代碼進(jìn)行結(jié)構(gòu)分析,得到所有的被調(diào)用子程序集合和被跳轉(zhuǎn)標(biāo)號集合;(4)根據(jù)步驟(3)的提取結(jié)果以及結(jié)構(gòu)分析結(jié)果,依據(jù)步驟(1)中制定的安全性編碼規(guī)則,判斷程序代碼中是否存在錯(cuò)誤并將判斷結(jié)果輸出。本發(fā)明與現(xiàn)有技術(shù)相比的優(yōu)點(diǎn)在于本發(fā)明提出了一種51匯編語言軟件安全性編碼規(guī)則自動(dòng)化檢查方法,該方法具有分析準(zhǔn)確率高、直接對應(yīng)到源程序、規(guī)則可擴(kuò)展等特點(diǎn),為針對51匯編語言軟件進(jìn)行安全性編碼規(guī)則的自動(dòng)檢查提供了簡便實(shí)用的方法。其中檢查所依據(jù)的安全性編碼規(guī)則根據(jù)以往51匯編語言編程的錯(cuò)誤案例提取,涉及堆棧處理、 中斷處理、指令匹配檢查等多方面,覆蓋性強(qiáng)。通過軟件編程,可以使該方法的檢查完全自動(dòng)進(jìn)行,不需要與人的交互過程。通過對源代碼進(jìn)行的掃描和預(yù)處理過程可以使該方法適用于不同編程風(fēng)格和書寫格式的被測程序。通過對被測程序的詞法分析、語法分析、結(jié)構(gòu)分析,得到了進(jìn)行規(guī)則匹配所需要的所有信息以及被測程序的其他信息,方便以后增加其他安全性編碼規(guī)則。同時(shí)由于對程序進(jìn)行了結(jié)構(gòu)分析,大大提高了分析的準(zhǔn)確性。最終的結(jié)果輸出時(shí)能直接對應(yīng)到源程序,方便用戶對軟件錯(cuò)誤進(jìn)行定位。
圖1為本發(fā)明方法的流程框圖。
具體實(shí)施例方式如圖1所示,本發(fā)明方法主要包括安全性編碼規(guī)則制定、代碼掃描和預(yù)處理、程序代碼搜索、規(guī)則匹配、結(jié)果輸出等步驟,下面分別進(jìn)行詳細(xì)說明。一、安全性編碼規(guī)則制定本方法所針對的51匯編語言安全編碼規(guī)則包括堆棧處理的安全性規(guī)則。堆棧處理的安全性規(guī)則包括保持堆棧平衡的安全性規(guī)則和防止堆棧溢出的安全性規(guī)則,這是最常見也是最關(guān)鍵安全性規(guī)則,一旦違反通常都將導(dǎo)致軟件運(yùn)行崩潰。如規(guī)則1 壓棧和彈棧指令應(yīng)匹配出現(xiàn),規(guī)則2 要防止堆棧使用時(shí)的溢
出ο中斷處理安全性的規(guī)則是指針對一些特定中斷的處理應(yīng)符合特定的安全性要求, 如果不符合該要求,將導(dǎo)致軟件出現(xiàn)嚴(yán)重錯(cuò)誤,如規(guī)則3 如果使用了串口中斷,則在串口中斷服務(wù)程序中必須清除RI或者TI (如果軟件中沒有清除指令會導(dǎo)致重復(fù)串口中斷的重復(fù)觸發(fā))。規(guī)則4 如果使用了定時(shí)器2中斷,則在其中斷服務(wù)程序中必須清除定時(shí)器2中斷標(biāo)志;指令匹配性檢查規(guī)則包括指令與子程序的匹配性檢查和指令與操作數(shù)的匹配性的檢查。指令與子程序的匹配性檢查是指某些指令只能用于某種類型的子程序如規(guī)則5 中斷服務(wù)程序的返回指令應(yīng)使用RETI,非中斷服務(wù)程序子程序的返回指令應(yīng)使用RET,不能混用;指令與操作數(shù)的匹配性檢查是指某些指令只能針對特定類型的操作數(shù),如規(guī)則6 指令MOVX的操作數(shù)必須包括1個(gè)外部地址。未用中斷向量處理安全性規(guī)則是指未用中斷向量的處理應(yīng)符合安全性要求,否則會導(dǎo)致一旦觸發(fā)該未用中斷就無法從中斷中退出的錯(cuò)誤或者導(dǎo)致存儲器中存在未經(jīng)處理的空白區(qū),如規(guī)則7 針對未使用中斷向量的處理必須保證能退出該中斷并正常響應(yīng)其他中斷;避免存在不可達(dá)代碼的安全性規(guī)則是指軟件中不能存在不可達(dá)代碼,因?yàn)橐坏┨脒@些代碼會導(dǎo)致程序無法繼續(xù)正確執(zhí)行如規(guī)則8 禁止存在不可達(dá)代碼。二、代碼掃描及預(yù)處理主要是對代碼按照規(guī)定的格式進(jìn)行重排版,進(jìn)行分離代碼和注釋、提取獨(dú)立的單詞助記符。由于被檢查軟件的編程風(fēng)格并不統(tǒng)一,為保證后續(xù)處理接口的一致性,需要把源代碼按照統(tǒng)一格式進(jìn)行重新排版,通常的方法是把每一行首字符前面的空格全部刪除,從而得到統(tǒng)一格式的被檢查軟件源代碼。然后是對排版后的程序進(jìn)行掃描,首先是剔除注釋, 然后按順序提取單詞助記符,并把同一行內(nèi)的各單詞助記符之間均設(shè)置為1個(gè)空格。三、詞法分析、語法分析及結(jié)構(gòu)分析從得到的單詞助記符中提取偽指令0)RG、END、EQU、BIT、DATA、DB、DW)、指令、操作數(shù)、行號、標(biāo)號等信息;與51匯編語言語法規(guī)則進(jìn)行匹配,識別出變量(使用EQU、BIT、DATA 進(jìn)行定義)、相關(guān)指令(RET、RETI、PUSH、POP、CLR、MOVX, AJMP, SJMP, LJMP, JZ、JNZ, CJNE, DJNZ, ACALL、LCALL)、操作數(shù)(只識別上述相關(guān)指令的操作數(shù),其中PUSH、POP、CLR、AJMP, SJMP, LJMP, JZ、JNZ, ACALL、LCALL指令只有1個(gè)操作數(shù),CJNE指令有3個(gè)操作數(shù),DJNZ指令有2個(gè)操作數(shù))、中斷向量區(qū)(分別使用ORG 0003、ORG 000ΒΗ、ORG 0013H、ORG 001BH、 ORG 0023H進(jìn)行定義,對應(yīng)外部中斷0、定時(shí)器中斷0、外部中斷1、定時(shí)器中斷1、串口中斷的中斷向量區(qū))、子程序、中斷服務(wù)程序標(biāo)號(以“”結(jié)束的單詞助記符)等元素信息;由于51匯編語言程序本身沒有子程序開始和結(jié)束的標(biāo)識,因此在進(jìn)行編碼規(guī)則檢查之前,需要對被檢查程序手動(dòng)增加子程序和中斷服務(wù)程序的開始標(biāo)識和結(jié)束標(biāo)識。其中51匯編語言的中斷向量考慮的是針對8031 (8051)處理器的情況。此處需要提取各個(gè)子程序和中斷服務(wù)程序的名稱及起始行號和結(jié)束行號,以及記錄所有指令所在行號。結(jié)構(gòu)分析記錄所有ACALL、LCALL指令及其操作數(shù)的信息,所有ACALL指令和 LCALL指令的操作數(shù)即為被調(diào)用的子程序,從而可以得到每個(gè)子程序調(diào)用的其他子程序集合及調(diào)用次數(shù)的情況。記錄所有AJMP、SJMP、LJMP、JZ、JNZ、CJNE、DJNZ指令的操作數(shù)(針對CJNE、DJNZ指令只記錄最后1個(gè)操作數(shù)),從而得到所有被跳轉(zhuǎn)的標(biāo)號集合。四、安全性規(guī)則匹配從提取的元素信息中查找相關(guān)的元素信息,判斷是否符合規(guī)則;將規(guī)則匹配分解到3個(gè)階段掃描元素信息階段、查詢分析階段、結(jié)構(gòu)分析階段。其中掃描元素信息階段是指在進(jìn)行詞法及語法分析時(shí)就完成規(guī)則的匹配,這是指代碼上下文關(guān)系方面的規(guī)則,如規(guī)則3、規(guī)則5 ;而查詢分析階段是指所要分析的規(guī)則涉及到多種信息,需要對多種信息進(jìn)行綜合分析后才能得到結(jié)果,這是規(guī)則匹配的主要階段,適用于所有主要規(guī)則;結(jié)構(gòu)分析階段則指必須完成對程序結(jié)構(gòu)的分析之后才能得到分析結(jié)果的,這是與軟件結(jié)構(gòu)相關(guān)的規(guī)則, 如規(guī)則8。下面分別以規(guī)則1、3、5、8為例說明如何在不同階段完成安全性規(guī)則的匹配。針對規(guī)則1的檢查方法壓棧和彈棧指令匹配出現(xiàn)是針對同一個(gè)子程序而言的,不考慮壓棧指令在一個(gè)子程序,而彈棧指令在另一個(gè)子程序的情況。判斷方法為首先找到所有的壓棧指令(PUSH)
5和彈棧指令(POP),判斷壓棧指令和彈棧指令的行號是否在某子程序的范圍內(nèi),即找到每個(gè)子程序所有的壓棧(PUSH)指令和彈棧(POP)指令。針對每個(gè)子程序的所有壓棧(PUSH)指令和彈棧(POP)指令,確認(rèn)其壓棧(PUSH)指令的條數(shù)是否與彈棧(POP)指令的條數(shù)相對, 然后確定是否滿足在程序任一點(diǎn)壓棧(PUSH)指令個(gè)數(shù)不少于彈棧(POP)指令個(gè)數(shù)。如果滿足上述條件,則證明壓棧指令和彈棧指令是匹配的,否則是不匹配的。針對規(guī)則3的檢查方法判斷程序中是否使用了串口中斷,其方法為根據(jù)串口中斷向量入口是否存在無條件跳轉(zhuǎn)指令(AJMP、LJMP, SJMP),如果存在無條件跳轉(zhuǎn)指令,并且該跳轉(zhuǎn)指令所跳轉(zhuǎn)的標(biāo)號為子程序名稱的話,則可以確認(rèn)程序中使用了串口中斷。如果確認(rèn)使用了串口中斷,則需要判斷在串口中斷服務(wù)程序中是否存在清除RI (CLR RI)或者TI (CLR Tl)的指令。判斷方法為掃描程序中是否存在清除RI (CLR RI)或者TI (CLR Tl)的指令,判斷該指令所在的行號是否在串口中斷服務(wù)程序范圍之內(nèi)。針對規(guī)則5的檢查方法掃描所有的RET指令和RETI指令,判斷所有RET指令所在的行號是否在子程序的起始行號和結(jié)束行號所在范圍內(nèi),所有RETI指令是否是在中斷服務(wù)子程序的起始行號和結(jié)束行號所在的范圍內(nèi),如果發(fā)現(xiàn)不滿足,則證明存在違反。針對規(guī)則8的檢查方法不可達(dá)代碼包括2種情況,即未被調(diào)用的子程序(中斷服務(wù)程序)和不可達(dá)代碼。 在針對被測程序進(jìn)行結(jié)構(gòu)分析(調(diào)用關(guān)系)后,可以找出是否存在未被調(diào)用的子程序,該子程序就是不可達(dá)子程序。針對不可達(dá)代碼的分析則可以在查詢分析階段進(jìn)行。查詢是否有未被跳轉(zhuǎn)的標(biāo)號,并且該標(biāo)號所在行的前一條指令仍為無條件跳轉(zhuǎn)指令(AJMP、LJMP、SJMP)。如果存在這種情況,則說明存在不可達(dá)代碼。五、結(jié)果輸出最終的檢查結(jié)果以* .html網(wǎng)頁形式輸出,包含針對所有安全性編碼規(guī)則的違反情況統(tǒng)計(jì),針對每條規(guī)則的每一處違反均能鏈接到源代碼,并且可以輸出一份完整的安全性編碼規(guī)則分析報(bào)告。六、可擴(kuò)展性說明由于在代碼掃描和預(yù)處理階段及詞法和語法分析階段,已經(jīng)獲得了被測軟件中所有的變量、指令、子程序、中斷向量區(qū)、中斷服務(wù)程序的行號信息,因此可以利用這些信息進(jìn)行相應(yīng)規(guī)則的擴(kuò)展,如指令合理性檢查、標(biāo)號名被重用等規(guī)則。此外還可以通過結(jié)構(gòu)分析得到的結(jié)果,進(jìn)一步增加對與軟件結(jié)構(gòu)相關(guān)的規(guī)則進(jìn)行分析,如軟件扇出度(即子程序最大調(diào)用其他子程序的個(gè)數(shù))。本發(fā)明說明書中未作詳細(xì)描述的內(nèi)容屬本領(lǐng)域技術(shù)人員的公知技術(shù)。
權(quán)利要求
1. 一種51匯編語言軟件安全性編碼規(guī)則自動(dòng)檢查方法,其特征在于步驟如下(1)確定針對51匯編語言的安全編碼規(guī)則,包括堆棧處理安全性規(guī)則、中斷處理安全性規(guī)則、指令匹配性檢查規(guī)則、未用中斷向量處理安全性規(guī)則、避免存在不可達(dá)代碼安全性規(guī)則;所述的堆棧處理安全性規(guī)則用于檢查程序中堆棧是否存在堆棧不平衡或者堆棧溢出;所述的中斷處理安全性規(guī)則用于檢查程序的中斷處理是否存在安全性;所述的指令匹配性檢查規(guī)則用于檢查特定指令與所在子程序是否匹配以及指令與所用操作數(shù)之間是否匹配;所述的未用中斷向量處理安全性規(guī)則用于檢查所有未用中斷的中斷向量處理是否符合安全性要求;所述的避免存在不可達(dá)代碼安全性規(guī)則用于檢查程序中是否存在未被調(diào)用的子程序或者不可達(dá)代碼;(2)將源代碼按照統(tǒng)一格式重新排版,進(jìn)行分離代碼和注釋、提取獨(dú)立的單詞助記符;(3)在重新排版的源代碼上增加子程序開始和結(jié)束標(biāo)識,然后從得到的單詞助記符中提取偽指令、指令、操作數(shù)、行號、標(biāo)號并與51匯編語言語法規(guī)則進(jìn)行匹配,識別出變量、相關(guān)指令、操作數(shù)、中斷向量區(qū)、子程序、中斷服務(wù)程序,由此提取各個(gè)子程序、中斷服務(wù)程序的名稱及起始行號和結(jié)束行號,并記錄與步驟(1)中制定的安全性編碼規(guī)則匹配相關(guān)的指令所在的行號,以及子程序調(diào)用指令和無條件跳轉(zhuǎn)指令的操作數(shù)信息;同時(shí)對軟件代碼進(jìn)行結(jié)構(gòu)分析,得到所有的被調(diào)用子程序集合和被跳轉(zhuǎn)標(biāo)號集合;(4)根據(jù)步驟(3)的提取結(jié)果以及結(jié)構(gòu)分析結(jié)果,依據(jù)步驟(1)中制定的安全性編碼規(guī)則,判斷程序代碼中是否存在錯(cuò)誤并將判斷結(jié)果輸出。
全文摘要
一種51匯編語言軟件安全性編碼規(guī)則自動(dòng)檢查方法,首先確定針對51匯編語言的安全編碼規(guī)則。然后將源代碼按照統(tǒng)一格式重新排版,進(jìn)行分離代碼和注釋、提取獨(dú)立的單詞助記符。隨后在重新排版的源代碼上增加子程序開始和結(jié)束標(biāo)識,然后從得到的單詞助記符中提取偽指令、指令、操作數(shù)、行號、標(biāo)號并與51匯編語言語法規(guī)則進(jìn)行匹配,識別出變量、相關(guān)指令、操作數(shù)、中斷向量區(qū)、子程序、中斷服務(wù)程序,由此提取各個(gè)子程序、中斷服務(wù)程序的名稱及起始行號和結(jié)束行號。最后根據(jù)提取結(jié)果以及結(jié)構(gòu)分析結(jié)果,將制定的安全性編碼規(guī)則作為標(biāo)準(zhǔn),判斷程序代碼中是否存在錯(cuò)誤并將判斷結(jié)果輸出。本方法具有分析準(zhǔn)確率高、直接對應(yīng)源程序、規(guī)則可擴(kuò)展等特點(diǎn)。
文檔編號G06F11/36GK102419730SQ20111041246
公開日2012年4月18日 申請日期2011年12月8日 優(yōu)先權(quán)日2011年12月8日
發(fā)明者侯成杰, 常江, 李鵬宇, 歐陽高翔, 武占峰, 段永顥 申請人:北京控制工程研究所