[發明專利]一種基于LLVM的內存泄露的靜態檢測方法及系統有效
| 申請號: | 201910993650.3 | 申請日: | 2019-10-18 |
| 公開(公告)號: | CN110865899B | 公開(公告)日: | 2023-09-05 |
| 發明(設計)人: | 陶琦;李驪 | 申請(專利權)人: | 北京華捷艾米科技有限公司 |
| 主分類號: | G06F11/07 | 分類號: | G06F11/07;G06F9/50 |
| 代理公司: | 暫無信息 | 代理人: | 暫無信息 |
| 地址: | 100193 北京市海淀區*** | 國省代碼: | 北京;11 |
| 權利要求書: | 查看更多 | 說明書: | 查看更多 |
| 摘要: | |||
| 搜索關鍵詞: | 一種 基于 llvm 內存 泄露 靜態 檢測 方法 系統 | ||
本發明公開了一種基于LLVM的內存泄露的靜態檢測方法及系統,利用C++堆分配指令信息,并在程序退出的時候,通過變量的活躍信息來判斷可能的內存溢出的情況,能夠在運行程序前發現那些淺顯的表層的內存泄露的地方,減少以后程序修改迭代的次數;利用LLVM的框架模塊化的特性,使用它成熟穩定的代碼接口,技術方案簡潔直接,不僅在靜態編譯的過程中能更早的發現內存泄露的地方,并且保證了代碼實現的簡單性,同時也使得結果更容易被測試。
技術領域
本發明涉及信息處理,尤其是一種基于LLVM的內存泄露的靜態檢測方法及系統。
背景技術
在C++語法中,內存分配只會在棧(stack)中或者在堆(heap)中。棧中的變量的分配和釋放是由系統管理的,無需人工管理;但是堆中分配的變量,是由程序員自己維護的,需要程序員自己釋放,如果忘了釋放在堆中分配的空間,系統新的變量就會一直申請不到這個空間,就會造成內存泄露了。內存泄露包括在函數中跨函數的變量內存泄露等比較復雜的情況,也包括一部分內存泄露情況較為簡單的情況。
現有的靜態內存泄露的檢測方法,其過程都非常復雜,而且中間代碼生成都需要自己實現,整個過程調試也更加繁瑣。解決內存泄露問題的方法有兩種,一種是通過人工反復通讀代碼,檢查是否有遺忘的未釋放的變量;另一種是程序運行的時候查看內存是否一直在增加來判斷是否有內存泄露,即使判斷存在內存泄露,也無法快速確定內存泄露的地點,最終還是要回到第一種方法。但在代碼量較大的情況下,人工查找非常不便、費時費力。
發明內容
發明目的:針對上述現有技術存在的缺陷,本發明旨在提供一種基于LLVM的內存泄露的靜態檢測方法及系統。
技術方案:一種基于LLVM的內存泄露的靜態檢測方法,包括:
在LLVM編譯器中初始化3個空的局部數組:第一數組、第二數組、第三數組;
遍歷所有塊,將所有運行路徑存儲到第一數組中;
遍歷第一數組中的所有路徑,經歷每條路徑時:
將所有動態內存分配首次分配的變量添加到第二數組中,并將堆中活躍變量信息的開始信息部分存儲在該活躍變量的記錄信息中;
若存在指向堆的變量釋放函數,則從第二數組中刪除該變量的記錄信息;
當第二數組中的變量被重新賦值或賦值給其他變量時,更新第二數組中的記錄信息;若發生內存泄露,將內存泄露變量的信息存儲到第三數組中;
在每條路徑經歷結束時,遍歷第二數組和第三數組,輸出內存泄露變量的活躍信息,清空第二數組和第三數組。
進一步的,所述初始化3個空的局部數組具體是在LLVM編譯器的第一預設函數中初始化。
進一步的,所述遍歷所有塊,將所有運行路徑存儲到第一數組,包括:
從第一預設函數的入口開始經歷不同的塊,經歷到含有退出函數指令的塊時,產生一條路徑;
繼續經歷其他塊,將產生的每條路徑上的塊的信息作為一個記錄存儲到第一數組。
進一步的,在所述初始化3個空的局部數組之前,還包括:
創建指令文件,在指令文件中創建并注冊指令類,所述指令類繼承自LLVM編譯器框架中的第一預設類;
在所述遍歷第一數組中的所有路徑結束后,還包括:
將指令文件添加到編譯文件中編譯,生成庫,加載該庫,運行在相應中間文件中,得到輸出信息。
進一步的,所述當第二數組中的變量被重新賦值或賦值給其他變量時更新第二數組中的記錄信息,其中第二數組中的變量包含關聯變量。
該專利技術資料僅供研究查看技術是否侵權等信息,商用須獲得專利權人授權。該專利全部權利屬于北京華捷艾米科技有限公司,未經北京華捷艾米科技有限公司許可,擅自商用是侵權行為。如果您想購買此專利、獲得商業授權和技術合作,請聯系【客服】
本文鏈接:http://www.szxzyx.cn/pat/books/201910993650.3/2.html,轉載請聲明來源鉆瓜專利網。





