一種程序中指針別名分析方法
【專利摘要】本發(fā)明公開了一種程序中指針別名分析方法,應(yīng)用于程序分析領(lǐng)域。所述方法包括:在程序運(yùn)行過程中維護(hù)一個(gè)存儲(chǔ)程序中所有指針指向信息的全局?jǐn)?shù)據(jù)結(jié)構(gòu);當(dāng)指針被聲明時(shí),在所述全局?jǐn)?shù)據(jù)結(jié)構(gòu)中添加一條新記錄;當(dāng)指針被賦值引用時(shí),根據(jù)賦值表達(dá)式的右值及其對應(yīng)內(nèi)存地址空間類型來動(dòng)態(tài)更新所述全局?jǐn)?shù)據(jù)結(jié)構(gòu)中相應(yīng)記錄;在程序運(yùn)行結(jié)束前或結(jié)束時(shí),輸出指定位置指定指針或所有指針的別名關(guān)系。本發(fā)明提出的方法能夠提供程序運(yùn)行過程中任意位置的指針別名關(guān)系,適用于過程內(nèi)或過程間的指向堆或棧上變量的指針別名分析。
【專利說明】
一種程序中指針別名分析方法
技術(shù)領(lǐng)域
[0001]本發(fā)明屬于程序分析領(lǐng)域,特別涉及一種程序中指針別名分析的方法。
【背景技術(shù)】
[0002]隨著計(jì)算機(jī)技術(shù)不斷提高和待解決問題的益加復(fù)雜,計(jì)算機(jī)軟件的規(guī)模越來越龐大,程序結(jié)構(gòu)也變得越來越復(fù)雜,這對于軟件開發(fā)和維護(hù)工作帶來了更大的挑戰(zhàn)。為了讓程序開發(fā)人員更快地理解自己或他人所開發(fā)的軟件,以便實(shí)現(xiàn)對現(xiàn)有軟件優(yōu)化、調(diào)試,或?qū)z留軟件進(jìn)行擴(kuò)展、維護(hù)工作,需要對程序源代碼進(jìn)行必要的分析。程序分析涉及程序多方面的特征,而且由于指針數(shù)據(jù)類型在C/C++程序中的廣泛使用,導(dǎo)致程序的并行性分析和優(yōu)化工作變得更復(fù)雜。若預(yù)先不對指針變量的指向目標(biāo)進(jìn)行分析而采取保守的估計(jì),會(huì)嚴(yán)重影響所獲取程序信息的準(zhǔn)確性,從而導(dǎo)致后續(xù)的程序調(diào)試、優(yōu)化或維護(hù)工作無法順利開展。因此,需要對程序中所有指針的指向信息進(jìn)行分析。
[0003]C/C++程序中,可以借助于指針、引用、聯(lián)合體、形參、數(shù)組等使得不同的變量指向同一塊內(nèi)存地址空間。另外,函數(shù)調(diào)用的存在會(huì)導(dǎo)致指針指向信息在調(diào)用函數(shù)和被調(diào)用函數(shù)之間傳播和修改。因此,有必要對C/C++程序的指針別名關(guān)系進(jìn)行分析,而且不僅要進(jìn)行過程內(nèi)的指針別名分析,還需要對跨過程的指針指向信息進(jìn)行分析統(tǒng)計(jì),即進(jìn)行過程間指針別名分析?,F(xiàn)有過程間指針別名分析方法,按照所求取信息的準(zhǔn)確程度可分為上下文敏感的分析方法和上下文不敏感的方法。前者依據(jù)同一函數(shù)不同調(diào)用點(diǎn)指針指向模式的不同而產(chǎn)生不同的分析結(jié)果,而后者則對同一函數(shù)的不同調(diào)用只產(chǎn)生一個(gè)唯一的近似結(jié)果。毫無疑問,相比而言,進(jìn)行上下文敏感的過程間指針別名分析所取得的結(jié)果將會(huì)比較精確。本發(fā)明提出的一種指針別名分析方法便是一種既可用于過程內(nèi)指針別名分析,也可用于過程間指針別名分析的方法。
【發(fā)明內(nèi)容】
[0004]本發(fā)明的技術(shù)解決問題:克服現(xiàn)有技術(shù)的不足,提供一種程序中指針別名分析方法,能夠給出程序運(yùn)行過程中任意位置的指針別名關(guān)系,適用于指向堆和棧上變量的指針別名分析,也適用于過程內(nèi)和過程間指針別名關(guān)系的分析。
[0005]本發(fā)明提供了一種程序中指針別名分析方法,所述方法包括:
[0006]在程序運(yùn)行過程中維護(hù)一個(gè)全局?jǐn)?shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)程序中所有指針的指向信息。其中,所述全局?jǐn)?shù)據(jù)結(jié)構(gòu)是一個(gè)滿足哈希函數(shù)關(guān)系f(x)的數(shù)據(jù)結(jié)構(gòu)。在所述哈希函數(shù)關(guān)系f(x)中,輸入?yún)?shù)X標(biāo)識(shí)了指針指向的內(nèi)存塊的全局唯一編號(hào),所述哈希函數(shù)關(guān)系f(x)的輸出結(jié)果是所述全局?jǐn)?shù)據(jù)結(jié)構(gòu)中存儲(chǔ)指針指向信息的地址,所述哈希函數(shù)關(guān)系f(x)指明了所述全局唯一編號(hào)與存儲(chǔ)程序中所有指針的指向信息的數(shù)據(jù)結(jié)構(gòu)的映射關(guān)系。
[0007]當(dāng)指針被聲明時(shí),在所述指針指向表中添加一條新記錄。其中,所述記錄中包括指針名稱,指針指向內(nèi)存塊類型,指針指向內(nèi)存塊的唯一編號(hào)。
[0008]當(dāng)指針被賦值引用時(shí),根據(jù)賦值表達(dá)式的右值及其對應(yīng)內(nèi)存地址空間類型來動(dòng)態(tài)更新所述指針指向表中相應(yīng)記錄。其中,所述賦值表達(dá)式的右值對應(yīng)的內(nèi)存地址空間類型包括棧和堆兩類。
[0009]在程序運(yùn)行結(jié)束前或結(jié)束時(shí),輸出指定位置指定指針或所有指針的別名關(guān)系。其中,指針別名關(guān)系需要通過所述哈希函數(shù)關(guān)系f(x)計(jì)算得到,得到的指針別名關(guān)系是一個(gè)指針集合,所述指針集合表示的是同一時(shí)刻同時(shí)指向編號(hào)為X的內(nèi)存塊的指針集合。
[0010]本發(fā)明對應(yīng)的技術(shù)方案包括如下步驟:
[0011]步驟一,在程序運(yùn)行過程中維護(hù)一個(gè)全局?jǐn)?shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)程序中所有指針的指向信息。
[0012]所述全局?jǐn)?shù)據(jù)結(jié)構(gòu)是一個(gè)滿足哈希函數(shù)關(guān)系f(x)的數(shù)據(jù)結(jié)構(gòu),其中X是標(biāo)識(shí)指針指向的內(nèi)存塊的全局唯一編號(hào),哈希函數(shù)關(guān)系f(x)的輸出結(jié)果是所述全局?jǐn)?shù)據(jù)結(jié)構(gòu)中存儲(chǔ)指針指向信息的地址,所述哈希函數(shù)關(guān)系f(x)指明了所述全局唯一編號(hào)與存儲(chǔ)程序中所有指針的指向信息的數(shù)據(jù)結(jié)構(gòu)的映射關(guān)系;所述全局?jǐn)?shù)據(jù)結(jié)構(gòu)中存儲(chǔ)了程序運(yùn)行過程中所有已聲明指針的指向信息。
[0013]步驟二,指針在聲明時(shí),在所述全局?jǐn)?shù)據(jù)結(jié)構(gòu)中添加一條新紀(jì)錄。
[0014]所述記錄中包括指針名稱,指針指向內(nèi)存塊類型和指針指向內(nèi)存塊的唯一編號(hào)。
[0015]步驟三,指針被賦值引用時(shí),根據(jù)賦值表達(dá)式的右值及其對應(yīng)內(nèi)存地址空間類型來動(dòng)態(tài)更新所述全局?jǐn)?shù)據(jù)結(jié)構(gòu)中相應(yīng)記錄。
[0016]步驟四:不論程序運(yùn)行結(jié)束與否,均可以在事先指定位置,輸出指定指針或當(dāng)前時(shí)刻所有指針的別名關(guān)系,以滿足程序分析的需要。
[0017]這里的獲得的指針別名關(guān)系需要通過哈希函數(shù)關(guān)系f(x)計(jì)算得到,得到的指針別名關(guān)系是一個(gè)指針集合,所述指針集合表示的是同一時(shí)刻同時(shí)指向編號(hào)為X的內(nèi)存塊的指針集合。
[0018]本發(fā)明與現(xiàn)有技術(shù)相比優(yōu)點(diǎn)在于:
[0019](I)本發(fā)明能夠在程序運(yùn)行過程中,給出任意位置的任意指針當(dāng)前時(shí)刻與其他指針的別名關(guān)系。
[0020](2)本發(fā)明不僅能夠分析出指向堆內(nèi)存地址空間的指針的別名關(guān)系,也能夠分析出指向棧內(nèi)存地址空間的指針的別名關(guān)系。
[0021](3)本發(fā)明不僅能用于分析過程內(nèi)指針別名關(guān)系,也能夠用于分析過程間指針別名關(guān)系。
【附圖說明】
[0022]圖1為本發(fā)明實(shí)施例中指針別名分析方法的流程圖;
[0023]圖2為本發(fā)明實(shí)施例中指針指向表動(dòng)態(tài)更新流程圖。
【具體實(shí)施方式】
[0024]以下結(jié)合本發(fā)明實(shí)施例附圖來對本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然所描述的實(shí)施例僅僅是本申請一部分實(shí)施例,而不是全部的實(shí)施例。
[0025]本發(fā)明的實(shí)施,能夠滿足程序分析過程任何可能需要用到指針別名關(guān)系的要求,能夠在需要時(shí),給出指定指針指定時(shí)刻在指定位置的別名關(guān)系,以便程序分析的順利進(jìn)行。
[0026]如圖1為本發(fā)明實(shí)施例中指針別名分析方法的流程圖,所述方法包括以下步驟:
[0027]步驟101,在程序運(yùn)行過程中維護(hù)一個(gè)全局?jǐn)?shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)程序中所有指針的指向信息。
[0028]所述全局?jǐn)?shù)據(jù)結(jié)構(gòu)是一個(gè)滿足哈希函數(shù)關(guān)系f(x)的數(shù)據(jù)結(jié)構(gòu),其中X是標(biāo)識(shí)指針指向的內(nèi)存塊的全局唯一編號(hào);哈希函數(shù)關(guān)系f(x)的輸出結(jié)果是所述全局?jǐn)?shù)據(jù)結(jié)構(gòu)中存儲(chǔ)指針指向信息的地址,所述哈希函數(shù)關(guān)系f(x)指明了所述全局唯一編號(hào)與存儲(chǔ)程序中所有指針的指向信息的數(shù)據(jù)結(jié)構(gòu)的映射關(guān)系;所述全局?jǐn)?shù)據(jù)結(jié)構(gòu)中存儲(chǔ)了程序運(yùn)行過程中所有已聲明指針的指向信息。
[0029]在具體選定用于存儲(chǔ)程序中所有指針的指向信息的全局?jǐn)?shù)據(jù)結(jié)構(gòu)時(shí),一個(gè)優(yōu)選的方案是,取哈希函數(shù)f (X) =X來存儲(chǔ)相關(guān)數(shù)據(jù),并取內(nèi)存塊對應(yīng)的空間起始地址作為所述哈希函數(shù)f (X)的關(guān)鍵字碼,即X的值為內(nèi)存塊對應(yīng)的空間起始地址。
[0030]步驟102,指針在聲明時(shí),在所述全局?jǐn)?shù)據(jù)結(jié)構(gòu)中添加一條新紀(jì)錄。
[0031]所述記錄中包括指針名稱,指針指向內(nèi)存塊類型和指針指向內(nèi)存塊的唯一編號(hào)。
[0032]步驟103,指針被賦值引用時(shí),根據(jù)賦值表達(dá)式的右值及其對應(yīng)內(nèi)存地址空間類型來動(dòng)態(tài)更新所述全局?jǐn)?shù)據(jù)結(jié)構(gòu)中相應(yīng)記錄。
[0033]其中,動(dòng)態(tài)更新所述指針指向表中相應(yīng)記錄,參照圖2,指針指向表動(dòng)態(tài)更新流程圖,包含以下步驟:
[0034]步驟201:判定指針賦值表達(dá)式的右值是否是一個(gè)函數(shù)調(diào)用;
[0035]步驟202:若指針賦值表達(dá)式的右值是一個(gè)函數(shù)調(diào)用,則跳轉(zhuǎn)到被調(diào)用函數(shù)源碼中,將實(shí)際運(yùn)行過程中返回的值來更新被賦值指針的指向記錄;更新時(shí),需要將被調(diào)用函數(shù)實(shí)際返回值指向內(nèi)存地址空間的類型及其指向內(nèi)存地址空間的全局編號(hào),以及該返回值的別名關(guān)系直接替換被賦值指針的指針指向表中的相應(yīng)字段即可。
[0036]步驟203:若指針賦值表達(dá)式的右值非函數(shù)調(diào)用,則直接提取所述右值所對應(yīng)的內(nèi)存地址空間類型、指向內(nèi)存地址空間全局編號(hào)及其所有別名關(guān)系替換被賦值指針的直至指向表中的相應(yīng)字段。
[0037]步驟104:不論程序運(yùn)行結(jié)束與否,均可以在事先指定位置,輸出指定指針或當(dāng)前時(shí)刻所有指針的別名關(guān)系,以滿足程序分析的需要。
[0038]這里的獲得的指針別名關(guān)系需要通過哈希函數(shù)關(guān)系f(x)計(jì)算得到,得到的指針別名關(guān)系是一個(gè)指針集合,所述指針集合表示的是同一時(shí)刻同時(shí)指向編號(hào)為X的內(nèi)存塊的指針集合。
[0039]本發(fā)明提出的指針別名分析方法能夠提供程序運(yùn)行過程中任意位置的指針別名關(guān)系,適用于過程內(nèi)或過程間的指向堆或棧上變量的指針別名分析。
[0040]應(yīng)該指出的是,以上所述僅為本發(fā)明的較佳實(shí)施案例而已,并不能因此而認(rèn)為是對本發(fā)明的專利保護(hù)范圍的限制,在不脫離本發(fā)明的核心思想的所有等效改進(jìn)和潤飾,均屬于本發(fā)明的保護(hù)范圍。
【主權(quán)項(xiàng)】
1.一種程序中指針別名分析方法,其特征在于包括: 在程序運(yùn)行過程中維護(hù)一個(gè)全局?jǐn)?shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)程序中所有指針的指向信息; 當(dāng)指針被聲明時(shí),在所述全局?jǐn)?shù)據(jù)結(jié)構(gòu)中添加一條新紀(jì)錄; 當(dāng)指針被賦值引用時(shí),根據(jù)賦值表達(dá)式的右值及其對應(yīng)內(nèi)存地址空間類型來動(dòng)態(tài)更新所述全局?jǐn)?shù)據(jù)結(jié)構(gòu)中相應(yīng)記錄; 在程序運(yùn)行結(jié)束前或結(jié)束時(shí),輸出指定位置指定指針或所有指針的別名關(guān)系。2.根據(jù)權(quán)利要求1所述的程序中指針別名分析方法,其特征在于:所述全局?jǐn)?shù)據(jù)結(jié)構(gòu)是一個(gè)滿足哈希函數(shù)關(guān)系f(x)的數(shù)據(jù)結(jié)構(gòu);所述哈希函數(shù)關(guān)系f(x)的輸入?yún)?shù)X標(biāo)識(shí)了指針指向的內(nèi)存塊的全局唯一編號(hào);所述哈希函數(shù)關(guān)系f(x)的輸出結(jié)果則是所述全局?jǐn)?shù)據(jù)結(jié)構(gòu)中用于存儲(chǔ)指針指向信息的地址;所述哈希函數(shù)關(guān)系f(x)指明了所述全局唯一編號(hào)與存儲(chǔ)程序中所有指針的指向信息的數(shù)據(jù)結(jié)構(gòu)的映射關(guān)系。3.根據(jù)權(quán)利要求1所述的程序中指針別名分析方法,其特征在于:所述全局?jǐn)?shù)據(jù)結(jié)構(gòu)中的指向信息包括指針名稱、指針指向內(nèi)存塊類型和指針指向的內(nèi)存塊的全局唯一編號(hào)。4.根據(jù)權(quán)利要求1所述的程序中的指針別名分析方法,其特征在于:所述賦值表達(dá)式的右值對應(yīng)的內(nèi)存地址空間類型包括棧和堆兩類。5.根據(jù)權(quán)利要求1或2所述的程序中指針別名分析方法,其特征在于:所述指針的別名關(guān)系是通過所述哈希函數(shù)關(guān)系f(x)計(jì)算得到的,該指針的別名關(guān)系是一個(gè)指針集合,所述指針集合表示的是同一時(shí)刻同時(shí)指向編號(hào)為X的內(nèi)存塊的指針集合。6.根據(jù)權(quán)利要求1所述的程序中指針別名分析方法,其特征在于:所述指針別名分析方法能夠在程序運(yùn)行的任意過程輸出任意指針當(dāng)前時(shí)刻的指針別名關(guān)系,所述任意過程包括在程序運(yùn)行結(jié)束前和運(yùn)行結(jié)束時(shí)。
【文檔編號(hào)】G06F9/45GK105893106SQ201610261260
【公開日】2016年8月24日
【申請日】2016年4月25日
【發(fā)明人】不公告發(fā)明人
【申請人】北京智能綜電信息技術(shù)有限責(zé)任公司