【缺陷週話】第31期:錯誤的記憶體釋放
1、錯誤的記憶體釋放方法
C語言中常見的記憶體申請函數包括malloc()
、 realloc()
、 calloc()
,它們雖然功能不同,但都對應同一個記憶體釋放函數free()
,C 中對記憶體的申請和釋放採用new/delete、new [] /delete[] 方式。不管是 C 語言還是 C 語言,當編寫原始程式碼時要根據記憶體申請的方法不同來對應地選擇記憶體釋放方法,避免使用錯誤的記憶體釋放。例如:混合使用C/C 的記憶體申請/釋放,或混合使用標量和向量的記憶體申請/釋放。
2、 錯誤的記憶體釋放方法的危害
錯誤地釋放記憶體可能會導致程式出現意料之外的錯誤行為,甚至導致程式崩潰。在《effective C (第二版)》條目5「對應的new 和delete 要採用相同形式」中指出:「如果錯誤地釋放物件中的元素,可能造成整個物件、甚至整個堆上的記憶體結構都會發生損壞,從而發生記憶體洩漏,甚至導致程式崩潰」。
在CVE資料庫中,也有與此相關的漏洞資訊。自2018年1月至2019年4月,CVE資料庫中共有3個相關漏洞資訊。漏洞資訊如下:
#CVE | 漏洞概況 |
---|---|
CVE-2018-14948 | dilawar sound2017-11-27 及先前版本中的wav-file.cc檔案存在錯誤的記憶體釋放方法漏洞(new[]/delete) 。 |
CVE-2018-14947 | PDF2JSON 0.69 版本中的XmlFonts.cc 檔案的'XmlFontAccu::CSStyle'函數有錯誤的記憶體釋放漏洞(new[] /delete)。 |
CVE-2018-14946 | PDF2JSON 0.69 版本中的 ImgOutputDev.cc 檔案的 HtmlString 類別存在錯誤的記憶體方法漏洞 (malloc/delete)。 |
3、範例程式碼
範例源自於Samate Juliet Test Suite for C/C v1.3 (https:// samate.nist.gov/SARD/testsuite.php),原始檔名:CWE762_Mismatched_Memory_Management_Routines__new_array_delete_char_01.cpp。
3.1缺陷程式碼
#在上述範例程式碼中,第31行使用new[]
創建物件數組,在第34行使用delete
進行釋放,由於在釋放物件數組時,沒有使用new[]
對應的delete[]
,因此存在“錯誤的記憶體釋放方法”問題。
使用程式碼衛兵對上述範例程式碼進行偵測,可以檢出「錯誤的記憶體釋放方法」缺陷,顯示等級為中。如圖1所示:
圖1:錯誤的記憶體釋放方法的偵測範例
3.2 修正程式碼
在上述修復程式碼中,Samate 給出的修復方式為:在第31行透過new[]
建立物件數組,並在第33行使用delete[]
進行釋放。從而避免了錯誤的記憶體釋放方法。
使用程式碼衛士對修復後的程式碼進行偵測,可以看到已不存在「錯誤的記憶體釋放方法」缺陷。如圖2:
圖2:修正後偵測結果
4、 如何避免錯誤的記憶體釋放方法
要避免錯誤的記憶體釋放方法,需要注意以下幾點:
(1)在進行記憶體釋放時,明確記憶體申請使用的方法,避免由於程式結構複雜、人員疏忽而導致使用了錯誤的釋放方法。
(2)使用原始碼靜態分析工具,可以有效對此類別問題進行偵測。
以上是【缺陷週話】第31期:錯誤的記憶體釋放的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

1.錯誤的記憶體釋放方法C語言中常見的記憶體申請函數包括malloc()、realloc()、calloc(),它們雖然功能不同,但都對應同一個記憶體釋放函數free(),C++中對記憶體的申請和釋放採用new/delete、new[]/delete[]方式。不管是C語言還是C++語言,當編寫原始碼時要根據記憶體申請的方法不同來對應地選擇記憶體釋放方法,避免使用錯誤的記憶體釋放。例如:混合使用C/C++的記憶體申請/釋放,或混合使用標量和向量的記憶體申請/釋放。 2.錯誤的記憶體釋放方法的危害使用錯誤的記憶體釋放方法,

PHP程式碼審計技術和實用工具推薦概述:隨著互聯網的快速發展,網站的安全問題變得日益突出。而PHP作為一種廣泛應用於網路開發的語言,其程式碼安全審計成為非常重要的一環。本文將介紹PHP程式碼審計的一些基本技術並推薦幾款實用的工具。一、程式碼審計技術掃描敏感函數在PHP程式碼審計中,首先需要關注的是敏感函數的使用。例如,eval()函數可以執行任意傳入的程式碼,因此

如何使用Python進行軟體程式碼審計隨著軟體應用的快速發展,程式碼的品質和安全問題也日益受到關注。程式碼審計是一種評估和檢查程式碼品質、發現潛在漏洞和安全性問題的過程。 Python作為一種靈活且功能豐富的程式語言,被廣泛應用於程式碼審計的實踐中。本文將簡要介紹如何使用Python進行軟體程式碼稽核。一、了解程式碼審計的基本概念在進行程式碼審計之前,我們首先需要了解代碼審計的

隨著網路安全意識的提高和駭客攻擊手段的不斷升級,網站安全問題已成為企業與個人不可迴避的問題。在這個問題特別嚴峻的時代,PHP作為一種流行的Web開發語言,越來越多的企業或個人透過PHP來開發自己的網站。而為了確保PHP網站的安全性,程式碼審計是不可或缺的一個環節。什麼是代碼審計?程式碼審計是透過對網站程式碼進行分析,找出其中的安全漏洞的過程。這是一種系統性的、深入

如何處理PHP開發中的程式碼審計和漏洞修復隨著互聯網的快速發展,PHP作為一種廣泛應用的程式語言,在網站和應用程式的開發中佔據著重要地位。然而,由於其開源的特性,PHP程式碼也容易被駭客利用,造成安全漏洞。對於PHP開發者而言,程式碼審計和漏洞修復是必須重視的問題。本文將詳細介紹如何處理PHP開發中的程式碼審計和漏洞修復,並附上具體的程式碼範例。一、代碼審計代碼審

隨著網路技術的不斷發展,各種應用程式逐漸成為生活中不可或缺的一部分。而PHP作為一種廣泛應用於Web開發的程式語言,在眾多應用程式中也扮演著重要的角色。然而,對於PHP程式碼的安全性,經常被忽視和忽略。對於駭客和攻擊者來說,PHP應用程式成為攻擊的目標,而如何防範和預防攻擊,則需要進行PHP程式碼審計。什麼是PHP程式碼審計? PHP程式碼審計是指透過檢查PHP程式碼,

PHP是一種廣泛使用的伺服器端腳本語言,廣泛應用於Web開發和動態網站建置。然而,隨著網路的快速發展和網路安全威脅的增加,安全問題也逐漸被廣大開發者重視。在PHP開發中,安全程式碼審計技術扮演著至關重要的角色。本文將深入探討PHP中的安全程式碼稽核技術解析,幫助開發者更好地保護自己的應用程式。首先,我們需要理解什麼是安全代碼審計。安全代碼審計是指對代碼進行全

如何進行PHP後端功能開發的安全防護?隨著網路的普及和相關技術的快速發展,PHP作為一種被廣泛採用的後端開發語言,使用者也越來越多。然而,隨之而來的安全問題也變得不容忽視。為了保護使用者資料和防止惡意攻擊,開發人員需要重視PHP後端功能開發的安全性。本文將介紹一些PHP後端功能開發中常見的安全防護措施,並給出對應的程式碼範例。輸入驗證和資料過濾在接收和處理用戶
