国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

C++語言中懸掛指針的研究與應(yīng)用

2016-11-02 22:53:06徐萍
電腦知識(shí)與技術(shù) 2016年23期
關(guān)鍵詞:運(yùn)算符指針內(nèi)存

徐萍

摘要:C++懸掛指針是指那些不能正確指向合法的指針,該指針會(huì)使系統(tǒng)發(fā)生不可估計(jì)的后果。該文研究了國(guó)內(nèi)外研究現(xiàn)狀,從而介紹了Apace、谷歌等著名軟件都存在C++懸掛指針,進(jìn)一步分析了C++懸掛指針出現(xiàn)的類型有:指針未初始、指針對(duì)象不存在及指針釋放出現(xiàn)問題,并提出了懸掛指針的解決方法。

關(guān)鍵詞:C++;懸掛指針;內(nèi)存泄漏

中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2016)23-0065-02

C++語言是一門極其復(fù)雜的語言,許多程序員在使用C++語言指針編寫程序時(shí)。由于操作不當(dāng),往往會(huì)出現(xiàn)動(dòng)態(tài)內(nèi)存問題,比如懸掛指針。懸掛指針是一種常見的Bug,而且不容易發(fā)現(xiàn)。潛在的懸掛指針危害極其嚴(yán)重,會(huì)導(dǎo)致內(nèi)存溢出等安全問題。著名的開源服務(wù)器Apace就存在一個(gè)懸掛指針漏洞,該漏洞存在于Apace mod_isapi模塊中,在使用Apace服務(wù)器時(shí)會(huì)出現(xiàn)內(nèi)存溢出問題。BLee[1]統(tǒng)計(jì)了谷歌瀏覽器從2011年到2013年之間出現(xiàn)C++懸掛指針的漏洞如表1所示。

由此可見,針對(duì)C++懸掛指針的危害,進(jìn)行C++懸掛指針的研究是非常重要的。

1 C++語言懸掛指針故障分析

懸掛指針是指針指向釋放內(nèi)存后的指針,是野指針的一類。C++內(nèi)存分配方法是主要有堆、棧、自由存儲(chǔ)區(qū)、全局/靜態(tài)存儲(chǔ)區(qū)以及常見存儲(chǔ)區(qū)。下面對(duì)C++語言中懸掛指針故障進(jìn)行分析。

1.1 使用未初始的指針

首先看例1代碼。該程序能夠通過編譯,但是在運(yùn)行時(shí)會(huì)出現(xiàn)問題。這是因?yàn)閏har*name定義了變量但沒有指針進(jìn)行初始化,因而會(huì)出現(xiàn)懸掛指針。

1.2 指針?biāo)傅膶?duì)象消失

查看代碼如例2所示,運(yùn)行程序結(jié)果不是0.0。這是因?yàn)樵贑++中由于指針對(duì)象是有生命周期的,當(dāng)一個(gè)對(duì)象生命周期結(jié)束指針就消失,變量my是存在于棧的局部空間中,離開變量后就立即被釋放,因此輸出的結(jié)果是未知的。

1.3 直至釋放后位置空

在C++中內(nèi)存釋放和分配有:malloc、free、delete及new等運(yùn)算符。運(yùn)算符new 、malloc是在堆上進(jìn)行內(nèi)存分配,同時(shí)將分配地址的首地址返回給指針。運(yùn)算符delete、free是將分配的地址釋放。如果程序使用了new、malloc沒有釋放地址,該地址仍然存在,該指針便成為懸掛指針,程序在使用指針時(shí)會(huì)發(fā)生內(nèi)存泄漏。例3為new運(yùn)算產(chǎn)生的懸掛指針,例4為malloc運(yùn)算產(chǎn)生的懸掛指針。

2 C++語言懸掛指針解決方法

為解決C++語言產(chǎn)生懸掛指針問題,國(guó)內(nèi)外學(xué)者對(duì)其進(jìn)行了研究。孫濤[2]提出了一種懸掛指針故障的靜態(tài)檢測(cè)方法。該方法研究了函數(shù)間、函數(shù)依賴關(guān)系、函數(shù)摘要及故障檢測(cè)算法具體操作。函數(shù)間主要用于代碼未運(yùn)行時(shí),查看代碼調(diào)用情況。函數(shù)依賴關(guān)系是若函數(shù)fun1()調(diào)用了函數(shù)fun2(),,則可將函數(shù)fun1()依賴于函數(shù)fun2()如圖1所示。

函數(shù)摘要是對(duì)函數(shù)內(nèi)容的抽象描述,在函數(shù)檢測(cè)中如果檢測(cè)到有函數(shù)調(diào)用,程序可以在內(nèi)容中提取調(diào)用函數(shù)信息,這樣提高了分析效率,故障檢測(cè)算法是在函數(shù)摘要基礎(chǔ)上進(jìn)行故障檢測(cè)。

SC Gupta[3]開發(fā)了一款懸掛指針及內(nèi)存泄漏檢測(cè)軟件。該軟件工作原理是當(dāng)程序分配和釋放內(nèi)存時(shí),軟件會(huì)記錄指針在內(nèi)存中的信息比如指針位置及狀態(tài),當(dāng)程序在指針內(nèi)寫入新的地址時(shí),同時(shí)軟件會(huì)讀取指針引用的地址,與原來指針信息進(jìn)行對(duì)比以確定懸掛指針位置及內(nèi)存泄漏位置。在該過程中有多個(gè)節(jié)點(diǎn)平衡二叉樹,其中節(jié)點(diǎn)代表了堆或棧記錄,該軟件工作流程如圖2所示。

Dhurjati D[4]為了檢測(cè)懸掛指針提出了一種新的技術(shù)用于檢測(cè)運(yùn)行時(shí)懸掛指針。該技術(shù)使用一個(gè)新的虛擬頁分配的程序和依靠頁保護(hù)機(jī)制來檢查懸掛指針訪問。一是利用新的虛擬頁面程序進(jìn)行分配,并使之映射到相同物理頁面的原始分配器上。這種做法中原始程序和物理內(nèi)存基本是一樣的,且能夠有效地使懸掛指針的檢測(cè)能力得以保留。二是利用自動(dòng)池實(shí)現(xiàn)對(duì)之前開發(fā)編譯器的改造利用,并利用虛擬頁面解決虛擬地址空間耗盡這一問題。通過實(shí)驗(yàn)得到改進(jìn)技術(shù)后的Unix服務(wù)器開銷小于4%,遠(yuǎn)低于未改進(jìn)的Unix。

Nagarakatte S[5]為了解決懸掛指針內(nèi)存分配與釋放問題,提出了一種解決方案。該方案是以編譯器執(zhí)行時(shí)間的安全(CETS:compiler enforced temporal safety for C)為出發(fā)點(diǎn),CETS將維護(hù)的對(duì)象進(jìn)行標(biāo)識(shí),結(jié)合現(xiàn)有的檢測(cè)方法CETS保持了指針在內(nèi)存分布局部的完整性,同時(shí)檢查該對(duì)象是否被引用到指針中。結(jié)果表明:使用CETS方法能夠提高懸掛指針檢測(cè)效率,安全性也增加。

3 結(jié)束語

即便是經(jīng)驗(yàn)豐富的C++程序員在編寫指針程序時(shí),也會(huì)出現(xiàn)懸掛指針這一隱蔽Bug。在使用指針時(shí)要考慮到指定初始化及賦NULL值,在使用malloc、delete 及malloc、free等運(yùn)算符時(shí)應(yīng)該將分配的指針指向NULL。開發(fā)人員在編寫程序時(shí),如果能夠使用變量引用來實(shí)現(xiàn)某一功能時(shí)就盡量不使用指針這一變量,這樣可以避免懸掛指針問題。

參考文獻(xiàn):

[1] Lee B, Song C, Jang Y, et al. Preventing Use-after-free with Dangling Pointers Nullification[C]// Network and Distributed System Security Symposium. 2015.

[2] 孫濤, 宮云戰(zhàn), 金大海. 一種懸掛指針故障的靜態(tài)檢測(cè)方法[J]. 計(jì)算機(jī)研究與發(fā)展, 2010(S1): 69-73.

[3] Gupta S C. Detecting dangling pointers and memory leaks within software: US, US 8245209 B2[P]. 2012.

[4] Dhurjati D, Adve V. Efficiently Detecting All Dangling Pointer Uses in Production Servers[C]// International Conference on Dependable Systems and Networks. IEEE, 2006:269-280.

[5] Nagarakatte S, Zhao J, Martin M M K, et al. CETS: compiler enforced temporal safety for C[J]. Acm Sigplan Notices, 2010, 45(8): 31-40.

猜你喜歡
運(yùn)算符指針內(nèi)存
老祖?zhèn)魇诨具\(yùn)算符
“春夏秋冬”的內(nèi)存
偷指針的人
為什么表的指針都按照順時(shí)針方向轉(zhuǎn)動(dòng)
基于改進(jìn)Hough變換和BP網(wǎng)絡(luò)的指針儀表識(shí)別
C++運(yùn)算符重載剖析
ARM Cortex—MO/MO+單片機(jī)的指針變量替換方法
基于內(nèi)存的地理信息訪問技術(shù)
表達(dá)式求值及符號(hào)推導(dǎo)
C++中運(yùn)算符的重載應(yīng)用
彭阳县| 胶南市| 遂宁市| 鲁甸县| 廉江市| 榆树市| 合川市| 北票市| 呈贡县| 富阳市| 威信县| 乌什县| 松江区| 玉山县| 茌平县| 黄冈市| 罗平县| 丰都县| 博罗县| 尉氏县| 鸡东县| 嘉善县| 安新县| 庆阳市| 陆良县| 永康市| 油尖旺区| 澜沧| 水富县| 莱阳市| 和静县| 永吉县| 屯昌县| 临夏县| 宜都市| 治多县| 馆陶县| 四平市| 葫芦岛市| 常州市| 伽师县|