如何檢測C語言中的內存漏洞(leak)?

在動態分配的內存單元(即由函數malloc()或ealloc()分配的內存單元)不再使用卻沒有被釋放的情況下,會出現內存漏洞。未釋放內存單元本身并不是一種錯誤,編譯程序不會因此報告出錯,程序也不會因此而立即崩潰。但是,如果不再使用而又沒有被釋放的內存單元越來越多,程序所能使用的內存空間就越來越小。最終,當程序試圖要求分配內存時,就會發現已經沒有可用的內存空間。這時,尤其是當程序員沒有考慮到內存分配失敗的可能性時,程序的運行就會出現異常現象。

內存漏洞是最難檢測的錯誤之一,同時也是最危險的錯誤。導致這個問題的編程錯誤很可能出現在程序的開始部分,但只有當程序奠名其妙地使用完內存后,這個問題才會暴露出來。

此時去檢查當前那條導致內存分配失敗的語句是無濟于事的,因為那些分配了內存卻未能按時釋放內存的代碼可能在程序的其它地方。

遺憾的是C語言并沒有為檢測或修復內存漏洞提供現成的方法。除非使用提供這種功能的商業軟件包,否則,程序員就需要以很大的耐心和精力去檢測和修復內存漏洞。最好的辦法是在編寫程序時就充分考慮到內存漏洞的可能性,并小心謹慎地處理這種可能性。

導致內存漏洞的最簡單的也是最常見的原因是忘記釋放分配給臨時緩沖區的內存空間,請看下述程序段:?
# include <stdio. h>
# include <stdlib. h>
? /*
?? *? Say hello to the user's? and put the user's name in UPPERCASE.
?? */
void SayHi( char *name )
{
????? char * UpName;
????? int a;
????? UpName = malloc(? strlen( name ) +1);
??????????????????????????? / * Allocate space for the name * /
? for( a? =0; a<strlen( name ); ++a)
????? UpName[a] = toupper( name[a]) ;
????? UpName [a] = '\0'i
????? printf("Hello, %si\n", UpName );
}
int main()
{
????? SayHi( "Dave" );
????? return( 0 );
}
這段程序中的問題是顯而易見的——它為存儲使用大寫字母的名字分配了臨時空間,但從未釋放這些空間。為了保證永遠不發生類似的情況,你可以采用這樣的方法:在分配內存的每條語句后加上相應的free語句,然后把使用這些臨時內存的語句插到這兩條語句之間。只要在程序中分配和釋放內存的語句之間沒有break,continue或goto語句,這種方法就能保證每次分配的空間在使用完后就被釋放掉。

上述方法相當繁瑣,并且不能完全避免內存漏洞的出現,因為在實際編程中,所分配的內存空間的使用時間往往是不能預測的。此外,如果操作或刪除內存空間的程序段有錯誤,也會出現內存漏洞。例如,在刪除鏈表的過程中,最后一個結點可能會丟失,或者一個指向內存空間的指針可能會被改寫。解決這類問題的辦法只能是小心謹慎地編寫程序,或者象前面提到的那樣使用相應的軟件包,或者利用語言的擴展功能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450574.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450574.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450574.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Oracle中row_number()、rank()、dense_rank() 的區別

link:https://www.cnblogs.com/qiuting/p/7880500.html轉載于:https://www.cnblogs.com/Spring-Rain/p/9716213.html

Vim使用教程(按鍵教程,映射都可以改的,持續更新)

修改映射 tnvim .vimrc 1、spaceft 調出目錄 2、controlh 跳到目錄 3、controll 跳到內容頁 4、spacekn 運行最近一個測試 5、spacekf 運行整個測試文件 6、spacekl 運行最后一個測試 7、sv 分屏 8、sq 退出分屏 9、controlp 搜索功能 10、/搜索內容 N向上…

Alpha 沖刺五

團隊成員 051601135 岳冠宇051604103 陳思孝031602629 劉意晗031602248 鄭智文031602234 王淇會議照片 項目燃盡圖 項目進展 暫無實質性進展。 項目描述 問題困擾&#xff1a; 商品分類出現困惑。交互部分向服務器發送請求失敗&#xff0c;安卓在4.0后對網絡請求有限制要求&…

什么是換碼符(escape character)?

換碼符是用來執行一個命令或一項任務的字符&#xff0c;它們不會被打印到屏幕上。例如&#xff0c;一個換碼符可以是這樣一個字符&#xff0c;它被傳遞給一個設備&#xff0c;告訴計算機屏幕以紅色而不是通常的白色來顯示下一行。這個換碼符將和真正要被設備以紅色來顯示的字符…

java日期工具類DateUtil

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 DateUtil類 [java] view plain copy package com.util; import java.text.SimpleDateFormat; import java.util.ArrayList; import…

Command 傳參的幾種方式

Command可以根據CommandParameter傳參 關鍵代碼 public ICommand SubmitCommand > _submitCommand; private RelayCommand _submitCommand new RelayCommand(new Action<object>(ShowMessage)); private static void ShowMessage(object obj) {MessageBox.Show(obj.T…

phpStorm重構快捷鍵(mac系統、持續更新)

參考 https://learnku.com/laravel/t/5420/your-keyboard-shortcuts-please 1、ctrlaltf 將表達式提取出來使其成為類的屬性&#xff0c;并自動更新引用。 2、ctrlaltp 將表達式變成由參數傳入 3、crtlF6 修改函數簽名&#xff08;函數名&#xff0c;函數參數&#xff09…

python -m xxx.py和python xxx.py的區別

先看下python -m site作用是顯示sys.path的值內容&#xff0c;也就是python搜索模塊的目錄&#xff0c;作用類似于linux下的PATH python -m SimpleHTTPServer 會在sys.path的所有路徑下查找SimpleHTTPServer.py文件&#xff1b; 而python SimpleHTTPServer.py則是在當前查找文…

C語言多維數組與多級指針

多維數組與多級指針也是初學者感覺迷糊的一個地方。超過二維的數組和超過二級的指針其實并不多用。如果能弄明白二維數組與二級指針&#xff0c;那二維以上的也不是什么問題了。所以本節重點討論二維數組與二級指針。一、二維數組 1、假想中的二維數組布局我們前面討論過&…

spring-data-jpa 使用

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 只是記錄下使用方法 &#xff1a; 1. RPC接口 service實現類調用&#xff0c;PageRequest對象會實現分頁、排序。 Overridepublic Obj…

docker的安裝與安裝mysql(mac,centos為例)

一、mac安裝docker 1、去這個網站下載安裝https://www.docker.com/get-started 2、運行docker 運行開啟docker docker run -dp 80:80 docker/getting-started 二、centos8安裝docker 1、安裝docker 下載低版本的 yum install -y docker-ce --nobest 2、安裝擴展 wget http…

配置PPPOE

先配置服務端PPPOE-Server先為路由添加一個賬號為PPP所使用[PPPOE-Server]aaa [PPPOE-Server-aaa]local-user test password cipher 123 //添加一個本地賬號[PPPOE-Server-aaa]local-user test service-type ppp//設置test賬號類型為PPP賬號[PPPOE-Server]ip pool test//添加一…

eclipse棄坑記第一篇之在idea上配置Tomcat環境并創建Javaweb項目的詳細步驟原創

IntelliJ IDEA是一款功能強大的開發工具&#xff0c;在代碼自動提示、重構、J2EE支持、各類版本工具(如git、svn、github)、maven等方面都有很好的應用。 IntelliJ IDEA有免費的社區版和付費的旗艦版。免費版只支持Java等為數不多的語言和基本的IDE特性&#xff0c;旗艦版還支持…

laravel安裝prettier,git hook代碼格式化工具

1、安裝prettier的php擴展 npm install --global prettier prettier/plugin-php 2、安裝husky&#xff0c;lint-staged&#xff08;git鉤子&#xff09;使用 npm i prettier lint-staged husky -D 3、修改package.json文件 在scripts后面添加兩個函數 "husky": …

C語言指針數組和數組指針

一、指針數組和數組指針的內存布局 初學者總是分不出指針數組與數組指針的區別。其實很好理解&#xff1a;指針數組&#xff1a;首先它是一個數組&#xff0c;數組的元素都是指針&#xff0c;數組占多少個字節由數組本身決定。它是“儲存指針的數組”的簡稱。 數組指針&#xf…

求二叉樹的高度

1 int GetHeight(BinTree BT)2 {3 int HL, HR, MaxH;4 5 if(BT)6 {7 HL GetHeight(BT->Left); //求左子樹的高度8 HR GetHeight(BT->Right); //求右子樹的高度9 MaxH (HL > HR) ? HL : HR; //取左右子樹較大的高…

Json與List的相互轉換

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 問題由來&#xff1a; 最近由于做一個項目&#xff0c;項目的一個功能就是根據Listview的內容生成一個二維碼&#xff0c;然后掃描二維…

機器學習常用模型

&#xff08;原作&#xff1a;MSRA劉鐵巖著《分布式機器學習&#xff1a;算法、理論與實踐》。這一部分敘述很清晰&#xff0c;適合用于系統整理NN知識&#xff09; 線性模型 線性模型是最簡單的&#xff0c;也是最基本的機器學習模型。其數學形式如下&#xff1a;g(X;W)WTX。有…

(轉)告別程序員生涯,一點感慨,與諸君共勉

轉自&#xff1a;https://blog.csdn.net/phphot/article/details/2230411 再過幾天&#xff0c;我就正式告別程序員生涯了&#xff0c;這也是我最后一次以職業程序員身份在CSDN發表文章。小弟談談入行幾年來的感受&#xff0c;做一個人生階段的自我總結&#xff0c;同時希望能…

C語言指針與數組之間的恩恩怨怨

很多初學者弄不清指針和數組到底有什么樣的關系。我現在就告訴你&#xff1a;他們之間沒有任何關系&#xff01;只是他們經常穿著相似的衣服來逗你玩罷了。指針就是指針&#xff0c;指針變量在32 位系統下&#xff0c;永遠占4 個byte&#xff0c;其值為某一個內存的地址。指針可…