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

        ?

        動(dòng)態(tài)內(nèi)存分配及內(nèi)存泄漏相關(guān)概念的案例教學(xué)

        2019-01-23 03:50:26彭雙和趙佳利
        計(jì)算機(jī)教育 2019年1期
        關(guān)鍵詞:插樁調(diào)用內(nèi)存

        韓 靜,彭雙和,趙佳利

        (北京交通大學(xué) 智能交通數(shù)據(jù)安全與隱私保護(hù)技術(shù)北京市重點(diǎn)實(shí)驗(yàn)室,北京 100044)

        0 引 言

        20世紀(jì)計(jì)算機(jī)剛剛興起的時(shí)候,計(jì)算機(jī)內(nèi)存較小,動(dòng)態(tài)分配[1]的內(nèi)存若不及時(shí)釋放,會(huì)極大地占用系統(tǒng)資源,從而導(dǎo)致一系列的未知錯(cuò)誤。因此,編程人員對(duì)于內(nèi)存動(dòng)態(tài)分配有著較強(qiáng)的內(nèi)存釋放意識(shí)。然而,隨著計(jì)算機(jī)的不斷更新發(fā)展,計(jì)算機(jī)內(nèi)存不斷擴(kuò)大,學(xué)生對(duì)內(nèi)存泄漏[2]的感知越來(lái)越弱,很多時(shí)候,我們根本察覺(jué)不到內(nèi)存泄漏的存在,但這并不代表內(nèi)存泄漏的危害會(huì)逐漸消失。內(nèi)存泄漏的堆積最終會(huì)耗盡系統(tǒng)所有的內(nèi)存,給應(yīng)用程序帶來(lái)極大的不穩(wěn)定性。因此,內(nèi)存分配與內(nèi)存釋放往往是成對(duì)出現(xiàn),這樣才能科學(xué)有效地利用內(nèi)存空間。

        同理,對(duì)文件進(jìn)行操作時(shí),打開(kāi)文件與關(guān)閉文件也必須成對(duì)出現(xiàn),這也是學(xué)生在使用C語(yǔ)言的文件I/O接口時(shí)經(jīng)常出現(xiàn)的錯(cuò)誤。不關(guān)閉文件會(huì)導(dǎo)致數(shù)據(jù)丟失,因?yàn)樵谙蛭募憯?shù)據(jù)時(shí),首先將數(shù)據(jù)傳輸?shù)骄彌_區(qū),待緩沖區(qū)充滿后才正式輸出給文件。如果數(shù)據(jù)未充滿緩沖區(qū)而程序結(jié)束運(yùn)行,緩沖區(qū)中的數(shù)據(jù)就會(huì)丟失。用fclose()函數(shù)關(guān)閉文件,先將緩沖區(qū)中的數(shù)據(jù)輸出到磁盤文件,然后才釋放文件指針變量,從而避免了數(shù)據(jù)丟失。

        1 教學(xué)改革的必要性

        雖然在教學(xué)過(guò)程中老師一再?gòu)?qiáng)調(diào)malloc()與free()以及fopen()與fclose()函數(shù)的成對(duì)出現(xiàn),但在實(shí)際編程過(guò)程中,仍有部分學(xué)生沒(méi)有養(yǎng)成良好的編程習(xí)慣,從而忽略了釋放內(nèi)存或關(guān)閉文件操作,而且對(duì)于編譯器報(bào)錯(cuò)信息不太敏感的學(xué)生很難發(fā)現(xiàn)自己的錯(cuò)誤所在,從而會(huì)盲目修改程序,浪費(fèi)大量時(shí)間。這一方面是由于學(xué)生對(duì)內(nèi)存分配以及文件操作知識(shí)掌握得不充分,不熟練;另一方面是沒(méi)有意識(shí)到內(nèi)存泄漏以及數(shù)據(jù)丟失造成的嚴(yán)重后果,沒(méi)有引起大家的重視。因此,對(duì)于學(xué)生編程習(xí)慣以及程序安全意識(shí)的培養(yǎng)也格外重要。

        此外,檢測(cè)函數(shù)的參數(shù)及其返回值,在對(duì)危險(xiǎn)函數(shù)檢測(cè)、內(nèi)存泄漏檢測(cè)或者污點(diǎn)追蹤等方面都有廣泛的應(yīng)用。Intel-Pin[3]作為一個(gè)強(qiáng)大的分析工具,在性能評(píng)估和漏洞檢測(cè)等方面有著重大貢獻(xiàn)。它提供一些接口(API),可以實(shí)現(xiàn)程序運(yùn)行時(shí)各種信息的收集,利用這些 API,用戶可以根據(jù)需要開(kāi)發(fā)出各種分析工具,從而實(shí)現(xiàn)對(duì)可執(zhí)行程序的動(dòng)態(tài)分析[4],處理程序運(yùn)行過(guò)程中生成的代碼和屬性,從中獲取并將函數(shù)的調(diào)用、內(nèi)存的訪問(wèn)、指令的執(zhí)行等信息并將其記錄下來(lái),從而實(shí)現(xiàn)污點(diǎn)分析、指令路徑追蹤、協(xié)議逆向、漏洞挖掘等目的。這些工作都值得在此基礎(chǔ)上繼續(xù)深入挖掘研究,而且對(duì)于學(xué)生安全相關(guān)知識(shí)的培養(yǎng)也有很大幫助。

        2 相關(guān)原理簡(jiǎn)介

        2.1 Intel-Pin簡(jiǎn)介

        Intel-Pin是Intel公司推出的一款動(dòng)態(tài)二進(jìn)制分析框架, 支持IA-32和x86-64指令集架構(gòu),可用于創(chuàng)建動(dòng)態(tài)程序分析工具,然后可以使用這些工具來(lái)監(jiān)視和記錄程序運(yùn)行時(shí)的行為。使用Pin創(chuàng)建的名為Pintool的工具可用于在用戶空間應(yīng)用程序上執(zhí)行程序分析。

        為獲取malloc()函數(shù)返回值,我們通過(guò)Pin對(duì)程序進(jìn)行插樁,在程序運(yùn)行時(shí)獲取其相關(guān)信息。作為一個(gè)動(dòng)態(tài)的二進(jìn)制檢測(cè)工具,檢測(cè)是在編譯后的二進(jìn)制文件的運(yùn)行時(shí)執(zhí)行的。 因此,它不需要重新編譯源代碼,并且支持動(dòng)態(tài)生成代碼的測(cè)試程序。換句話說(shuō),Pintool能完全控制程序運(yùn)行時(shí)的執(zhí)行,我們可以根據(jù)需要改變程序執(zhí)行流程。Pin包含4種不同粒度級(jí)[5]的插樁,分別為:①指令級(jí)插樁(instruction instrumentatio),通過(guò)函數(shù)INS_AddInstrumentFunctio實(shí)現(xiàn);②軌跡級(jí)插裝(trace instrumentation),通過(guò)函數(shù)TRACE_AddInstrumentFunction實(shí)現(xiàn);③鏡像級(jí)插裝(image instrumentation), 使 用 IMG_AddInstrumentFunction函數(shù),由于其依賴于符號(hào)信息去確定函數(shù)邊界,因此必須在調(diào)用PIN_Init之前調(diào)用PIN_InitSymbols;④函數(shù)級(jí)的插裝(routine instrumentation),使用RTN_AddInstrumentFunction函數(shù),函數(shù)級(jí)插裝比鏡像級(jí)插裝更有效,因?yàn)橹挥戌R像中的一小部分函數(shù)被執(zhí)行。

        此外,Pin提供了豐富的API記錄、修改或?qū)ΜF(xiàn)有的編譯二進(jìn)制文件進(jìn)行其他操作,表1列舉了一些關(guān)鍵API及其功能描述。在想要分析一個(gè)程序但沒(méi)有該程序的源代碼的情況下,Pin尤其有用,這一特征也與要進(jìn)行的實(shí)驗(yàn)十分吻合。

        2.2 內(nèi)存泄漏原理

        內(nèi)存泄漏(memory leak)是指程序中己動(dòng)態(tài)分配的堆內(nèi)存由于某種原因(程序未釋放或無(wú)法釋放),造成系統(tǒng)內(nèi)存的浪費(fèi),導(dǎo)致程序運(yùn)行速度減慢甚至系統(tǒng)崩潰等嚴(yán)重后果。

        沒(méi)有釋放動(dòng)態(tài)分配的存儲(chǔ)空間而造成內(nèi)存泄漏,是使用動(dòng)態(tài)存儲(chǔ)變量的主要問(wèn)題,尤其對(duì)于初學(xué)動(dòng)態(tài)內(nèi)存分配的學(xué)生而言,更容易犯這種錯(cuò)誤,而且內(nèi)存泄漏缺陷具有隱蔽性、積累性的特征,比其他內(nèi)存非法訪問(wèn)錯(cuò)誤更難檢測(cè)。因?yàn)閮?nèi)存泄漏的產(chǎn)生原因是內(nèi)存塊未被釋放,屬于遺漏型缺陷而不是過(guò)錯(cuò)型缺陷。此外,內(nèi)存泄漏通常不會(huì)直接產(chǎn)生可觀察的錯(cuò)誤癥狀,而是逐漸積累,降低系統(tǒng)整體性能,極端的情況下可能使系統(tǒng)崩潰,這也是需要我們?cè)谌粘>幊讨凶⒁饧皶r(shí)釋放內(nèi)存的原因。

        3 實(shí)驗(yàn)設(shè)計(jì)

        實(shí)驗(yàn)的設(shè)計(jì)初衷及要實(shí)現(xiàn)的功能是在動(dòng)態(tài)二進(jìn)制插樁平臺(tái)Pin上,通過(guò)編寫插樁工具Pintool,對(duì)可執(zhí)行程序進(jìn)行動(dòng)態(tài)插樁,從而成功檢測(cè)到可執(zhí)行程序中的malloc()和free()函數(shù)的參數(shù)及malloc()函數(shù)的返回值,通過(guò)結(jié)果分析可以觀測(cè)到其成對(duì)出現(xiàn),而且malloc()的返回值剛好是free()要釋放的地址。此外,fopen()與fclose()原理與之相似,這里一并進(jìn)行研究探討,對(duì)于其他成對(duì)出現(xiàn)的函數(shù),學(xué)生也可以此作為參考對(duì)其進(jìn)行測(cè)試。

        表1 調(diào)用函數(shù)功能描述

        與普通程序一樣,PinTool的入口位置依然為main()函數(shù),主函數(shù)流程如圖1所示。

        Pintool插樁過(guò)程和分析過(guò)程的主要實(shí)現(xiàn)過(guò)程為:當(dāng)代碼經(jīng)由Pin時(shí),Pintool能觸發(fā)Pin提供的回調(diào)例程,進(jìn)而獲取被插樁函數(shù)的信息。Pintool實(shí)現(xiàn)流程如圖2所示。

        圖1 主函數(shù)流程圖

        圖2 Pintool實(shí)現(xiàn)流程圖

        3.1 粒度選擇

        考慮到性能及開(kāi)銷,這里選擇鏡像級(jí)插樁,一旦加載了程序中的鏡像,Pintool就可以在鏡像中找到需要的函數(shù)名并插入分析代碼,進(jìn)而找到其參數(shù)。

        3.2 分析例程

        要使用Pin API,必須在代碼中包含pin.h頭文件,Pintool會(huì)將結(jié)果寫入到一個(gè)輸出文件。然后需要定義代碼序列中特定點(diǎn)處執(zhí)行的分析例程,分析例程決定了對(duì)測(cè)試程序進(jìn)行的操作。在malloc和fopen執(zhí)行后記錄返回地址,每次調(diào)用malloc和fopen時(shí)都會(huì)調(diào)用該函數(shù)。

        此外,預(yù)先定義一個(gè)布爾型的全局變量Record,用來(lái)控制是否打印記錄,然后在分析函數(shù)中通過(guò)條件語(yǔ)句判斷,從而過(guò)濾掉一些不必要的輸出信息,使得輸出結(jié)果更加明了,便于觀察分析。

        3.3 插樁例程

        插樁例程的主要功能是告訴Pin何時(shí)執(zhí)行分析例程。每次運(yùn)行加載函數(shù)過(guò)程中都會(huì)調(diào)用該例程,加載程序函數(shù)時(shí),Pin就可以在適當(dāng)?shù)狞c(diǎn)插入分析例程。

        該模塊主要是對(duì)malloc()和free()函數(shù)進(jìn)行插樁。 打印每次調(diào)用malloc()、free()的大小以及malloc()的返回值。通過(guò)RTN_InsertCall函數(shù)在適當(dāng)?shù)狞c(diǎn)插入分析例程,該函數(shù)包括3個(gè)強(qiáng)制參數(shù):首先是想要插樁的函數(shù);其次是枚舉類型IPOINT,用來(lái)指定插入分析例程的位置;最后是要插入的分析例程。參數(shù)必須由IARG_END終止,為了將fopen及malloc函數(shù)的返回值傳遞給分析例程,需要指定IARG_FUNCRET_EXITPOINT_VALUE。

        例如,在對(duì)malloc函數(shù)的插樁過(guò)程中,第二個(gè)參數(shù)表示在malloc函數(shù)執(zhí)行前執(zhí)行 Arg1Before函數(shù),并依次為 Arg1Before 函數(shù)傳遞兩個(gè)參數(shù)。IARG_ADDRINT 表示第一個(gè)參數(shù)是 IARG_ADDRINT 型的常量,其值是宏FOPEN;IARG_FUNCARG_ENTRYPOINT_VALUE 表示第二個(gè)參數(shù)是僅在函數(shù)入口處有效的函數(shù)本身參數(shù),其值是0。其核心代碼如下:

        3.4 結(jié)束例程

        結(jié)束例程在插樁程序終止時(shí)調(diào)用,它包含了兩個(gè)參數(shù),一個(gè)是保存程序主函數(shù)返回值的代碼參數(shù),另一個(gè)參數(shù)用來(lái)傳遞附加信息給檢測(cè)函數(shù)。

        4 C語(yǔ)言程序的測(cè)試與結(jié)果分析

        通過(guò)一個(gè)小程序來(lái)測(cè)試我們的Pintool,該程序中包含了打開(kāi)文件與關(guān)閉文件的操作,并且通過(guò)malloc函數(shù)動(dòng)態(tài)分配了一塊地址空間,隨后將其釋放,其核心代碼如下:

        將該代碼編譯成可執(zhí)行程序,即可在命令行中使用我們的Pintool工具對(duì)其進(jìn)行檢測(cè)。在終端輸入如下命令,此時(shí)文件夾中不存在hh.txt文件,故打開(kāi)失敗。在控制臺(tái)輸出打開(kāi)文件失敗的信息,同時(shí)在Pintool創(chuàng)建的輸出文件中可以查看函數(shù)信息,如圖3所示。

        創(chuàng)建hh.txt文件后,文件打開(kāi)成功,此時(shí)控制臺(tái)信息提示文件打開(kāi)成功,此時(shí)Pintool的函數(shù)輸出信息如圖4所示。

        圖3 打開(kāi)失敗輸出

        圖4 打開(kāi)成功輸出

        實(shí)驗(yàn)結(jié)果分析:由圖3和圖4文件輸出結(jié)果可見(jiàn),若文件正常打開(kāi),可捕獲到fclose()函數(shù),而且最終會(huì)通過(guò)free()函數(shù)釋放該地址空間,同樣,對(duì)于malloc()函數(shù),在其返回地址處依然有對(duì)應(yīng)的free()函數(shù);若文件打開(kāi)失敗,則不會(huì)調(diào)用關(guān)閉文件函數(shù),而且函數(shù)也沒(méi)有正常結(jié)束,有一塊地址空間沒(méi)有正常釋放。通過(guò)對(duì)輸出文件的分析,可以清楚地觀測(cè)到malloc()函數(shù)與free()函數(shù)以及fopen()和fclose()函數(shù)的對(duì)應(yīng)關(guān)系。

        5 結(jié) 語(yǔ)

        該工具通過(guò)鏡像級(jí)插樁實(shí)現(xiàn)了對(duì)malloc()函數(shù)分配內(nèi)存大小及其返回值的獲取,同時(shí)監(jiān)測(cè)其返回地址處是否調(diào)用free()函數(shù)來(lái)釋放地址空間,從而在沒(méi)有源文件的情況下得知其源代碼是否規(guī)范,malloc()函數(shù)與free()函數(shù)是否對(duì)應(yīng)。此外,我們也對(duì)fopen()函數(shù)和fclose()函數(shù)進(jìn)行了監(jiān)測(cè)。通過(guò)這種實(shí)驗(yàn)的方式,學(xué)生對(duì)這些函數(shù)有了更深入的理解,相較于老師在課堂上多次強(qiáng)調(diào)效果卻微乎其微,學(xué)生自己動(dòng)手操作更加直觀、形象、深刻,能達(dá)到事半功倍的效果,同時(shí)也可以舉一反三,通過(guò)一些微小的修改檢測(cè)其他函數(shù)或者自定義函數(shù)的參數(shù)及返回值,在不斷嘗試中體會(huì)學(xué)習(xí)的樂(lè)趣,這對(duì)教學(xué)改革有著重大意義。該工具也可以應(yīng)用在許多場(chǎng)景中,為后續(xù)工作帶來(lái)了許多便利,這也是我們要進(jìn)一步研究探索的方向。

        猜你喜歡
        插樁調(diào)用內(nèi)存
        砂土中樁靴插樁對(duì)臨近筒型基礎(chǔ)的影響研究
        基于TXL的源代碼插樁技術(shù)研究
        核電項(xiàng)目物項(xiàng)調(diào)用管理的應(yīng)用研究
        “春夏秋冬”的內(nèi)存
        LabWindows/CVI下基于ActiveX技術(shù)的Excel調(diào)用
        基于性能分析的自適應(yīng)插樁框架
        基于系統(tǒng)調(diào)用的惡意軟件檢測(cè)技術(shù)研究
        基于順序塊的嵌入式白盒測(cè)試插樁技術(shù)研究
        基于內(nèi)存的地理信息訪問(wèn)技術(shù)
        利用RFC技術(shù)實(shí)現(xiàn)SAP系統(tǒng)接口通信
        久久久久亚洲av无码专区喷水| 亚洲一区二区三区偷拍自拍| 亚洲97成人精品久久久| 日本道色综合久久影院| 国产精品无码久久久久| 伊人久久大香线蕉在观看| 青青草视频在线播放81| 国产一级内射视频在线观看| 成人综合婷婷国产精品久久蜜臀 | 久久偷拍国内亚洲青青草| 国产激情视频免费在线观看| 东北妇女肥胖bbwbbwbbw| 亚洲两性视频一三区| 在线观看免费的黄片小视频| 久久99精品久久久久久清纯| 欧美日韩亚洲tv不卡久久| 久久精品成人91一区二区 | 黄污在线观看一区二区三区三州| 亚洲欧美国产国产综合一区| 亚洲综合AV在线在线播放| 国产精品毛片av一区二区三区| 激情综合五月婷婷久久| 九九精品国产亚洲av日韩| 婷婷综合缴情亚洲狠狠| 国产一区二区三区精品毛片| 在线亚洲高清揄拍自拍一品区| 国产精品免费久久久久影院| 狠狠亚洲超碰狼人久久老人| 亚洲乱码av乱码国产精品| 亚洲国产成人无码av在线影院| 在线视频一区二区日韩国产| 国产理论亚洲天堂av| 国产又猛又黄又爽| 日本a级特黄特黄刺激大片| 国产人妖赵恩静在线视频| 亚洲色图视频在线免费看| 丰满熟妇乱子伦| 国产精品日本天堂| 91色区在线免费观看国产| 国产精品一区二区在线观看| 亚洲A∨无码国产精品久久网|