亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

一種源代碼中值計算錯誤的自動檢測和定位方法

文檔序號:6628426閱讀:342來源:國知局
一種源代碼中值計算錯誤的自動檢測和定位方法
【專利摘要】本發(fā)明公開了一種源代碼中值計算錯誤的自動檢測和定位方法,屬于計算機(jī)軟件測試領(lǐng)域,該方法利用編譯器對源代碼進(jìn)行語法分析,構(gòu)造抽象語法樹,通過遍歷抽象語法樹,基于表達(dá)式類型和用戶指定檢測的值計算錯誤類型,判斷是否存在值計算錯誤的潛在風(fēng)險;對可能產(chǎn)生值計算錯誤的表達(dá)式進(jìn)行源代碼變換,加入值計算錯誤檢測和源代碼定位的機(jī)制;編譯執(zhí)行變換后的源代碼,執(zhí)行后的源代碼程序會自動判斷值計算錯誤的發(fā)生,并準(zhǔn)確報告錯誤對應(yīng)的源代碼位置。本方法可以在軟件運(yùn)行過程中自動檢測和定位軟件中的值計算錯誤,以實(shí)現(xiàn)更準(zhǔn)確的錯誤定位功能,更好的平臺普適性,更高的運(yùn)行時性能和效率,從而克服現(xiàn)有的檢測方法中存在的技術(shù)問題。
【專利說明】一種源代碼中值計算錯誤的自動檢測和定位方法

【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及一種源代碼中值計算錯誤的自動檢測和定位方法,屬于計算機(jī)軟件測 試領(lǐng)域。

【背景技術(shù)】
[0002] 值計算錯誤是一種普遍存在的軟件安全漏洞,尤其是在C和C++程序中。值計算 錯誤包括:(1)除數(shù)為〇;(2)值溢出,包括值上溢、值下溢和精度丟失;(3)變量使用前未 初始化等。這些錯誤可能導(dǎo)致軟件異?;蛳到y(tǒng)崩潰,與緩沖區(qū)漏洞等技術(shù)結(jié)合可以被黑客 用來執(zhí)行惡意代碼。例如,1996年阿麗亞娜5號火箭的發(fā)射失敗就是由于一個浮點(diǎn)數(shù)轉(zhuǎn) 換為整數(shù)的精度丟失錯誤;Flash Oday漏洞和IE Oday漏洞允許黑客獲得最高權(quán)限;在 MITRE2011年發(fā)布的報告中,值溢出漏洞被列為"25種最危險的軟件錯誤"之一。對于安全 關(guān)鍵系統(tǒng)或安全關(guān)鍵應(yīng)用,如果值計算錯誤引起系統(tǒng)錯誤或被黑客利用,將會造成巨大損 失。所以,實(shí)現(xiàn)值計算錯誤的高效自動檢測和源代碼定位,能夠極大提高軟件開發(fā)的質(zhì)量和 維護(hù)的效率。
[0003] 目前,值計算錯誤的檢測方法主要分為兩類:靜態(tài)檢測和動態(tài)檢測。
[0004] 靜態(tài)檢測是指在不運(yùn)行軟件的前提下,分析軟件的設(shè)計模型、源代碼或者二進(jìn)制 代碼,尋找可能導(dǎo)致軟件失效的錯誤。其優(yōu)點(diǎn)在于,通過對軟件進(jìn)行建模,保證了檢測軟件 行為的完備性。其缺點(diǎn)在于:(1)形式化驗(yàn)證會帶來狀態(tài)空間爆炸問題,檢測時對系統(tǒng)資源 的要求較高,甚至無法在合理時間內(nèi)完成驗(yàn)證;(2)由于使用模型抽象,檢測結(jié)果存在誤報 和漏報的可能性。
[0005] 動態(tài)檢測是指利用軟件運(yùn)行過程中的輸出等信息判斷錯誤的發(fā)生,例如軟件測試 技術(shù)和虛擬機(jī)技術(shù)。軟件測試的優(yōu)點(diǎn)在于,實(shí)現(xiàn)了測試用例管理和執(zhí)行的自動化。其缺點(diǎn) 在于:(1)沒有實(shí)現(xiàn)對錯誤發(fā)生位置的自動源代碼定位;(2)開發(fā)人員需要重新手動調(diào)試運(yùn) 行測試用例,效率較低。虛擬機(jī)技術(shù)通過對源代碼的解釋執(zhí)行,在執(zhí)行過程中對值計算錯誤 進(jìn)行監(jiān)控。其缺點(diǎn)在于:(1)依賴于特定的虛擬機(jī)環(huán)境,不具有普遍適用性;(2)虛擬機(jī)的解 釋執(zhí)行導(dǎo)致軟件的性能和效率大幅度降低,不能被安全關(guān)鍵應(yīng)用所接受。
[0006] 因此,有必要提供一種新的值計算錯誤的自動檢測和源代碼定位方法,以實(shí)現(xiàn)更 準(zhǔn)確的錯誤定位功能,更好的平臺普適性,更高的運(yùn)行時性能和效率,從而克服現(xiàn)有的檢測 方法中存在的技術(shù)問題。


【發(fā)明內(nèi)容】

[0007] 發(fā)明目的:為了克服上述已有技術(shù)存在的不足,本發(fā)明的目的旨在提供一種源代 碼中值計算錯誤的自動檢測和定位方法,該方法通過使用源代碼變換技術(shù),將源代碼變換 為帶有自動檢測和錯誤定位功能的源代碼,使得可以在軟件運(yùn)行過程中自動檢測和定位軟 件中的值計算錯誤,以實(shí)現(xiàn)更準(zhǔn)確的錯誤定位功能,更好的平臺普適性,更高的運(yùn)行時性能 和效率,從而克服現(xiàn)有的檢測方法中存在的技術(shù)問題。
[0008] 為實(shí)現(xiàn)上述目的,本發(fā)明采用的技術(shù)方案為:一種源代碼中值計算錯誤的自動檢 測和定位方法,利用編譯器對源代碼進(jìn)行語法分析,構(gòu)造抽象語法樹,通過遍歷抽象語法 樹,基于表達(dá)式類型和用戶指定檢測的值計算錯誤類型,判斷是否存在值計算錯誤的潛在 風(fēng)險;對可能產(chǎn)生值計算錯誤的表達(dá)式進(jìn)行源代碼變換,加入值計算錯誤檢測和源代碼定 位的機(jī)制;編譯執(zhí)行變換后的源代碼,執(zhí)行后的源代碼程序會自動判斷值計算錯誤的發(fā)生, 并準(zhǔn)確報告錯誤對應(yīng)的源代碼位置。
[0009] 本發(fā)明的具體步驟如下:包括以下步驟:
[0010] 步驟S1,選擇需要變換的源代碼目錄,或者單個源代碼文件;
[0011] 步驟S2,指定需要檢測的值計算錯誤類型:除數(shù)為0、值溢出、量使用前未初始化 中的一種或他們之間兩種以上的組合;
[0012] 步驟S3,將選擇的源代碼目錄或文件復(fù)制到源代碼變換的工作目錄中;
[0013] 步驟S4,對工作目錄中的所有源文件進(jìn)行宏擴(kuò)展處理,并保存擴(kuò)展結(jié)果到相應(yīng)的 源文件中;
[0014] 步驟S5,遍歷工作目錄中的所有源文件,利用編譯器生成符號表和抽象語法樹;
[0015] 步驟S6,如果指定需要檢測的值計算錯誤類型中包括除數(shù)為0錯誤,則進(jìn)行除數(shù) 為〇錯誤分析和源代碼變換計算;
[0016] 步驟S7,如果指定需要檢測的值計算錯誤類型中包括值溢出錯誤,則進(jìn)行值溢出 錯誤分析和源代碼變換計算;
[0017] 步驟S8,如果指定需要檢測的值計算錯誤類型中包括變量使用前未初始化錯誤, 則進(jìn)行變量使用前未初始化錯誤分析和源代碼變換計算;
[0018] 步驟S9,將步驟S6、S7或/和S8中所有替換修改寫回到相應(yīng)的源文件中,并根據(jù) 本次修改文件更新已處理文件列表;
[0019] 步驟S10,將經(jīng)過變換的源代碼目錄或源代碼文件按原有方式進(jìn)行編譯,生成可執(zhí) 行文件;
[0020] 步驟S11,將可執(zhí)行文件部署在目標(biāo)平臺上并運(yùn)行,當(dāng)出現(xiàn)值計算錯誤時,插入的 代碼可以自動檢測到錯誤的發(fā)生,并準(zhǔn)確定位和報告值計算錯誤在源代碼中的位置。
[0021] 經(jīng)過上述步驟的操作,即可自動檢測軟件運(yùn)行過程中的的值計算錯誤并定位。
[0022] 本發(fā)明提供的一種源代碼中值計算錯誤的自動檢測和定位方法,相比現(xiàn)有技術(shù), 具有以下有益效果:
[0023] 1.與傳統(tǒng)檢測技術(shù)相比,本發(fā)明提供的值計算錯誤的自動檢測和定位方法通過對 源代碼的抽象語法樹進(jìn)行分析,具有充分的語義信息來判斷潛在的值計算錯誤所在的源文 件和代碼行,并相應(yīng)地進(jìn)行源代碼變換,使得在錯誤檢測中可以使用這些位置信息,因此具 有更準(zhǔn)確的錯誤定位功能。
[0024] 2.本發(fā)明通過源代碼變換技術(shù),使得變換后的源代碼可以使用原有編譯器進(jìn)行編 譯和部署,因此具有更好的平臺普適性。
[0025] 3.本發(fā)明通過對源代碼的抽象語法樹進(jìn)行分析,具有充分的語義信息來判斷潛在 的值計算錯誤的類型,并相應(yīng)地進(jìn)行源代碼變換,減少了插入代碼段的規(guī)模,簡化了插入代 碼段的復(fù)雜程度,從而獲得了更高的運(yùn)行時效率和性能。
[0026] 綜上所述,本發(fā)明可以解決安全關(guān)鍵系統(tǒng)、安全關(guān)鍵應(yīng)用及常用軟件系統(tǒng)中值計 算錯誤檢測和定位的難題,能夠準(zhǔn)確地自動檢測和定位錯誤,實(shí)現(xiàn)更好的平臺普適性,和更 高的運(yùn)行時性能和效率,從而提高軟件開發(fā)的質(zhì)量和軟件維護(hù)的效率,有良好的社會效益。

【專利附圖】

【附圖說明】
[0027] 圖1為本發(fā)明的流程圖。

【具體實(shí)施方式】
[0028] 下面結(jié)合具體實(shí)施例對本發(fā)明技術(shù)方案進(jìn)行詳細(xì)描述,但不作為本發(fā)明的限定。 本實(shí)施例采用本發(fā)明方法對一段C語言源代碼進(jìn)行檢測和錯誤定位,進(jìn)一步具體說明本發(fā) 明的有關(guān)方法、流程及相關(guān)步驟。
[0029] -種源代碼中值計算錯誤的自動檢測和定位方法,如圖1所示,利用編譯器對源 代碼進(jìn)行語法分析,構(gòu)造抽象語法樹,通過遍歷抽象語法樹,基于表達(dá)式類型和用戶指定檢 測的值計算錯誤類型,判斷是否存在值計算錯誤的潛在風(fēng)險;對可能產(chǎn)生值計算錯誤的表 達(dá)式進(jìn)行源代碼變換,加入值計算錯誤檢測和源代碼定位的機(jī)制;編譯執(zhí)行變換后的源代 碼,執(zhí)行后的源代碼程序會自動判斷值計算錯誤的發(fā)生,并準(zhǔn)確報告錯誤對應(yīng)的源代碼位 置。
[0030] 本實(shí)施例采用本發(fā)明方法對一段C語言源代碼進(jìn)行檢測和錯誤定位,本實(shí)例的源 代碼如下(文件名為test, c):
[0031]
[0032]

【權(quán)利要求】
1. 一種源代碼中值計算錯誤的自動檢測和定位方法,其特征在于:利用編譯器對源代 碼進(jìn)行語法分析,構(gòu)造抽象語法樹,通過遍歷抽象語法樹,基于表達(dá)式類型和用戶指定檢測 的值計算錯誤類型,判斷是否存在值計算錯誤的潛在風(fēng)險;對可能產(chǎn)生值計算錯誤的表達(dá) 式進(jìn)行源代碼變換,加入值計算錯誤檢測和源代碼定位的機(jī)制;編譯執(zhí)行變換后的源代碼, 執(zhí)行后的源代碼程序會自動判斷值計算錯誤的發(fā)生,并準(zhǔn)確報告錯誤對應(yīng)的源代碼位置。
2. 根據(jù)權(quán)利要求1所述的源代碼中值計算錯誤的自動檢測和定位方法,其特征在于: 包括以下步驟: 步驟S1,選擇需要變換的源代碼目錄,或者單個源代碼文件; 步驟S2,指定需要檢測的值計算錯誤類型:除數(shù)為0、值溢出、變量使用前未初始化中 的一種或他們之間兩種以上的組合; 步驟S3,將選擇的源代碼目錄或文件復(fù)制到源代碼變換的工作目錄中; 步驟S4,對工作目錄中的所有源文件進(jìn)行宏擴(kuò)展處理,并保存擴(kuò)展結(jié)果到相應(yīng)的源文 件中; 步驟S5,遍歷工作目錄中的所有源文件,利用編譯器生成符號表和抽象語法樹; 步驟S6,如果指定需要檢測的值計算錯誤類型中包括除數(shù)為0錯誤,則進(jìn)行除數(shù)為0錯 誤分析和源代碼變換計算; 步驟S7,如果指定需要檢測的值計算錯誤類型中包括值溢出錯誤,則進(jìn)行值溢出錯誤 分析和源代碼變換計算; 步驟S8,如果指定需要檢測的值計算錯誤類型中包括變量使用前未初始化錯誤,則進(jìn) 行變量使用前未初始化錯誤分析和源代碼變換計算; 步驟S9,將步驟S6、S7或/和S8中所有替換修改寫回到相應(yīng)的源文件中,并根據(jù)本次 修改文件更新已處理文件列表; 步驟S10,將經(jīng)過變換的源代碼目錄或源代碼文件按原有方式進(jìn)行編譯,生成可執(zhí)行文 件; 步驟S11,將可執(zhí)行文件部署在目標(biāo)平臺上并運(yùn)行,當(dāng)出現(xiàn)值計算錯誤時,插入的代碼 可以自動檢測到錯誤的發(fā)生,并準(zhǔn)確定位和報告值計算錯誤在源代碼中的位置。
3. 根據(jù)權(quán)利要求2所述的源代碼中值計算錯誤的自動檢測和定位方法,其特征在于: 所述步驟S4中的宏擴(kuò)展處理包括: S41,利用編譯器的詞法分析器對文件進(jìn)行詞法分析,詞法分析器返回經(jīng)過宏擴(kuò)展處理 之后的詞法單元; S42,針對擴(kuò)展自宏的詞法單元,其屬性中包括宏擴(kuò)展之后的內(nèi)容和宏擴(kuò)展的位置,用 擴(kuò)展之后的內(nèi)容替換宏擴(kuò)展位置的原有內(nèi)容。
4. 根據(jù)權(quán)利要求3所述的源代碼中值計算錯誤的自動檢測和定位方法,其特征在于: 所述步驟S6中除數(shù)為0錯誤分析和源代碼變換計算的方法如下:利用函數(shù)調(diào)用,在返回除 數(shù)給除法表達(dá)式之前,對除數(shù)進(jìn)行檢查,如果除數(shù)為0,則報告錯誤發(fā)生的源代碼位置并結(jié) 束程序,如果除數(shù)不為0,則正常地將除數(shù)返回給除法表達(dá)式。
5. 根據(jù)權(quán)利要求4所述的源代碼中值計算錯誤的自動檢測和定位方法,其特征在于: 所述步驟S7中值溢出錯誤分析和源代碼變換計算的方法如下:將可能產(chǎn)生值溢出錯誤的 表達(dá)式的操作數(shù)進(jìn)行類型提升,然后將類型提升后的表達(dá)式值和原表達(dá)式值進(jìn)行比較,如 果相同則說明未發(fā)生溢出,將原表達(dá)式值返回,如果不相同則說明發(fā)生溢出,報告錯誤發(fā)生 的源代碼位置并結(jié)束程序。
6. 根據(jù)權(quán)利要求5所述的源代碼中值計算錯誤的自動檢測和定位方法,其特征在于: 所述步驟S8中變量使用前未初始化錯誤分析和源代碼變換計算的方法如下:記錄每一個 非全局且聲明時未賦初值的變量的賦值狀態(tài),檢查對于變量的引用,如果是對變量的賦值, 則更新該變量的賦值狀態(tài)記錄,如果是對變量值的使用,則檢查該變量的賦值狀態(tài)記錄,未 賦值則表示出現(xiàn)變量使用前未初始化的錯誤,已賦值則表示沒有出現(xiàn)該錯誤。
7. 根據(jù)權(quán)利要求6所述的源代碼中值計算錯誤的自動檢測和定位方法,其特征在于: 所述步驟S6中除數(shù)為0錯誤分析和源代碼變換計算的方法包括以下步驟: 步驟S61,遍歷編譯器生成的抽象語法樹,如果當(dāng)前節(jié)點(diǎn)s所在文件路徑不在工作目錄 下,或已經(jīng)存在于已處理文件列表中,則忽略該節(jié)點(diǎn),不進(jìn)行處理; 步驟S6101,如果當(dāng)前節(jié)點(diǎn)s為除法表達(dá)式a6101/b6101,則從符號表中獲取表達(dá)式 b6101的類型typeB6101,然后將表達(dá)式"a6101/b6101"替換為如下函數(shù)調(diào)用: a6101/(typeB6101) check_zero (b6101, fileNameS, lineS, columns) 其中check_zero為除0檢測函數(shù)名,fileNameS, lineS, columns分別為節(jié)點(diǎn)s所在文 件名,行號和列號;然后,從抽象語法樹中獲得節(jié)點(diǎn)s所在文件的開始位置locS,加入到檢 測函數(shù)聲明插入位置集合declLocSet,表示此文件需要除0檢測相關(guān)函數(shù)的聲明; 步驟S6102,如果當(dāng)前節(jié)點(diǎn)s為復(fù)合除賦值表達(dá)式a6102/ = b6102,則從符號表中獲取 表達(dá)式b6102的類型typeB6102,然后將表達(dá)式"a6102/ = b6102"替換為如下函數(shù)調(diào)用: a6102/ = (typeB6102) check_zero (b6102, fileNameS, lineS, columns) 其中check_zero為除0檢測函數(shù)名,fileNameS, lineS, columns分別為節(jié)點(diǎn)s所在文 件名,行號和列號;然后,從抽象語法樹中獲得節(jié)點(diǎn)s所在文件的開始位置locS,加入到檢 測函數(shù)聲明插入位置集合declLocSet,表示此文件需要除0檢測相關(guān)函數(shù)的聲明; 步驟S62,對于包含主函數(shù)聲明的文件,在文件開始位置插入檢測函數(shù)long double check-zero(long double num, const char氺fileName, unsigned line, unsigned column)的 定義,其中參數(shù)num代表除數(shù),參數(shù)fileName,line, column分別代表運(yùn)算發(fā)生位置所在文件 名,行號和列號;檢測函數(shù)cheCk_zer〇判斷表示除數(shù)的參數(shù)num是否為0,如果為0,則報告 除〇錯誤發(fā)生位置的文件名,行號和列號,并結(jié)束程序運(yùn)行,否則將除數(shù)作為函數(shù)的返回值 返回; 步驟S63,根據(jù)檢測函數(shù)聲明插入位置集合declLocSet,在相應(yīng)位置插入檢測 函數(shù) long double check_zero(long double num, const char*fileName, unsigned line, unsigned column)的聲明;其中,參數(shù) num 代表除數(shù),參數(shù) fileName,line,column 分別代表運(yùn)算發(fā)生位置所在文件名,行號和列號;然后,將檢測函數(shù)聲明插入位置集合 declLocSet重置為空。
8. 根據(jù)權(quán)利要求7所述的源代碼中值計算錯誤的自動檢測和定位方法,其特征在于: 所述步驟S7中值溢出錯誤分析和源代碼變換計算的方法包括以下步驟: 步驟S71,遍歷編譯器生成的抽象語法樹,如果當(dāng)前節(jié)點(diǎn)s所在文件路徑不在工作目錄 下,或已經(jīng)存在于已處理文件列表中,則忽略該節(jié)點(diǎn),不進(jìn)行處理; 步驟S7101,如果當(dāng)前節(jié)點(diǎn)s為后自增表達(dá)式a7101++,則從符號表中獲取表達(dá)式a7101 的類型typeA7101 ;如果typeA7101為指針類型,則忽略節(jié)點(diǎn)s,不進(jìn)行處理,否則將表達(dá)式 "a7101++"替換為如下逗號表達(dá)式: (pOverflowTemp = &(a7101), check_overflow(*(typeA7101*)pOverflowTemp+(typeA7101)1, * (typeA7101*) pOverf lowTemp+ (long double) 1, fileNameS, lineS, columns), ((* (typeA7101*)pOverflowTemp))++) 其中pOverflowTemp為空類型指針,用來存儲表達(dá)式a7101的地址,check_overflow為 值溢出檢測函數(shù)名,fileNameS,lineS,columns分別為節(jié)點(diǎn)s所在文件名,行號和列號;然 后,從抽象語法樹中獲得節(jié)點(diǎn)s所在文件的開始位置locS,加入到檢測函數(shù)聲明插入位置 集合declLocSet,表示此文件需要值溢出檢測相關(guān)函數(shù)的聲明; 步驟S7102,如果當(dāng)前節(jié)點(diǎn)s為后自減表達(dá)式a7102-,則從符號表中獲取表達(dá)式a7102 的類型typeA7102 ;如果typeA7102為指針類型,則忽略節(jié)點(diǎn)s,不進(jìn)行處理,否則將表達(dá)式 "a7102-_"替換為如下逗號表達(dá)式: (pOverflowTemp = &(a7102), check_overflow(*(typeA7102*)pOverflowTemp-(typeA7102)1, * (typeA7102*) pOverflowTemp- (long double) 1,fileNameS, lineS, columns), ((*(typeA7102*)pOverflowTemp))-) 其中pOverflowTemp為空類型指針,用來存儲表達(dá)式a7102的地址,check_overflow為 值溢出檢測函數(shù)名,fileNameS,lineS,columns分別為節(jié)點(diǎn)s所在文件名,行號和列號;然 后,從抽象語法樹中獲得節(jié)點(diǎn)s所在文件的開始位置locS,加入到檢測函數(shù)聲明插入位置 集合declLocSet,表示此文件需要值溢出檢測相關(guān)函數(shù)的聲明; 步驟S7103,如果當(dāng)前節(jié)點(diǎn)s為前自增表達(dá)式++a7103,則從符號表中獲取表達(dá)式a7103 的類型typeA7103 ;如果typeA7103為指針類型,則忽略節(jié)點(diǎn)s,不進(jìn)行處理,否則將表達(dá)式 "++a7103"替換為如下逗號表達(dá)式: (pOverflowTemp = &(a7103), check_overflow(*(typeA7103*)pOverflowTemp+(typeA7103)1, * (typeA7103*) pOverf lowTemp+ (long double) 1, fileNameS, lineS, columns), (++(*(typeA7103*)pOverflowTemp))) 其中pOverflowTemp為空類型指針,用來存儲表達(dá)式a7103的地址,check_overflow為 值溢出檢測函數(shù)名,fileNameS,lineS,columns分別為節(jié)點(diǎn)s所在文件名,行號和列號;然 后,從抽象語法樹中獲得節(jié)點(diǎn)s所在文件的開始位置locS,加入到檢測函數(shù)聲明插入位置 集合declLocSet,表示此文件需要值溢出檢測相關(guān)函數(shù)的聲明; 步驟S7104,如果當(dāng)前節(jié)點(diǎn)s為前自減表達(dá)式一a7104,則從符號表中獲取表達(dá)式a7104 的類型typeA7104 ;如果typeA7104為指針類型,則忽略節(jié)點(diǎn)s,不進(jìn)行處理,否則將表達(dá)式 "--a7104"替換為如下逗號表達(dá)式: (pOverflowTemp = &(a7104), check_overflow(*(typeA7104*)pOverflowTemp-(typeA7104)1, * (typeA7104*) pOverflowTemp- (long double) 1, fileNameS, lineS, columns), (-(* (typeA7104*)pOverflowTemp))) 其中pOverf lowTemp為空類型指針,用來存儲表達(dá)式a7104的地址,check_overf low為 值溢出檢測函數(shù)名,fileNameS,lineS,columns分別為節(jié)點(diǎn)s所在文件名,行號和列號;然 后,從抽象語法樹中獲得節(jié)點(diǎn)s所在文件的開始位置locS,加入到檢測函數(shù)聲明插入位置 集合declLocSet,表示此文件需要值溢出檢測相關(guān)函數(shù)的聲明; 步驟S7105,如果當(dāng)前節(jié)點(diǎn)s為取負(fù)表達(dá)式-a7105,則從符號表中獲取表達(dá)式a7105的 類型typeA7105,將表達(dá)式"_a7105"替換為如下逗號表達(dá)式: (overflowTempl = (a7105), check-overflow (-(typeA7105)overflowTempl, -overflowTempl, fileNameS, lineS, columns), -(typeA7105) overf lowTempl) 其中overflowTempl為long double類型變量,用來記錄表達(dá)式a7105的值,check_ overflow為值溢出檢測函數(shù)名,fileNameS,lineS,columns分別為節(jié)點(diǎn)s所在文件名,行號 和列號;然后,從抽象語法樹中獲得節(jié)點(diǎn)s所在文件的開始位置locS,加入到檢測函數(shù)聲明 插入位置集合declLocSet,表示此文件需要值溢出檢測相關(guān)函數(shù)的聲明; 步驟S7106,如果當(dāng)前節(jié)點(diǎn)s為乘法表達(dá)式a7106*b7106,則從符號表中獲取表達(dá)式 a7106的類型typeA7106,b7106的類型typeB7106,將表達(dá)式"a7106補(bǔ)7106"替換為如下逗 號表達(dá)式: (overflowTempl = (a7106), overflowStackPush(overflowTempl), overflowTemp2 = (b7106), overflowTempl = overflowStackPop(), check-overflow ((typeA7106)overflowTempl*(typeB7106)overflowTemp2, overflowTempl^overflowTemp2, fileNameS, lineS, columns), (typeA7106)overflowTempl^(typeB7106)overflowTemp2) 其中overf lowTempl和overf lowTemp2為long double類型變量,分別用來記錄表達(dá) 式a7106和表達(dá)式b7106的值,overf lowStackPush和overf lowStackPop分別為棧結(jié)構(gòu)的 壓棧和出棧操作,check_overflow為值溢出檢測函數(shù)名,fileNameS,lineS,columns分別 為節(jié)點(diǎn)s所在文件名,行號和列號;然后,從抽象語法樹中獲得節(jié)點(diǎn)s所在文件的開始位置 locS,加入到檢測函數(shù)聲明插入位置集合declLocSet,表示此文件需要值溢出檢測相關(guān)函 數(shù)的聲明; 步驟S7107,如果當(dāng)前節(jié)點(diǎn)s為除法表達(dá)式a7107/b7107,則從符號表中獲取表達(dá)式 a7107的類型typeA7107,b7107的類型typeB7107,將表達(dá)式"a7107/b7107"替換為如下逗 號表達(dá)式: (overflowTempl = (a7107), overflowStackPush(overflowTempl), overflowTemp2 = (b7107), overflowTempl = overflowStackPop(), check-overflow ((typeA7107)overflowTempl/(typeB7107)overflowTemp2, overflowTempl/overflowTemp2, fileNameS, lineS, columns), (typeA7107) overflowTempl/(typeB7107)overflowTemp2) 其中overflowTempl和overflowTemp2為long double類型變量,分別用來記錄表達(dá) 式a7107和表達(dá)式b7107的值,overflowStackPush和overflowStackPop分別為棧結(jié)構(gòu)的 壓棧和出棧操作,check_overflow為值溢出檢測函數(shù)名,fileNameS,lineS,columns分別 為節(jié)點(diǎn)s所在文件名,行號和列號;然后,從抽象語法樹中獲得節(jié)點(diǎn)s所在文件的開始位置 locS,加入到檢測函數(shù)聲明插入位置集合declLocSet,表示此文件需要值溢出檢測相關(guān)函 數(shù)的聲明; 步驟S7108,如果當(dāng)前節(jié)點(diǎn)s為加法表達(dá)式a7108+b7108,則從符號表中獲取表達(dá)式 a7108 的類型 typeA7108,b7108 的類型 typeB7108 ;如果 typeA7108 或 typeB7108 為指針類 型,則忽略節(jié)點(diǎn)s,不進(jìn)行處理,否則將表達(dá)式"a7108+b7108"替換為如下逗號表達(dá)式: (overflowTempl = (a7108), overflowStackPush(overflowTempl), overflowTemp2 = (b7108), overflowTempl = overflowStackPop(), check_overflow ((typeA7108)overflowTempl+(typeB7108)overflowTemp2, overflowTempl+overflowTemp2, fileNameS, lineS, columns), (typeA7108)overflowTempl+(typeB7108)overflowTemp2) 其中overf lowTempl和overf lowTemp2為long double類型變量,分別用來記錄表達(dá) 式a7108和表達(dá)式b7108的值,overf lowStackPush和overf lowStackPop分別為棧結(jié)構(gòu)的 壓棧和出棧操作,check_overflow為值溢出檢測函數(shù)名,fileNameS,lineS,columns分別 為節(jié)點(diǎn)s所在文件名,行號和列號;然后,從抽象語法樹中獲得節(jié)點(diǎn)s所在文件的開始位置 locS,加入到檢測函數(shù)聲明插入位置集合declLocSet,表示此文件需要值溢出檢測相關(guān)函 數(shù)的聲明; 步驟S7109,如果當(dāng)前節(jié)點(diǎn)s為減法表達(dá)式a7109-b7109,則從符號表中獲取表達(dá)式 a7109 的類型 typeA7109,b7109 的類型 typeB7109 ;如果 typeA7109 或 typeB7109 為指針類 型,則忽略節(jié)點(diǎn)s,不進(jìn)行處理,否則將表達(dá)式"a7109-b7109"替換為如下逗號表達(dá)式: (overflowTempl = (a7109), overflowStackPush(overflowTempl), overflowTemp2 = (b7109), overflowTempl = overflowStackPop(), check_overflow ((typeA7109)overflowTempl-(typeB7109)overflowTemp2, overflowTempl-overflowTemp2, fileNameS, lineS, columns), (typeA7109)overflowTempl-(typeB7109)overflowTemp2) 其中overf lowTempl和overf lowTemp2為long double類型變量,分別用來記錄表達(dá) 式a7109和表達(dá)式b7109的值,overf lowStackPush和overf lowStackPop分別為棧結(jié)構(gòu)的 壓棧和出棧操作,check_overflow為值溢出檢測函數(shù)名,fileNameS,lineS,columns分別 為節(jié)點(diǎn)s所在文件名,行號和列號;然后,從抽象語法樹中獲得節(jié)點(diǎn)s所在文件的開始位置 locS,加入到檢測函數(shù)聲明插入位置集合declLocSet,表示此文件需要值溢出檢測相關(guān)函 數(shù)的聲明; 步驟S7110,如果當(dāng)前節(jié)點(diǎn)s為位左移表達(dá)式a7110〈〈b7110,則從符號表中獲取表達(dá)式 a7110的類型typeA7110, b7110的類型typeB7110,將表達(dá)式"a7110〈〈b7110"替換為如下 逗號表達(dá)式: (overflowTempl = (a7110), overflowStackPush(overflowTempl), overflowTemp2 = (b7110), overflowTempl = overflowStackPop(), check_overflow ((typeA7110)overflowTempl<<(typeB7110)overflowTemp2, (long long int)overflowTempl<<(long long int)overflowTemp2, fileNameS,lineS,columnS), (typeA7110)overflowTempl<<(typeB7110)overflowTemp2) 其中overf lowTempl和overf lowTemp2為long double類型變量,分別用來記錄表達(dá) 式a7110和表達(dá)式b7110的值,overflowStackPush和overflowStackPop分別為棧結(jié)構(gòu)的 壓棧和出棧操作,check_overflow為值溢出檢測函數(shù)名,fileNameS,lineS,columns分別 為節(jié)點(diǎn)s所在文件名,行號和列號;然后,從抽象語法樹中獲得節(jié)點(diǎn)s所在文件的開始位置 locS,加入到檢測函數(shù)聲明插入位置集合declLocSet,表示此文件需要值溢出檢測相關(guān)函 數(shù)的聲明; 步驟S7111,如果當(dāng)前節(jié)點(diǎn)s為位右移表達(dá)式a7111?b7111,則從符號表中獲取表達(dá)式 a7111的類型typeA7111,b7111的類型typeB7111,將表達(dá)式"a7111?b7111"替換為如下 逗號表達(dá)式: (overflowTempl = (a7111), overflowStackPush(overflowTempl), overflowTemp2 = (b7111), overflowTempl = overflowStackPop (), check_overflow ((typeA7111)overflowTempl>>(typeB7111)overflowTemp2, (long long int)overflowTempl>>(long long int)overflowTemp2, fileNameS,lineS,columnS), (typeA7111) overflowTempl>>(typeB7111)overflowTemp2) 其中overf lowTempl和overf lowTemp2為long double類型變量,分別用來記錄表達(dá) 式a7111和表達(dá)式b7111的值,overflowStackPush和overflowStackPop分別為棧結(jié)構(gòu)的 壓棧和出棧操作,check_overflow為值溢出檢測函數(shù)名,fileNameS,lineS,columns分別 為節(jié)點(diǎn)s所在文件名,行號和列號;然后,從抽象語法樹中獲得節(jié)點(diǎn)s所在文件的開始位置 locS,加入到檢測函數(shù)聲明插入位置集合declLocSet,表示此文件需要值溢出檢測相關(guān)函 數(shù)的聲明; 步驟S7112,如果當(dāng)前節(jié)點(diǎn)s為復(fù)合乘賦值表達(dá)式a7112* = b7112,則從符號表中獲取 表達(dá)式 a7112 的類型 typeA7112,b7112 的類型 typeB7112,將表達(dá)式 "a7112* = b7112" 替 換為如下逗號表達(dá)式: (pOverflowTemp = &(a7112), overflowStackPush((long)pOverflowTemp), overflowTempl = (b7112), pOverflowTemp = (void*) (long)overflowStackPop(), check-overflow ((typeA7112)((*(typeA7112*)pOverflowTemp)* (typeB7112)overflowTempl),(*(typeA7112*)pOverflowTemp)*overflowTempl, fileNameS,lineS,columnS), (*(typeA7112*)p0verflowTemp)* = (typeB7112)overflowTempl) 其中pOverf lowTemp為空類型指針,用來存儲表達(dá)式a7112的地址,overf lowTempl 為long double類型變量,用來記錄表達(dá)式b7112的值,overflowStackPush和 overflowStackPop分別為棧結(jié)構(gòu)的壓棧和出棧操作,check_overflow為值溢出檢測函數(shù) 名,fileNameS,lineS,columns分別為節(jié)點(diǎn)s所在文件名,行號和列號;然后,從抽象語法樹 中獲得節(jié)點(diǎn)s所在文件的開始位置locS,加入到檢測函數(shù)聲明插入位置集合declLocSet, 表示此文件需要值溢出檢測相關(guān)函數(shù)的聲明; 步驟S7113,如果當(dāng)前節(jié)點(diǎn)s為復(fù)合除賦值表達(dá)式a7113/= b7113,則從符號表中獲取 表達(dá)式 a7113 的類型 typeA7113, b7113 的類型 typeB7113,將表達(dá)式 "a7113/ = b7113" 替 換為如下逗號表達(dá)式: (pOverflowTemp = &(a7113), overflowStackPush((long)pOverflowTemp), overflowTempl = (b7113), pOverflowTemp = (void^) (long)overflowStackPop (), check-overflow ((typeA7113)((*(typeA7113*)pOverflowTemp)/ (typeB7113) overflowTempl), (typeATllS^)pOverflowTemp)/overflowTempl, fileNameS,lineS,columnS), (*(typeA7113*)p0verflowTemp)/ = (typeB7113)overflowTempl) 其中pOverf lowTemp為空類型指針,用來存儲表達(dá)式a7113的地址,overf lowTempl 為long double類型變量,用來記錄表達(dá)式b7113的值,overflowStackPush和 overflowStackPop分別為棧結(jié)構(gòu)的壓棧和出棧操作,check_overflow為值溢出檢測函數(shù) 名,fileNameS,lineS,columns分別為節(jié)點(diǎn)s所在文件名,行號和列號;然后,從抽象語法樹 中獲得節(jié)點(diǎn)s所在文件的開始位置locS,加入到檢測函數(shù)聲明插入位置集合declLocSet, 表示此文件需要值溢出檢測相關(guān)函數(shù)的聲明; 步驟S7114,如果當(dāng)前節(jié)點(diǎn)s為復(fù)合加賦值表達(dá)式a7114+= b7114,則從符號表中獲取 表達(dá)式 a7114 的類型 typeA7114,b7114 的類型 typeB7114 ;如果 typeA7114 或 typeB7114 為指針類型,則忽略節(jié)點(diǎn)s,不進(jìn)行處理,否則將表達(dá)式"a7114+ = b7114"替換為如下逗號 表達(dá)式: (pOverflowTemp = &(a7114), overflowStackPush((long)pOverflowTemp), overflowTempl = (b7114), pOverflowTemp = (void^) (long)overflowStackPop (), check-overflow ((typeA7114)((*(typeA7114*)pOverflowTemp) + (typeB7114)overflowTempl), (木(typeA7114*) pOverflowTemp) +overflowTempl,fileNameS,lineS,columns), (*(typeA7114*)p0verflowTemp)+ = (typeB7114)overflowTempl) 其中pOverflowTemp為空類型指針,用來存儲表達(dá)式a7114的地址,overflowTempl 為long double類型變量,用來記錄表達(dá)式b7114的值,overflowStackPush和 overflowStackPop分別為棧結(jié)構(gòu)的壓棧和出棧操作,check_overflow為值溢出檢測函數(shù) 名,fileNameS,lineS,columns分別為節(jié)點(diǎn)s所在文件名,行號和列號;然后,從抽象語法樹 中獲得節(jié)點(diǎn)s所在文件的開始位置locS,加入到檢測函數(shù)聲明插入位置集合declLocSet, 表示此文件需要值溢出檢測相關(guān)函數(shù)的聲明; 步驟S7115,如果當(dāng)前節(jié)點(diǎn)s為復(fù)合減賦值表達(dá)式a7115-= b7115,則從符號表中獲取 表達(dá)式 a7115 的類型 typeA7115, b7115 的類型 typeB7115 ;如果 typeA7115 或 typeB7115 為指針類型,則忽略節(jié)點(diǎn)s,不進(jìn)行處理,否則將表達(dá)式"a7115- = b7115"替換為如下逗號 表達(dá)式: (pOverflowTemp = &(a7115), overflowStackPush((long)pOverflowTemp), overflowTempl = (b7115), pOverflowTemp = (void^) (long)overflowStackPop (), check_overflow ((typeA7115)((^(typeA7115^)pOverflowTemp)-(typeB7115)overflowTempl), (* (typeA7115*) pOverflowTemp) -overflowTempl,fileNameS,lineS,columns), (^(typeATl15^)pOverflowTemp) - = (typeB7115) overflowTempl) 其中pOverflowTemp為空類型指針,用來存儲表達(dá)式a7115的地址,overflowTempl 為long double類型變量,用來記錄表達(dá)式b7115的值,overflowStackPush和 overflowStackPop分別為棧結(jié)構(gòu)的壓棧和出棧操作,check_overflow為值溢出檢測函數(shù) 名,fileNameS,lineS,columns分別為節(jié)點(diǎn)s所在文件名,行號和列號;然后,從抽象語法樹 中獲得節(jié)點(diǎn)s所在文件的開始位置locS,加入到檢測函數(shù)聲明插入位置集合declLocSet, 表示此文件需要值溢出檢測相關(guān)函數(shù)的聲明; 步驟S7116,如果當(dāng)前節(jié)點(diǎn)s為復(fù)合位左移賦值表達(dá)式a7116〈〈 = b7116,則從符號表 中獲取表達(dá)式a7116的類型typeA7116, b7116的類型typeB7116,將表達(dá)式"a7116〈〈= b7116"替換為如下逗號表達(dá)式: (pOverflowTemp = &(a7116), overflowStackPush((long)pOverflowTemp), overflowTempl = (b7116), pOverflowTemp = (void^) (long)overflowStackPop (), check-overflow ((typeA7116)((*(typeA7116*)pOverflowTemp)〈〈 (typeB7116)overflowTempl), (long long int) (^(typeA7116^)pOverflowTemp) 〈〈(long long int)overflowTempl, fileNameS, lineS, columns), (5^ (typeA7116^) pOverflowTemp) << = (typeB7116) overflowTempl) 其中pOverflowTemp為空類型指針,用來存儲表達(dá)式a7116的地址,overflowTempl 為long double類型變量,用來記錄表達(dá)式b7116的值,overflowStackPush和 overflowStackPop分別為棧結(jié)構(gòu)的壓棧和出棧操作,check_overflow為值溢出檢測函數(shù) 名,fileNameS,lineS,columns分別為節(jié)點(diǎn)s所在文件名,行號和列號;然后,從抽象語法樹 中獲得節(jié)點(diǎn)s所在文件的開始位置locS,加入到檢測函數(shù)聲明插入位置集合declLocSet, 表示此文件需要值溢出檢測相關(guān)函數(shù)的聲明; 步驟S7117,如果當(dāng)前節(jié)點(diǎn)s為復(fù)合位右移賦值表達(dá)式a7117>> = b7117,則從符號表 中獲取表達(dá)式a7117的類型typeA7117, b7117的類型typeB7117,將表達(dá)式"a7117>> = b7117"替換為如下逗號表達(dá)式: (pOverflowTemp = &(a7117), overflowStackPush((long)pOverflowTemp), overflowTempl = (b7117), pOverflowTemp = (void^) (long)overflowStackPop (), check-overflow ((typeA7117)((*(typeA7117*)pOverflowTemp)>> (typeB7117)overflowTempl), (long long int) (typeA7117^)pOverflowTemp)>> (long long int) overf lowTempl, fileNameS, lineS, columns), (5^ (typeA7117^) pOverf lowTemp) >> = (typeB7117) overflowTempl) 其中pOverf lowTemp為空類型指針,用來存儲表達(dá)式a7117的地址,overf lowTempl 為long double類型變量,用來記錄表達(dá)式b7117的值,overflowStackPush和 overflowStackPop分別為棧結(jié)構(gòu)的壓棧和出棧操作,check_overflow為值溢出檢測函數(shù) 名,fileNameS,lineS,columns分別為節(jié)點(diǎn)s所在文件名,行號和列號;然后,從抽象語法樹 中獲得節(jié)點(diǎn)s所在文件的開始位置locS,加入到檢測函數(shù)聲明插入位置集合declLocSet, 表示此文件需要值溢出檢測相關(guān)函數(shù)的聲明; 步驟S7118,如果當(dāng)前節(jié)點(diǎn)s為隱含轉(zhuǎn)換表達(dá)式(typeCast7118)a7118,其中 typeCast7118為隱含轉(zhuǎn)換類型,則從符號表中獲取表達(dá)式a7118的類型typeA7118 ;如果 typeA7118和typeCast7118相同,忽略節(jié)點(diǎn)s,不進(jìn)行處理,否則將表達(dá)式"(typeCast7118) a7118"替換為如下逗號表達(dá)式: (overflowTempl = (a7118), check_overflow ((typeCast7118)overflowTempl, overflowTempl,fileNameS,lineS,columnS), (typeCast7118)overflowTempl) 其中overflowTempl為long double類型變量,用來記錄表達(dá)式a7118的值,check_ overflow為值溢出檢測函數(shù)名,fileNameS,lineS,columns分別為節(jié)點(diǎn)s所在文件名,行號 和列號;然后,從抽象語法樹中獲得節(jié)點(diǎn)s所在文件的開始位置locS,加入到檢測函數(shù)聲明 插入位置集合declLocSet,表示此文件需要值溢出檢測相關(guān)函數(shù)的聲明; 步驟S72,對于包含主函數(shù)聲明的文件,在文件開始位置插入空類型指針 pOverflowTemp, long double 類型變量 overflowTempl 和 overflowTemp2,棧結(jié)構(gòu) struct OverflowStackNode,壓棧函數(shù) void overflowStackPush(long double num), 出棧函數(shù) long double overf lowStackPop (),清空棧函數(shù) void overf lowStackFree () 和值溢出檢測函數(shù) void check_overflow (long double numl,long double num2, const char 氺 fileName,unsigned line, unsigned column)的定義;其中,壓找函數(shù) overflowStackPush的參數(shù)num代表需要存儲的表達(dá)式值,檢測函數(shù)check_overflow的參 數(shù)numl和num2分別代表類型提升前表達(dá)式值和類型提升后表達(dá)式值,參數(shù)fileName,line, column分別代表運(yùn)算發(fā)生位置所在文件名,行號和列號;檢測函數(shù)check_overf low對參數(shù) numl和num2進(jìn)行比較:如果兩個參數(shù)值相同,說明未發(fā)生值溢出,不執(zhí)行任何動作;如果兩 個參數(shù)值不相同,則說明發(fā)生了值溢出,報告值溢出錯誤發(fā)生位置的文件名,行號和列號, 清空棧并結(jié)束程序運(yùn)行; 步驟S73,根據(jù)檢測函數(shù)聲明插入位置集合declLocSet,在相應(yīng)位置插入空類型指 針 pOverflowTemp,long double 類型變量 overflowTempl 和 overflowTemp2,棧結(jié)構(gòu) struct OverflowStackNode,壓棧函數(shù) void overflowStackPush(long double num), 出棧函數(shù) long double overflowStackPopO,清空棧函數(shù) void overflowStackFreeO 和值溢出檢測函數(shù) void check_overflow(long double numl, long double num2, const char*fileName, unsigned line, unsigned column)的聲明;其中,壓棧函數(shù) overflowStackPush的參數(shù)num代表需要存儲的表達(dá)式值,檢測函數(shù)check_overflow的參 數(shù)numl和num2分別代表類型提升前表達(dá)式值和類型提升后表達(dá)式值,參數(shù)fileName,line, column分別代表運(yùn)算發(fā)生位置所在文件名,行號和列號;然后,將檢測函數(shù)聲明插入位置 集合declLocSet重置為空。
9.根據(jù)權(quán)利要求8所述的源代碼中值計算錯誤的自動檢測和定位方法,其特征在于: 所述步驟S8中變量使用前未初始化錯誤分析和源代碼變換計算的方法包括以下步驟: 步驟S81,遍歷編譯器生成的抽象語法樹,如果當(dāng)前節(jié)點(diǎn)s所在文件路徑不在工作目錄 下,或已經(jīng)存在于已處理文件列表中,則忽略該節(jié)點(diǎn),不進(jìn)行處理; 步驟S8101,如果當(dāng)前節(jié)點(diǎn)s為聲明語句,則遍歷聲明語句中的每一個聲明a8101,并 通過抽象語法樹獲得聲明a8101的屬性;如果聲明a8101同時滿足如下條件:(1)為變量聲 明;(2)非全局變量聲明;(3)非函數(shù)參數(shù)聲明;(4)聲明沒有給出初始化表達(dá)式,貝1J將變量 聲明a8101綁定一個編號varlndex ;編號從1開始依次選取,所以varlndex也作為記錄變 量聲明總數(shù)的計數(shù)器; 步驟S8102,如果當(dāng)前節(jié)點(diǎn)s為變量聲明引用a8102,考察節(jié)點(diǎn)s在抽象語法樹中的父 節(jié)點(diǎn);如果s的父節(jié)點(diǎn)為隱含左值向右值轉(zhuǎn)換表達(dá)式,自增表達(dá)式或自減表達(dá)式,忽略節(jié)點(diǎn) s,不進(jìn)行處理,否則,表明節(jié)點(diǎn)s為對變量的賦值,利用步驟S8101得到的變量聲明和編號 的綁定關(guān)系,查詢得a8102所引用變量聲明對應(yīng)編號indexTemp8102,將表達(dá)式"a8102"替 換為如下逗號表達(dá)式: * (fileName_set_uninit (indexTemp8102),&(a8102)) 其中fileName為節(jié)點(diǎn)s所在文件名,并作為fileName_set_uninit的一部分構(gòu)成變量賦 值狀態(tài)設(shè)置函數(shù)名;然后,從抽象語法樹中獲得節(jié)點(diǎn)s所在文件的開始位置locS,加入到檢 測函數(shù)定義代碼插入位置集合defLocSet,表示此文件需要變量使用前未初始化檢測相關(guān) 函數(shù)的定義; 步驟S8103,如果當(dāng)前節(jié)點(diǎn)s為隱含轉(zhuǎn)換表達(dá)式(typeCast8103)a8103,考察該節(jié)點(diǎn):如 果typeCaSt8103不是左值向右值的轉(zhuǎn)換或a8103不是變量聲明引用,忽略節(jié)點(diǎn)s,不進(jìn)行處 理,否則,表明節(jié)點(diǎn)s為對變量值的引用,利用步驟S8101得到的變量聲明和編號的綁定關(guān) 系,查詢得a8103所引用變量聲明對應(yīng)編號indexTemp8103,將表達(dá)式"a8103"替換為如下 逗號表達(dá)式: (fileName_check_uninit (indexTemp8103, fileNameS, lineS, columns), a8103) 其中fileName為節(jié)點(diǎn)s所在文件名,并作為fileName_check_uninit的一部分構(gòu)成賦值 狀態(tài)檢測函數(shù)名,fileNameS,lineS,columns分別為節(jié)點(diǎn)s所在文件名,行號和列號;然后, 從抽象語法樹中獲得節(jié)點(diǎn)s所在文件的開始位置locS,加入到檢測函數(shù)定義代碼插入位置 集合defLocSet,表示此文件需要變量使用前未初始化檢測相關(guān)函數(shù)的定義; 步驟S8104,如果當(dāng)前節(jié)點(diǎn)s為自增或自減表達(dá)式++a8104, 一a8104, a8104++或 a8104-,考察該節(jié)點(diǎn):如果a8104不是變量聲明引用,忽略節(jié)點(diǎn)s,不進(jìn)行處理,否則,表 明節(jié)點(diǎn)s為對變量值的引用,利用步驟S8101得到的變量聲明和編號的綁定關(guān)系,查詢得 a8104所引用變量聲明對應(yīng)編號indexTemp8104,將表達(dá)式"a8104"替換為如下逗號表達(dá) 式: * (fileName_check_uninit (indexTemp8104, fileNameS, lineS, columns), &a8104)其中 fileName為節(jié)點(diǎn)s所在文件名,并作為fileName_check_uninit的一部分構(gòu)成賦值狀態(tài)檢 測函數(shù)名,fileNameS,lineS,columns分別為節(jié)點(diǎn)s所在文件名,行號和列號;然后,從抽象 語法樹中獲得節(jié)點(diǎn)s所在文件的開始位置locS,加入到檢測函數(shù)定義代碼插入位置集合 defLocSet,表示此文件需要變量使用前未初始化檢測相關(guān)函數(shù)的定義; 步驟S82,根據(jù)檢測函數(shù)定義代碼插入位置集合defLocSet,在相應(yīng)位置插入變量賦值 狀態(tài)數(shù)組fileName_varArray,賦值狀態(tài)設(shè)置函數(shù) void fileName_set_uninit (long index), 賦值狀態(tài)檢測函數(shù) void fileName_check_uninit (long index, char*fileName, unsigned line, unsigned column)的定義;其中,fileName為插入位置所在文件名,構(gòu)成數(shù)組名和函 數(shù)名的一部分;數(shù)組fileName_varArray的類型為_Bool,數(shù)組大小由步驟S8101的變量聲 明總數(shù)的計數(shù)器決定,數(shù)組元素初始值均為〇 ;函數(shù)fileName_set_uninit的參數(shù)index代 表變量聲明對應(yīng)的編號,函數(shù)fileName_check_uninit的參數(shù)index代表變量聲明對應(yīng)的編 號,參數(shù)fileName, line, column分別代表變量聲明引用位置所在文件名,行號和列號;函數(shù) fileName_set_uninit 將數(shù)組兀素 fileName_varArray[index]的值設(shè)置為 1,函數(shù) fileName_ check_uninit對數(shù)組元素 fileName_varArray[index]的值進(jìn)行檢查:如果為1,說明未發(fā)生 錯誤,不執(zhí)行任何動作;如果為〇,則說明發(fā)生了變量使用前未初始化錯誤,報告錯誤發(fā)生 位置的文件名,行號和列號,并結(jié)束程序運(yùn)行。
【文檔編號】G06F21/57GK104298594SQ201410499170
【公開日】2015年1月21日 申請日期:2014年9月25日 優(yōu)先權(quán)日:2014年9月25日
【發(fā)明者】陳哲, 朱云龍, 魏歐, 黃志球 申請人:南京航空航天大學(xué)
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點(diǎn)贊!
1