[發明專利]數組越界錯誤的自動檢測和校正方法有效
| 申請號: | 201410022323.0 | 申請日: | 2014-01-17 |
| 公開(公告)號: | CN103778061A | 公開(公告)日: | 2014-05-07 |
| 發明(設計)人: | 陳哲;李文明;黃志球 | 申請(專利權)人: | 南京航空航天大學 |
| 主分類號: | G06F11/36 | 分類號: | G06F11/36 |
| 代理公司: | 南京經緯專利商標代理有限公司 32200 | 代理人: | 朱小兵;劉謙 |
| 地址: | 210016 江*** | 國省代碼: | 江蘇;32 |
| 權利要求書: | 查看更多 | 說明書: | 查看更多 |
| 摘要: | |||
| 搜索關鍵詞: | 數組 越界 錯誤 自動檢測 校正 方法 | ||
1.一種數組越界錯誤的自動檢測和校正方法,其特征在于,包括:
步驟1、選擇待變換的源代碼項目目錄,或者單個源代碼文件;
步驟2、針對待變換的源代碼,利用編譯器生成源代碼的符號表和抽象語法樹;
步驟3、遍歷抽象語法樹中的所有結點,構造指針依賴圖,并進行源代碼變換計算,其中:所述指針依賴圖是一個有向圖二元組,所述有向圖二元組包括源代碼中的指針集合和源代碼中的指針依賴關系集合,所述源代碼中的指針集合構成指針依賴圖中的結點集合,所述源代碼中的指針依賴關系集合構成指針依賴圖中的有向邊集合;
步驟4、根據步驟3的計算結果,在源代碼中將需替換的部分源代碼進行替換,生成變換后的源代碼,并保存到新項目目錄或新文件;
步驟5、定義數組越界檢測策略和校正策略,并將這些策略轉化為函數__MNT_CHK_AAV的定義,將按照策略生成的函數__MNT_CHK_AAV的定義寫入變換后源代碼的開頭部分;
步驟6、將變換后的項目目錄或文件用原編譯器進行編譯,生成目標系統上的可執行文件;
步驟7、將生成的可執行文件部署到目標系統并運行,當可執行文件運行到已替換或插入的代碼段時,將自動檢測和校正數組越界錯誤,并準確報告錯誤對應的源代碼位置。
2.如權利要求1所述的數組越界錯誤的自動檢測和校正方法,其特征在于,所述遍歷抽象語法樹中的所有結點,構造指針依賴圖,并進行源代碼變換計算,進一步包括:
在遍歷抽象語法樹的過程中,根據當前遍歷到的結點s的類型進行如下操作之一:
向指針依賴圖中加入指針依賴關系,
將數組下標訪問表達式和指針訪問表達式替換為__MNT_CHK_AAV函數的調用,
將函數聲明、函數定義、函數調用表達式替換為新的表達式。
3.如權利要求1所述的數組越界錯誤的自動檢測和校正方法,其特征在于,所述在遍歷抽象語法樹的過程中,根據當前遍歷到的結點s的類型進行如下操作之一:向指針依賴圖中加入指針依賴關系,將數組下標訪問表達式和指針訪問表達式替換為__MNT_CHK_AAV函數的調用,將函數聲明、函數定義、函數調用表達式替換為新的表達式,進一步包括:
在遍歷抽象語法樹的過程中,對于當前遍歷到的結點s,得到其所在的源文件名filename和代碼行號loc,并根據當前遍歷到的結點s的類型分別進行如下操作:
操作1、如果結點s是一個帶初始值的指針聲明type*p=expr,其中p為指針名,expr為表達式,且expr中包含一個支配指針q,則將指針對(p,q)作為一條邊加入指針依賴圖;
操作2、如果結點s是一個指針賦值表達式p=expr,其中p為指針名,expr為表達式,且expr中包含一個支配指針q,則將(p,q)作為一條邊加入指針依賴圖;
操作3、如果結點s是一個數組下標表達式p[expr],其中p為指針名或數組名,expr為表達式,則根據p的類型分別進行如下操作:
操作31、如果p是符號表中已定義的一個數組,則從符號表中獲取該數組的類型type和長度len,然后將該表達式替換為如下函數調用:
*((type*)(__MNT_CHECK_AAV(p+expr,p,p+len,filename,loc)))
其中,函數參數p+expr表示數組下標表達式訪問的內存地址,函數參數p表示數組的起始地址,函數參數p+len表示數組的結束地址,函數參數filename表示源文件名,函數參數loc表示代碼行號;
操作32、如果p是所在函數聲明的第n個形式參數,則從符號表中獲取該指針的類型type,然后將該表達式替換為如下函數調用:
*((type*)(__MNT_CHK_AAV(p+expr,__MNT_CHK_AAV_B_n,__MNT_CHK_AAV_E_n,filename,loc)))
其中,函數參數p+expr表示數組下標表達式訪問的內存地址,函數參數__MNT_CHK_AAV_B_n表示第n個形式參數的起始地址,函數參數__MNT_CHK_AAV_E_n表示第n個形式參數的結束地址,函數參數filename表示源文件名,函數參數loc表示代碼行號;
操作33、如果p是不滿足以上操作31、操作32中的兩種情況的指針,則從指針依賴圖中獲取其最終依賴指針q,如果q不存在,則認為源代碼中存在指針使用前未賦初值的錯誤,并報錯,如果q存在,則根據q的類型分別進行如下操作:
操作331、如果q是符號表中已定義的一個數組,則從符號表中獲取指針p的類型type和數組q的長度len,然后將該表達式替換為如下函數調用:
*((type*)(__MNT_CHECK_AAV(p+expr,q,q+len,filename,loc)))
其中,函數參數p+expr表示數組下標表達式訪問的內存地址,函數參數q表示數組的起始地址,函數參數q+len表示數組的結束地址,函數參數filename表示源文件名,函數參數loc表示代碼行號;
操作332、如果q是所在函數聲明的第n個形式參數,則從符號表中獲取指針p的類型type,然后將該表達式替換為如下函數調用:
*((type*)(__MNT_CHK_AAV(p+expr,__MNT_CHK_AAV_B_n,__MNT_CHK_AAV_E_n,filename,loc)))
其中,函數參數p+expr表示數組下標表達式訪問的內存地址,函數參數__MNT_CHK_AAV_B_n表示第n個形式參數的起始地址,函數參數__MNT_CHK_AAV_E_n表示第n個形式參數的結束地址,函數參數filename表示源文件名,函數參數loc表示代碼行號;
操作333、如果q是不滿足以上操作331、操作332中的兩種情況的指針,則認為源代碼中存在指針使用前未賦初值的錯誤,并報錯;
操作4、如果結點s是一個指針訪問表達式*expr,其中expr為表達式,且expr中包含一個支配指針p,則根據p的類型分別進行如下操作:
操作41、如果p是符號表中已定義的一個數組,則從符號表中獲取該數組的類型type和長度len,然后將該表達式替換為如下函數調用:
*((type*)(__MNT_CHECK_AAV(expr,p,p+len,filename,loc)))
其中,函數參數expr表示指針訪問表達式訪問的內存地址,函數參數p表示數組的起始地址,函數參數p+len表示數組的結束地址,函數參數filename表示源文件名,函數參數loc表示代碼行號;
操作42、如果p是所在函數聲明的第n個形式參數,則從符號表中獲取該指針的類型type,然后將該表達式替換為如下函數調用:
*((type*)(__MNT_CHK_AAV(expr,__MNT_CHK_AAV_B_n,__MNT_CHK_AAV_E_n,filename,loc)))
其中,函數參數expr表示指針訪問表達式訪問的內存地址,函數參數__MNT_CHK_AAV_B_n表示第n個形式參數的起始地址,函數參數__MNT_CHK_AAV_E_n表示第n個形式參數的結束地址,函數參數filename表示源文件名,函數參數loc表示代碼行號;
操作43、如果p是不滿足以上操作41、操作42中的兩種情況的指針,則從指針依賴圖中獲取其最終依賴指針q,如果q不存在,則認為源代碼中存在指針使用前未賦初值的錯誤,并報錯,如果q存在,則根據q的類型分別進行如下操作:
操作431、如果q是符號表中已定義的一個數組,則從符號表中獲取指針p的類型type和數組q的長度len,然后將該表達式替換為如下函數調用:
*((type*)(__MNT_CHECK_AAV(expr,q,q+len,filename,loc)))
其中,函數參數expr表示指針訪問表達式訪問的內存地址,函數參數q表示數組的起始地址,函數參數q+len表示數組的結束地址,函數參數filename表示源文件名,函數參數loc表示代碼行號;
操作432、如果q是所在函數聲明的第n個形式參數,則從符號表中獲取指針p的類型type,然后將該表達式替換為如下函數調用:
*((type*)(__MNT_CHK_AAV(expr,__MNT_CHK_AAV_B_n,__MNT_CHK_AAV_E_n,filename,loc)))
其中,函數參數expr表示指針訪問表達式訪問的內存地址,函數參數__MNT_CHK_AAV_B_n表示第n個形式參數的起始地址,函數參數__MNT_CHK_AAV_E_n表示第n個形式參數的結束地址,函數參數filename表示源文件名,函數參數loc表示代碼行號;
操作433、如果q是不滿足以上操作431、操作432中的兩種情況的指針,則認為源代碼中存在指針使用前未賦初值的錯誤,并報錯;
操作5、如果結點s是一個函數聲明或函數定義表達式type?func(…,type_nexpr_n,…),其中:第n個參數表達式expr_n為type_n類型的數組或指針聲明p,省略號…表示其它參數表達式,則將該函數聲明或函數定義替換為如下函數:
type?func(…,type_n?expr_n,void*__MNT_CHK_AAV_B_n,void*__MNT_CHK_AAV_E_n,…)
其中,省略號…表示原來的所有參數表達式,函數參數__MNT_CHK_AAV_B_n表示第n個參數表達式的起始地址,函數參數__MNT_CHK_AAV_E_n表示第n個參數表達式的結束地址;
操作6、如果結點s是一個函數調用表達式func(…,expr_n,…),其中:第n個參數表達式expr_n中包含一個支配指針p,省略號…表示其它參數表達式,則根據p的類型分別進行如下操作:
操作61、如果p是符號表中已定義的一個數組,則從符號表中獲取該數組的長度len,然后將該表達式替換為如下函數調用:func(…,expr_n,p,p+len,…),其中,省略號…表示原來的所有參數表達式,函數參數p表示數組的起始地址,函數參數p+len表示數組的結束地址;
操作62、如果p是所在函數聲明的第n個形式參數,則將該表達式替換為如下函數調用:
func(…,expr_n,__MNT_CHK_AAV_B_n,__MNT_CHK_AAV_E_n,…)
其中,省略號…表示原來的所有參數表達式,函數參數__MNT_CHK_AAV_B_n表示第n個形式參數的起始地址,函數參數__MNT_CHK_AAV_E_n表示第n個形式參數的結束地址;
操作63、如果p是不滿足以上操作61、操作62中的兩種情況的指針,則從指針依賴圖中獲取其最終依賴指針q,如果q不存在,則認為源代碼中存在指針使用前未賦初值的錯誤,并報錯,如果q存在,則根據q的類型分別進行如下操作:
操作631、如果q是符號表中已定義的一個數組,則從符號表中獲取數組q的長度len,然后將該表達式替換為如下函數調用:func(…,expr_n,q,q+len,…),其中,省略號…表示原來的所有參數表達式,函數參數q表示數組的起始地址,函數參數q+len表示數組的結束地址;
操作632、如果q是所在函數聲明的第n個形式參數,則將該表達式替換為如下函數調用:
func(…,expr_n,__MNT_CHK_AAV_B_n,__MNT_CHK_AAV_E_n,…)
其中,省略號…表示原來的所有參數表達式,函數參數__MNT_CHK_AAV_B_n表示第n個形式參數的起始地址,函數參數__MNT_CHK_AAV_E_n表示第n個形式參數的結束地址;
操作633、如果q是不滿足以上操作631、操作632中的兩種情況的指針,則認為源代碼中存在指針使用前未賦初值的錯誤,并報錯。
該專利技術資料僅供研究查看技術是否侵權等信息,商用須獲得專利權人授權。該專利全部權利屬于南京航空航天大學,未經南京航空航天大學許可,擅自商用是侵權行為。如果您想購買此專利、獲得商業授權和技術合作,請聯系【客服】
本文鏈接:http://www.szxzyx.cn/pat/books/201410022323.0/1.html,轉載請聲明來源鉆瓜專利網。





