• 
    

    
    

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

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

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

      韓 靜,彭雙和,趙佳利

      (北京交通大學 智能交通數(shù)據(jù)安全與隱私保護技術(shù)北京市重點實驗室,北京 100044)

      0 引 言

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

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

      1 教學改革的必要性

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

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

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

      2.1 Intel-Pin簡介

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

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

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

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

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

      沒有釋放動態(tài)分配的存儲空間而造成內(nèi)存泄漏,是使用動態(tài)存儲變量的主要問題,尤其對于初學動態(tài)內(nèi)存分配的學生而言,更容易犯這種錯誤,而且內(nèi)存泄漏缺陷具有隱蔽性、積累性的特征,比其他內(nèi)存非法訪問錯誤更難檢測。因為內(nèi)存泄漏的產(chǎn)生原因是內(nèi)存塊未被釋放,屬于遺漏型缺陷而不是過錯型缺陷。此外,內(nèi)存泄漏通常不會直接產(chǎn)生可觀察的錯誤癥狀,而是逐漸積累,降低系統(tǒng)整體性能,極端的情況下可能使系統(tǒng)崩潰,這也是需要我們在日常編程中注意及時釋放內(nèi)存的原因。

      3 實驗設(shè)計

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

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

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

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

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

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

      3.1 粒度選擇

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

      3.2 分析例程

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

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

      3.3 插樁例程

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

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

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

      3.4 結(jié)束例程

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

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

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

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

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

      圖3 打開失敗輸出

      圖4 打開成功輸出

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

      5 結(jié) 語

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

      猜你喜歡
      插樁調(diào)用內(nèi)存
      砂土中樁靴插樁對臨近筒型基礎(chǔ)的影響研究
      太陽能學報(2024年2期)2024-06-12 00:00:00
      基于TXL的源代碼插樁技術(shù)研究
      核電項目物項調(diào)用管理的應用研究
      “春夏秋冬”的內(nèi)存
      當代陜西(2019年13期)2019-08-20 03:54:22
      LabWindows/CVI下基于ActiveX技術(shù)的Excel調(diào)用
      基于性能分析的自適應插樁框架
      基于系統(tǒng)調(diào)用的惡意軟件檢測技術(shù)研究
      基于順序塊的嵌入式白盒測試插樁技術(shù)研究
      基于內(nèi)存的地理信息訪問技術(shù)
      利用RFC技術(shù)實現(xiàn)SAP系統(tǒng)接口通信
      阳江市| 安阳县| 广灵县| 山阴县| 威海市| 黄大仙区| 瑞金市| 上虞市| 长沙市| 平陆县| 老河口市| 烟台市| 大埔县| 远安县| 封开县| 监利县| 慈利县| 河池市| 新郑市| 玉林市| 当阳市| 三河市| 天全县| 常州市| 柏乡县| 荥经县| 英超| 南溪县| 晋江市| 达拉特旗| 米泉市| 牟定县| 莱西市| 应用必备| 大方县| 奉新县| 潞城市| 宝丰县| 台中市| 嵊泗县| 祁门县|