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
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

Atom編輯器mac版下載
最受歡迎的的開源編輯器

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Dreamweaver CS6
視覺化網頁開發工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。