• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

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

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

      徐萍

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

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

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

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

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

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

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

      1.1 使用未初始的指針

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

      1.2 指針?biāo)傅膶ο笙?/p>

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

      1.3 直至釋放后位置空

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

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

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

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

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

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

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

      3 結(jié)束語

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

      參考文獻(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)檢測方法[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)存
      偷指針的人
      娃娃畫報(2019年5期)2019-06-17 16:58:10
      為什么表的指針都按照順時針方向轉(zhuǎn)動
      基于改進(jìn)Hough變換和BP網(wǎng)絡(luò)的指針儀表識別
      電測與儀表(2015年5期)2015-04-09 11:30:42
      C++運(yùn)算符重載剖析
      價值工程(2014年17期)2014-04-16 03:29:20
      ARM Cortex—MO/MO+單片機(jī)的指針變量替換方法
      基于內(nèi)存的地理信息訪問技術(shù)
      表達(dá)式求值及符號推導(dǎo)
      C++中運(yùn)算符的重載應(yīng)用
      贵州省| 临汾市| 南江县| 来安县| 元谋县| 连江县| 琼结县| 寿宁县| 甘肃省| 通化市| 沅陵县| 增城市| 同心县| 新宾| 张北县| 崇阳县| 江川县| 无极县| 扎赉特旗| 平阳县| 灵武市| 澜沧| 兰考县| 建阳市| 志丹县| 安达市| 岫岩| 武功县| 鄯善县| 平原县| 宿州市| 大同县| 商丘市| 中西区| 临泽县| 曲靖市| 沙洋县| 牡丹江市| 阳朔县| 丹阳市| 白水县|