欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

程序設(shè)計(jì)中內(nèi)存操作錯(cuò)誤的識(shí)別方法

文檔序號(hào):6413818閱讀:349來(lái)源:國(guó)知局
專利名稱:程序設(shè)計(jì)中內(nèi)存操作錯(cuò)誤的識(shí)別方法
技術(shù)領(lǐng)域
本發(fā)明涉及計(jì)算機(jī)軟件測(cè)試技術(shù),具體涉及一種用于檢測(cè)程序設(shè)計(jì)中錯(cuò)誤內(nèi)存操作的軟件測(cè)試方法,更具體地說(shuō),涉及一種C/C++程序設(shè)計(jì)中內(nèi)存操作錯(cuò)誤的識(shí)別方法。
作為系統(tǒng)程序設(shè)計(jì)語(yǔ)言的C/C++是一種高度靈活的語(yǔ)言,也正是這種靈活性為程序的正確編寫帶來(lái)極大困難,貌似正確的程序常常因?yàn)殄e(cuò)誤的指針和數(shù)組操作而導(dǎo)致系統(tǒng)崩潰。國(guó)外已有類似的測(cè)試工具,如Purify、Visionsoft和Smartheap等,其功能各有側(cè)重。Visionsoft和smartheap在檢測(cè)錯(cuò)誤的內(nèi)存操作方面功能很弱,因?yàn)樗荒軐?duì)被測(cè)源程序進(jìn)行有效的插裝。上述測(cè)試工具Purify能檢測(cè)出不少的內(nèi)存錯(cuò)誤操作,但它有一個(gè)嚴(yán)重缺陷,即它沒(méi)有建立內(nèi)存塊和指針間的關(guān)聯(lián),它只能判斷指針的引用是否指向非法內(nèi)存,而不知道它是否已經(jīng)指向了另一塊合法內(nèi)存,這是一個(gè)嚴(yán)重錯(cuò)誤。例如,如圖所示,內(nèi)存塊1和內(nèi)存塊2是purify所登記的兩塊內(nèi)存,它們的首址和尺寸分別是(0X1000,4)、(0X1008,8)?,F(xiàn)在有一指針p,程序?qū)?nèi)存塊1的首址賦給了它,即p指向了內(nèi)存塊1,現(xiàn)在有一關(guān)于指針p的引用*(p+10),它已經(jīng)越出了內(nèi)存塊1而到了內(nèi)存塊2的內(nèi)部,由于purify認(rèn)為內(nèi)存塊2是一塊合法的內(nèi)存,它不會(huì)報(bào)告這個(gè)錯(cuò)誤。其根本原因在于purify沒(méi)有為指針和內(nèi)存塊建立關(guān)聯(lián),它不知道一個(gè)指針應(yīng)該指向哪一塊內(nèi)存。
本發(fā)明的目的是提出一種新的識(shí)別程序設(shè)計(jì)中內(nèi)存操作錯(cuò)誤的方法,它可以針對(duì)purify類軟件在指針越界檢查方面存在的上述弱點(diǎn),不僅能檢測(cè)purify類軟件所能檢測(cè)的所有錯(cuò)誤,還能準(zhǔn)確地判斷指針的引用是否越出了它所指向的內(nèi)存塊。對(duì)于上例中的指針越界錯(cuò),它能很容易地作出判斷。
本發(fā)明的目的是這樣實(shí)現(xiàn)的,構(gòu)造一種識(shí)別程序設(shè)計(jì)中內(nèi)存操作錯(cuò)誤的方法包括以下步驟由插裝程序?qū)Ρ粶y(cè)試源程序進(jìn)行分析插裝,對(duì)被插裝后被測(cè)源程序進(jìn)行編譯產(chǎn)生可執(zhí)行的被測(cè)程序,運(yùn)行該可執(zhí)行程序后產(chǎn)生錯(cuò)誤日志,最后由錯(cuò)誤信息瀏覽裝置對(duì)錯(cuò)誤日志信息進(jìn)行處理,其特征在于所述插裝程序是這樣對(duì)被測(cè)試源程序進(jìn)行分析插裝的所述對(duì)源程序進(jìn)行插裝的步驟是基于包含有指針句柄表和顏色表的插裝庫(kù)進(jìn)行的,所述指針句柄表為每個(gè)指針項(xiàng)記錄其指針標(biāo)示和內(nèi)存塊句柄,所述顏色表為每一個(gè)內(nèi)存塊項(xiàng)記錄內(nèi)存塊標(biāo)示、屬性和指向它的指針句柄,所述的對(duì)源程序進(jìn)行插裝的步驟包括打開(kāi)源程序文件并對(duì)每一語(yǔ)句進(jìn)行分析,分別作如下處理對(duì)語(yǔ)句中包含有動(dòng)態(tài)內(nèi)存、變量和字符串常量的內(nèi)存塊時(shí),插入登記內(nèi)存塊的語(yǔ)句;對(duì)分析中出現(xiàn)指針賦值語(yǔ)句時(shí),插入登記指針并建立與內(nèi)存塊間關(guān)系的語(yǔ)句;對(duì)分析中出現(xiàn)有數(shù)組和表達(dá)式語(yǔ)句時(shí),插入對(duì)數(shù)組及表達(dá)式進(jìn)行檢查的語(yǔ)句。
按照本發(fā)明提供的方法,其特征在于,所述插入登記內(nèi)存塊的語(yǔ)句包括對(duì)動(dòng)態(tài)內(nèi)存塊,接管動(dòng)態(tài)內(nèi)存分配函數(shù),在新的動(dòng)態(tài)內(nèi)存分配函數(shù)中首先調(diào)用系統(tǒng)提供的被替換前的分配函數(shù)來(lái)完成實(shí)際的內(nèi)存分配工作,然后調(diào)用插裝庫(kù)里的相應(yīng)函數(shù)來(lái)登記剛分配的動(dòng)態(tài)內(nèi)存;對(duì)字符串常量,用一函數(shù)將被測(cè)程序中所出現(xiàn)的字符串常量“包”起來(lái),在“包”它的函數(shù)中調(diào)用插裝庫(kù)中的相應(yīng)函數(shù)來(lái)登記這個(gè)字符串常量;對(duì)變量,記住每一個(gè)變量的定義,并且在之后的適當(dāng)位置插入登記這些變量的語(yǔ)句。
按照本發(fā)明提供的方法,其特征在于,所述插入登記指針并建立與內(nèi)存塊間關(guān)系的語(yǔ)句是指在所有找到的為指針賦值的表達(dá)式的后面,插入登記指針和建立聯(lián)系的語(yǔ)句,如果為指針賦值的表達(dá)式中“=”右表達(dá)式的最外層最終可歸結(jié)為一個(gè)指針經(jīng)過(guò)有限次的‘+’、‘-’運(yùn)算的結(jié)果,則將“=”左指針和找到的這個(gè)指針指向同一塊內(nèi)存;否則,用右表達(dá)式的值在顏色表中進(jìn)行匹配,如果它的值落在某一塊內(nèi)存之中,則認(rèn)為“=”之左指針指向這塊內(nèi)存,在不能區(qū)分以上兩種情況時(shí),按第二種情況處理。
按照本發(fā)明提供的方法,其特征在于,所述插入對(duì)數(shù)組及表達(dá)式進(jìn)行檢查的語(yǔ)句是指在每一個(gè)數(shù)組表達(dá)式和指針表達(dá)式前面,按由內(nèi)到外的順序逐層檢查,插入相應(yīng)代碼,以便可根據(jù)所述指針句柄表與顏色表,準(zhǔn)確地檢查出程序中指針越界和數(shù)組越界錯(cuò)誤操作。
實(shí)施本發(fā)明提供的程序設(shè)計(jì)中內(nèi)存操作錯(cuò)誤的識(shí)別方法,可以有效地檢測(cè)出諸如C/C++編程語(yǔ)言所編制程序中的如下一些錯(cuò)誤1)引用未初始化的指針;2)數(shù)組引用越界;3)指針引用越界;4)讀未初始化的動(dòng)態(tài)內(nèi)存;5)釋放無(wú)效的內(nèi)存塊;6)動(dòng)態(tài)內(nèi)存分配而未釋放(內(nèi)存泄漏)。本發(fā)明提供的識(shí)別方法并不局限于某一產(chǎn)品,也不受運(yùn)行平臺(tái)的限制,是一個(gè)通用的測(cè)試手段。利用本發(fā)明的方法,可以大大提高程序可靠性,改善測(cè)試效率和程序質(zhì)量,并可大大降低在軟件測(cè)試方面的開(kāi)銷。
結(jié)合附圖和實(shí)施例,進(jìn)一步說(shuō)明本發(fā)明的特點(diǎn),附圖中

圖1為用于說(shuō)明發(fā)生內(nèi)存操作錯(cuò)誤時(shí)的內(nèi)存組織示意圖;圖2是說(shuō)明本發(fā)明中指針句柄表與顏色表之間關(guān)系的示意圖;圖3是利用本發(fā)明的方法識(shí)別程序設(shè)計(jì)中內(nèi)存操作錯(cuò)誤的整體流程示意圖;圖4是利用本發(fā)明的方法進(jìn)行程序設(shè)計(jì)中內(nèi)存操作錯(cuò)誤識(shí)別的插裝程序的流程示意圖;圖5是利用本發(fā)明的方法對(duì)數(shù)組表達(dá)式進(jìn)行識(shí)別處理的流程示意圖;圖6是利用本發(fā)明的方法對(duì)指針表達(dá)式進(jìn)行識(shí)別處理的流程示意圖。
為進(jìn)一步說(shuō)明本發(fā)明的方法,將其中涉及的基本概念說(shuō)明如下1)插裝對(duì)于給定的源程序,按預(yù)定的規(guī)則插入代碼和改裝程序,這個(gè)過(guò)程叫插裝。由C/C++語(yǔ)言的特性決定了必須插裝被測(cè)源程序才能對(duì)它進(jìn)行比較完善和準(zhǔn)確地檢查。
2)插裝庫(kù)將同被測(cè)程序一起運(yùn)行的函數(shù)庫(kù),它提供了一系列的服務(wù),如登記內(nèi)存塊、登記指針、指針表達(dá)式檢查、數(shù)組表達(dá)式檢查等。這些服務(wù)都是以C函數(shù)的形式存在,通過(guò)調(diào)用這些函數(shù)來(lái)獲得服務(wù)。
3)插裝規(guī)范窮盡所有需要插裝的句型,制定相應(yīng)的插裝規(guī)則。這些規(guī)則的集合就是插裝規(guī)范。每條規(guī)則包括兩部分的內(nèi)容什么情況下需要這種插裝;插裝什么內(nèi)容。
4)插裝程序按給定插裝規(guī)范插裝被測(cè)源程序。它具體實(shí)現(xiàn)了插裝規(guī)范中的每條規(guī)則。
5)指針句柄表和顏色表用來(lái)明確每個(gè)指針?biāo)赶虻膬?nèi)存塊,以及一塊內(nèi)存為哪些指針?biāo)傅膬蓮埍?,它完整的描述了每一指針和?nèi)存塊間的關(guān)系。這兩張表的結(jié)構(gòu)已定義在插裝庫(kù)中,插裝庫(kù)還提供相應(yīng)的服務(wù)來(lái)操作這兩張表,插裝程序在需要的時(shí)候?qū)⒄{(diào)用這些服務(wù)的語(yǔ)句插入到被測(cè)源程序中,被測(cè)程序在運(yùn)行時(shí)根據(jù)這些語(yǔ)句動(dòng)態(tài)地維護(hù)這兩張表。
指針句柄表是指針項(xiàng)的集合,顏色表是內(nèi)存塊項(xiàng)的集合。如圖2所示,指針句柄表201中的每一項(xiàng)記錄每一個(gè)指針的信息,包含有它所指向的內(nèi)存塊在顏色表中的句柄,上例中指針項(xiàng)1、2、n中的內(nèi)存塊句柄分別為1、1、2。
顏色表202記錄每一合法內(nèi)存塊(動(dòng)態(tài)內(nèi)存、變量、字符串常量)信息,其中包含有指向它的指針在指針句柄表中的句柄,上例中,內(nèi)存塊項(xiàng)1、2、n中存儲(chǔ)的指向它的指針的句柄分別為{1,2}、{n}、Φ。
內(nèi)存塊退出作用域時(shí),將在顏色表中找到它所對(duì)應(yīng)的內(nèi)存塊項(xiàng),由其所記錄的指向它的指針的句柄,在指針句柄表中找到對(duì)應(yīng)的指針項(xiàng),將這些指針項(xiàng)中的內(nèi)存塊句柄置空。
指針標(biāo)示是一個(gè)地址,即指針?biāo)诘牡刂?,?duì)一個(gè)給定的指針pointer,它的標(biāo)示為&pointer;內(nèi)存塊標(biāo)示也是一個(gè)地址,是這塊內(nèi)存的首址。上例中我們只是簡(jiǎn)單的取標(biāo)示為1,2,......等。
圖3示出了利用本發(fā)明的方法識(shí)別程序設(shè)計(jì)中內(nèi)存操作錯(cuò)誤的整體流程示意圖。如圖所示,先在方框302中對(duì)被測(cè)源程序301進(jìn)行分析并按預(yù)定的規(guī)則進(jìn)行插裝,將經(jīng)過(guò)插裝的源程序303在框304由用戶提供的編譯程序進(jìn)行編譯,形成可執(zhí)行的被測(cè)程序305,并在框306中對(duì)可執(zhí)行的被測(cè)程序305進(jìn)行執(zhí)行,在執(zhí)行過(guò)程中,產(chǎn)生錯(cuò)誤日志(框307),最后在框308中調(diào)用錯(cuò)誤信息瀏覽器瀏覽錯(cuò)誤。由于被測(cè)源程序(框301)已插入了利用本發(fā)明方法提供的代碼,并按要求進(jìn)行了改裝(框302),所以能夠動(dòng)態(tài)地跟蹤檢測(cè)并瀏覽到原被測(cè)程序中存在的內(nèi)存操作錯(cuò)誤。
如前所述,本發(fā)明的關(guān)鍵在于通過(guò)插裝代碼,能夠動(dòng)態(tài)地跟蹤被測(cè)程序,以檢查程序錯(cuò)誤。因此插入的內(nèi)容(稱之為插裝庫(kù))和插裝規(guī)范將在實(shí)施本發(fā)明的方法中顯得尤為重要,也是本發(fā)明方法區(qū)別于和優(yōu)于現(xiàn)有技術(shù)的關(guān)鍵之所在。
只有將調(diào)用插裝庫(kù)的語(yǔ)句正確插入被測(cè)程序,插裝庫(kù)才有價(jià)值,插裝規(guī)范決定了插裝庫(kù)的內(nèi)容,插裝規(guī)范是整個(gè)方法及其實(shí)施的核心。插裝程序嚴(yán)格按照插裝規(guī)范分析并插裝被測(cè)程序,它所插入的內(nèi)容是調(diào)用插裝庫(kù)所提供的服務(wù)的語(yǔ)句。插入的語(yǔ)句在被測(cè)程序運(yùn)行時(shí)會(huì)完成這樣兩大部分的工作維持指針句柄表和顏色表以及它們之間的關(guān)系;對(duì)指針表達(dá)式和數(shù)組表達(dá)式進(jìn)行檢查。圖4示出了利用本發(fā)明的方法進(jìn)行程序設(shè)計(jì)中內(nèi)存操作錯(cuò)誤識(shí)別的插裝程序的流程。如圖4所示,在進(jìn)行的準(zhǔn)備操作401后,在框402打開(kāi)被測(cè)源程序文件,在判定框403中判定是否文件結(jié)束,如是文件結(jié)束,則轉(zhuǎn)到結(jié)束框409,如不是文件結(jié)束,則在框404中從被測(cè)源程序中讀一語(yǔ)句到緩沖區(qū)S,再在分析框405中對(duì)S中內(nèi)容進(jìn)行分析,并分別不同情況進(jìn)行相應(yīng)處理,如分析出是動(dòng)態(tài)內(nèi)存、變量和字符串常量,則在框406中進(jìn)行插入登記內(nèi)存塊的語(yǔ)句的操作;如分析出程序中出現(xiàn)指針賦值語(yǔ)句,則在框407中進(jìn)行插入登記指針并建立與內(nèi)存塊間關(guān)系的語(yǔ)句的操作;如分析出語(yǔ)句中包含數(shù)組表達(dá)式或指針表達(dá)式語(yǔ)句,則在框408中插入對(duì)數(shù)組和指針表達(dá)式進(jìn)行檢查的語(yǔ)句;在完成框406、407和408中的操作后,重新轉(zhuǎn)到框403進(jìn)行是否為文件結(jié)束的判定,如此循環(huán),直到讀到文件結(jié)束,程序終止于框409。
下面結(jié)合圖4中的三個(gè)主要處理過(guò)程插入登記內(nèi)存塊的語(yǔ)句(框406),插入登記指針并建立它與內(nèi)存塊間關(guān)系的語(yǔ)句(框407);插入對(duì)數(shù)組和指針表達(dá)式進(jìn)行檢查的語(yǔ)句(框408),進(jìn)一步說(shuō)明本發(fā)明的方法中所采用的插裝規(guī)范。<1>插入登記內(nèi)存塊的語(yǔ)句此處只考慮登記這樣幾類內(nèi)存塊動(dòng)態(tài)內(nèi)存、變量和字符串常量。分別描述如下動(dòng)態(tài)內(nèi)存塊的登記規(guī)范接管動(dòng)態(tài)內(nèi)存分配函數(shù),在新的動(dòng)態(tài)內(nèi)存分配函數(shù)中首先調(diào)用系統(tǒng)提供的被替換前的分配函數(shù)來(lái)完成實(shí)際的內(nèi)存分配工作,然后調(diào)用插裝庫(kù)里的相應(yīng)函數(shù)來(lái)登記剛分配的動(dòng)態(tài)內(nèi)存。
字符串常量登記規(guī)范用一函數(shù)將被測(cè)程序中所出現(xiàn)的字符串常量“包”起來(lái),在“包”它的函數(shù)中調(diào)用插裝庫(kù)中的相應(yīng)函數(shù)來(lái)登記這個(gè)字符串常量。
變量登記規(guī)范記住每一個(gè)變量的定義,并且在之后的適當(dāng)位置插入登記這些變量的語(yǔ)句。適當(dāng)?shù)奈恢檬颈粶y(cè)程序是C還是C++而定,對(duì)于C程序,將在這塊語(yǔ)句中所有變量定義之后和第一條非變量定義語(yǔ)句之前插入登記這些變量的代碼;對(duì)于C++程序,可以在緊跟著變量的定義之后插入代碼來(lái)登記這些變量。<2>插入登記指針并建立它與內(nèi)存塊間關(guān)系的語(yǔ)句本發(fā)明的方法只有在分析出程序包含有指針賦值語(yǔ)句時(shí)才登記該指針,登記指針的同時(shí)也就把顏色表中的某些內(nèi)存塊和這個(gè)指針聯(lián)系起來(lái)了。具體地,將找到所有的為指針賦值的表達(dá)式,在之后插入登記指針和建立聯(lián)系的語(yǔ)句。
在為指針和內(nèi)存塊建立聯(lián)系時(shí),我們采取了這樣一種策略。即找到每一為指針賦值的表達(dá)式,根據(jù)“=”右表達(dá)式的結(jié)構(gòu),將其區(qū)分為兩種情況,分別作不同的處理。如果右表達(dá)式的最外層最終可歸結(jié)為一個(gè)指針經(jīng)過(guò)有限次的‘+’、‘-’運(yùn)算的結(jié)果,我們將認(rèn)為“=”左指針和找到的這個(gè)指針指向同一塊內(nèi)存。否則,我們將用右表達(dá)式的值在顏色表中進(jìn)行匹配,如果它的值落在某一塊內(nèi)存之中,則認(rèn)為“=”之左指針指向這塊內(nèi)存。在不能區(qū)分以上兩種情況時(shí),我們將按第二種情況處理。<3>插入對(duì)數(shù)組和指針表達(dá)式進(jìn)行檢查的語(yǔ)句指針表達(dá)式和數(shù)組表達(dá)式總可表達(dá)為這樣兩種形式p[exprl][expr2]…[exprn]及*(…*(*(p+expr1)+expr2)+exprn)。其中expr1,expr2,…exprn又可能是指針表達(dá)式或數(shù)組表達(dá)式,這是嵌套的表示。
本發(fā)明的方法對(duì)于被測(cè)程序中出現(xiàn)的每一個(gè)數(shù)組表達(dá)式和指針表達(dá)式,都將在它的前面,按由內(nèi)到外的順序,插入相應(yīng)代碼,一層一層的檢查。
一旦插裝程序?qū)⑾鄳?yīng)的檢測(cè)語(yǔ)句插入到被測(cè)程序中,當(dāng)被測(cè)程序運(yùn)行時(shí),這些語(yǔ)句將根據(jù)指針句柄表與顏色表,準(zhǔn)確地檢查出程序中錯(cuò)誤的內(nèi)存操作,錯(cuò)誤的內(nèi)存操主要包括指針越界和數(shù)組越界。
下面討論插入的這些語(yǔ)句是如何對(duì)數(shù)組表達(dá)式和指針表達(dá)式進(jìn)行檢查的。
圖5示出了對(duì)數(shù)組表達(dá)式進(jìn)行識(shí)別處理的具體流程。對(duì)數(shù)組表達(dá)式檢查是這樣進(jìn)行的,如圖5所示,插裝庫(kù)在收到對(duì)數(shù)組表達(dá)式進(jìn)行檢查的請(qǐng)求后,首先在框501中進(jìn)行準(zhǔn)備,在框502中進(jìn)行id和addr的賦值,在框503把數(shù)組的地址作為關(guān)鍵字在顏色表中進(jìn)行查找,在框504中進(jìn)行判定,如找到內(nèi)存塊,則進(jìn)到框505,根據(jù)內(nèi)存塊屬性(首址、尺寸)在框506中判斷判斷這個(gè)數(shù)組引用addr是否越界,如越界就在框507記錄錯(cuò)誤信息,如沒(méi)有越界,則進(jìn)到結(jié)束框508。
圖6示出了對(duì)指針表達(dá)式進(jìn)行識(shí)別處理的流程。如圖6所示,插裝庫(kù)在收到對(duì)指針表達(dá)式進(jìn)行檢查的請(qǐng)求后,從開(kāi)始框601開(kāi)始,在框602中對(duì)id和addr進(jìn)行賦值,然后在框603中,把指針地址id作為關(guān)鍵字,在指針句柄表中查找其對(duì)應(yīng)項(xiàng)pointer,在框604中判定是否找到,如未找到,則進(jìn)到框609,記錄錯(cuò)誤信息;如已找到,則在框605中,以框603中找到的poniter作為內(nèi)存塊句柄,查找顏色表中對(duì)應(yīng)的內(nèi)存塊項(xiàng)mem,在框606中,如未找到內(nèi)存開(kāi)項(xiàng),則進(jìn)到框609,記錄錯(cuò)誤信息;如已找到,則在框607,根據(jù)此內(nèi)存塊項(xiàng)中存儲(chǔ)的內(nèi)存塊屬性(首址、尺寸等)來(lái)判斷這個(gè)指針表達(dá)式是否越界,如在框608中判定是發(fā)生越界,則進(jìn)到框609,記錄錯(cuò)誤信息;如未發(fā)生越界,則進(jìn)到結(jié)束框610,在框609記錄完錯(cuò)誤信息后,也轉(zhuǎn)到結(jié)束框610。<4>其它規(guī)范對(duì)于特定的句型,如while、do-while、for、switch等語(yǔ)句,插裝規(guī)范將對(duì)它進(jìn)行改裝,以滿足我們上述登記和檢查的需要。
作為附帶工作,可以插入代碼完成諸如讀未初始化的動(dòng)態(tài)內(nèi)存、釋放無(wú)效的內(nèi)存塊、動(dòng)態(tài)內(nèi)存分配而未釋放等檢查。
最后介紹本發(fā)明方法的一個(gè)具體的實(shí)施案例利用本發(fā)明的方法構(gòu)造的測(cè)試工具Clearify是一個(gè)與產(chǎn)品和運(yùn)行平臺(tái)無(wú)關(guān)的測(cè)試工具,只要求所在平臺(tái)提供標(biāo)準(zhǔn)C/C++編譯器即可。利用該測(cè)試工具Clearify我們對(duì)一個(gè)用C/C++編程的大型交換機(jī)軟件進(jìn)行的內(nèi)存操作錯(cuò)誤的識(shí)別,其使用方法如下將被測(cè)軟件(或模塊)的makefile文件中的宏CC更改為CC=clearify hc386 hc386,執(zhí)行命令make編譯被測(cè)軟件,將得到的可執(zhí)行程序輸入到主機(jī)或仿真環(huán)境中,運(yùn)行,最后調(diào)用Clearify提供的錯(cuò)誤信息瀏覽器定位錯(cuò)誤。通常,在C/C++程序中,內(nèi)存操作錯(cuò)誤在所有可能的錯(cuò)誤中占有最大比重,尤其是對(duì)于數(shù)十萬(wàn)行的大型軟件。一個(gè)可以預(yù)見(jiàn)的效果是交換機(jī)將因此而運(yùn)行得更加穩(wěn)定,至少我們可以排除這種錯(cuò)誤。
權(quán)利要求
1.一種識(shí)別程序設(shè)計(jì)中內(nèi)存操作錯(cuò)誤的方法,包括以下步驟對(duì)源程序進(jìn)行插裝,編譯并運(yùn)行插裝后的程序,從運(yùn)行產(chǎn)生的錯(cuò)誤日志取得出錯(cuò)信息,其特征在于所述對(duì)源程序進(jìn)行插裝的步驟是基于包含有指針句柄表和顏色表的插裝庫(kù)進(jìn)行的,所述指針句柄表為每個(gè)指針項(xiàng)記錄其指針標(biāo)示和內(nèi)存塊句柄,所述顏色表為每一個(gè)內(nèi)存塊項(xiàng)記錄內(nèi)存塊標(biāo)示、屬性和指向它的指針句柄,所述的對(duì)源程序進(jìn)行插裝的步驟包括打開(kāi)源程序文件并對(duì)每一語(yǔ)句進(jìn)行分析,分別作如下處理對(duì)語(yǔ)句中包含有動(dòng)態(tài)內(nèi)存、變量和字符串常量的內(nèi)存塊時(shí),插入登記內(nèi)存塊的語(yǔ)句;對(duì)分析中出現(xiàn)指針賦值語(yǔ)句時(shí),插入登記指針并建立與內(nèi)存塊間關(guān)系的語(yǔ)句;對(duì)分析中出現(xiàn)有數(shù)組和表達(dá)式語(yǔ)句時(shí),插入對(duì)數(shù)組及表達(dá)式進(jìn)行檢查的語(yǔ)句。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述插入登記內(nèi)存塊的語(yǔ)句包括對(duì)動(dòng)態(tài)內(nèi)存塊,接管動(dòng)態(tài)內(nèi)存分配函數(shù),在新的動(dòng)態(tài)內(nèi)存分配函數(shù)中首先調(diào)用系統(tǒng)提供的被替換前的分配函數(shù)來(lái)完成實(shí)際的內(nèi)存分配工作,然后調(diào)用插裝庫(kù)里的相應(yīng)函數(shù)來(lái)登記剛分配的動(dòng)態(tài)內(nèi)存;對(duì)字符串常量,用一函數(shù)將被測(cè)程序中所出現(xiàn)的字符串常量“包”起來(lái),在“包”它的函數(shù)中調(diào)用插裝庫(kù)中的相應(yīng)函數(shù)來(lái)登記這個(gè)字符串常量;對(duì)變量,記住每一個(gè)變量的定義,并且在之后的適當(dāng)位置插入登記這些變量的語(yǔ)句。
3.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述插入登記指針并建立與內(nèi)存塊間關(guān)系的語(yǔ)句是指在所有找到的為指針賦值的表達(dá)式的后面,插入登記指針和建立聯(lián)系的語(yǔ)句,如果為指針賦值的表達(dá)式中“=”右表達(dá)式的最外層最終可歸結(jié)為一個(gè)指針經(jīng)過(guò)有限次的‘+’、‘-’運(yùn)算的結(jié)果,則將“=”左指針和找到的這個(gè)指針指向同一塊內(nèi)存;否則,用右表達(dá)式的值在顏色表中進(jìn)行匹配,如果它的值落在某一塊內(nèi)存之中,則認(rèn)為“=”之左指針指向這塊內(nèi)存,在不能區(qū)分以上兩種情況時(shí),按第二種情況處理。
4.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述插入對(duì)數(shù)組及表達(dá)式進(jìn)行檢查的語(yǔ)句是指在每一個(gè)數(shù)組表達(dá)式和指針表達(dá)式前面,按由內(nèi)到外的順序逐層檢查,插入相應(yīng)代碼,以便可根據(jù)所述指針句柄表與顏色表,準(zhǔn)確地檢查出程序中指針越界和數(shù)組越界錯(cuò)誤操作。
全文摘要
一種識(shí)別程序設(shè)計(jì)中內(nèi)存操作錯(cuò)誤的方法,對(duì)源程序的插裝是基于包含有指針句柄表和顏色表的插裝庫(kù)進(jìn)行的,對(duì)語(yǔ)句中包含有動(dòng)態(tài)內(nèi)存、變量和字符串常量的內(nèi)存塊時(shí),插入登記內(nèi)存塊的語(yǔ)句;對(duì)指針賦值語(yǔ)句,插入登記指針并建立與內(nèi)存塊間關(guān)系的語(yǔ)句;對(duì)數(shù)組和表達(dá)式語(yǔ)句,插入對(duì)數(shù)組及表達(dá)式進(jìn)行檢查的語(yǔ)句。利用該方法可有效地檢測(cè)出內(nèi)存操作有關(guān)的編程錯(cuò)誤,提高測(cè)試效率和程序質(zhì)量,降低測(cè)試方面的費(fèi)用開(kāi)銷。
文檔編號(hào)G06F11/00GK1188933SQ98104528
公開(kāi)日1998年7月29日 申請(qǐng)日期1998年2月6日 優(yōu)先權(quán)日1998年2月6日
發(fā)明者陳青, 劉運(yùn)渠, 肖華熙, 龍晶 申請(qǐng)人:深圳市華為技術(shù)有限公司
網(wǎng)友詢問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
郯城县| 镇巴县| 永济市| 遵义县| 商南县| 合江县| 冷水江市| 两当县| 梓潼县| 辰溪县| 白城市| 普安县| 固镇县| 武清区| 锦州市| 莒南县| 柳江县| 色达县| 乌海市| 新巴尔虎左旗| 卢湾区| 遵义县| 嘉鱼县| 浠水县| 道真| 顺义区| 吉林省| 牙克石市| 澄江县| 乐昌市| 桓台县| 盱眙县| 河曲县| 莱西市| 肃北| 临夏市| 泗水县| 乌拉特中旗| 濮阳市| 宁化县| 新平|