亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        C++語(yǔ)言中懸掛指針的研究與應(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)問(wèn)題,并提出了懸掛指針的解決方法。

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

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

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

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

        1 C++語(yǔ)言懸掛指針故障分析

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

        1.1 使用未初始的指針

        首先看例1代碼。該程序能夠通過(guò)編譯,但是在運(yùn)行時(shí)會(huì)出現(xiàn)問(wèn)題。這是因?yàn)閏har*name定義了變量但沒(méi)有指針進(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是存在于棧的局部空間中,離開(kāi)變量后就立即被釋放,因此輸出的結(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沒(méi)有釋放地址,該地址仍然存在,該指針便成為懸掛指針,程序在使用指針時(shí)會(huì)發(fā)生內(nèi)存泄漏。例3為new運(yùn)算產(chǎn)生的懸掛指針,例4為malloc運(yùn)算產(chǎn)生的懸掛指針。

        2 C++語(yǔ)言懸掛指針解決方法

        為解決C++語(yǔ)言產(chǎn)生懸掛指針問(wè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]開(kāi)發(fā)了一款懸掛指針及內(nèi)存泄漏檢測(cè)軟件。該軟件工作原理是當(dāng)程序分配和釋放內(nèi)存時(shí),軟件會(huì)記錄指針在內(nèi)存中的信息比如指針位置及狀態(tài),當(dāng)程序在指針內(nèi)寫入新的地址時(shí),同時(shí)軟件會(huì)讀取指針引用的地址,與原來(lái)指針信息進(jìn)行對(duì)比以確定懸掛指針位置及內(nèi)存泄漏位置。在該過(guò)程中有多個(gè)節(jié)點(diǎn)平衡二叉樹(shù),其中節(jié)點(diǎn)代表了堆或棧記錄,該軟件工作流程如圖2所示。

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

        Nagarakatte S[5]為了解決懸掛指針內(nèi)存分配與釋放問(wèn)題,提出了一種解決方案。該方案是以編譯器執(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é)束語(yǔ)

        即便是經(jīng)驗(yàn)豐富的C++程序員在編寫指針程序時(shí),也會(huì)出現(xiàn)懸掛指針這一隱蔽Bug。在使用指針時(shí)要考慮到指定初始化及賦NULL值,在使用malloc、delete 及malloc、free等運(yùn)算符時(shí)應(yīng)該將分配的指針指向NULL。開(kāi)發(fā)人員在編寫程序時(shí),如果能夠使用變量引用來(lái)實(shí)現(xiàn)某一功能時(shí)就盡量不使用指針這一變量,這樣可以避免懸掛指針問(wè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)檢測(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í)針?lè)较蜣D(zhuǎn)動(dòng)
        基于改進(jìn)Hough變換和BP網(wǎng)絡(luò)的指針儀表識(shí)別
        C++運(yùn)算符重載剖析
        ARM Cortex—MO/MO+單片機(jī)的指針變量替換方法
        基于內(nèi)存的地理信息訪問(wèn)技術(shù)
        表達(dá)式求值及符號(hào)推導(dǎo)
        C++中運(yùn)算符的重載應(yīng)用
        亚洲精品99久久久久久| 人妻熟妇乱又伦精品视频| 久久99精品久久久久久琪琪| 妺妺窝人体色www看美女| 精品久久人人爽天天玩人人妻| 欧洲亚洲视频免费| 亚洲天堂免费av在线观看| 久久精品国产在热亚洲不卡| 国产一品二品三品精品在线| 中文字幕乱码熟妇五十中出| 丰满的少妇xxxxx青青青| 久久99精品中文字幕在| 国内精品嫩模av私拍在线观看| 国产一级黄色录像大片| 内射人妻无套中出无码| 99精品国产一区二区三区a片| 天天躁日日躁狠狠躁一区| av天堂吧手机版在线观看| 亚洲综合视频一区二区| 中文字幕免费在线观看动作大片| 男人靠女人免费视频网站| YW亚洲AV无码乱码在线观看| 久久99热精品免费观看麻豆| 日本中文字幕精品久久| 99麻豆久久久国产精品免费| 欧美日韩国产成人高清视频| 国产午夜无码精品免费看动漫| 小草手机视频在线观看| 亚洲av无一区二区三区| 成人影院yy111111在线| 无码aⅴ在线观看| 中文字幕日本熟妇少妇| 蜜桃传媒免费在线观看| 无套中出丰满人妻无码| 久久99久久99精品免观看| 亚洲成a人网站在线看| 亚洲中文字幕综合网站| 久久夜色精品国产亚洲av动态图 | 亚洲精品成人一区二区三区| 日本添下边视频全过程| 夜夜未满十八勿进的爽爽影院|