C 언어의 일반적인 메모리 응용 기능에는 malloc()
, realloc()
, calloc()
, 비록 기능은 다르지만 모두 동일한 메모리 해제 기능에 해당합니다. free()
, C++의 메모리 애플리케이션 및 릴리스는 신규/삭제, 신규 []/delete[] 메소드를 채택합니다. C 언어이든 C++ 언어이든 상관없이 소스 코드를 작성할 때 잘못된 메모리 해제를 사용하지 않으려면 다양한 메모리 적용 방법에 따라 메모리 해제 방법을 선택해야 합니다. 예: C/C++ 메모리 할당/해제 혼합 사용 또는 스칼라 및 벡터 메모리 할당/해제 혼합 사용. malloc()
、 realloc()
、 calloc()
,它们虽然功能不同,但都对应同一个内存释放函数 free()
,C++中对内存的申请和释放采用new/delete、new []/delete[] 方式。不管是 C 语言还是 C++ 语言,当编写源代码时要根据内存申请的方法不同来对应地选择内存释放方法,避免使用错误的内存释放。例如:混合使用C/C++的内存申请/释放,或混合使用标量和矢量的内存申请/释放。
错误地释放内存可能会导致程序出现意料之外的错误行为,甚至导致程序崩溃。在《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)。 |
示例源于 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。
在上述示例代码中,第31行使用 new[]
创建对象数组,在第34行使用 delete
进行释放,由于在释放对象数组时,没有使用 new[]
对应的 delete[]
,因此存在“错误的内存释放方法”问题。
使用代码卫士对上述示例代码进行检测,可以检出“错误的内存释放方法”缺陷,显示等级为中。如图1所示:
图1:错误的内存释放方法的检测示例
在上述修复代码中,Samate 给出的修复方式为:在第31行通过 new[]
创建对象数组,并在第33行使用 delete[]
2. 잘못된 메모리 해제 방법의 피해
잘못된 메모리 해제는 프로그램에 예상치 못한 잘못된 동작을 일으키거나 프로그램이 중단될 수도 있습니다. "Effective C++ (Second Edition)"의 항목 5 "해당 new 및 delete는 동일한 형식을 채택해야 합니다"는 다음과 같이 지적합니다. "객체의 요소가 잘못 해제되면 전체 객체 또는 심지어 전체 메모리 구조가 힙이 손상되어 메모리 누수 또는 프로그램 충돌이 발생합니다."
CVE | 취약점 개요 |
---|---|
CVE-2018-14948 | dilawar sound2017-11의 wav-file.cc 파일에 오류가 있습니다. -27 및 이전 버전 메모리 해제 방법 취약점(new[]/delete). |
CVE-2018-14947 | PDF2JSON 버전 0.69에 있는 XmlFonts.cc 파일의 'XmlFontAccu::CSStyle' 함수에는 잘못된 메모리 릴리스 취약점이 있습니다. (새로 만들기[]/삭제). |
CVE-2018-14946 | PDF2JSON 버전 0.69의 ImgOutputDev.cc 파일에는 HtmlString 클래스에 잘못된 메모리 메서드 취약점(malloc/delete)이 있습니다. . |
new[]
를 사용하여 객체 배열을 생성합니다. 34행에서는 해제를 위해 delete
를 사용합니다. 객체 배열을 해제할 때 new는 사용되지 않습니다. []
는 삭제[]
에 해당하므로 "잘못된 메모리 해제 방법" 문제가 있습니다. 🎜🎜Code Guard를 사용하여 위의 샘플 코드를 감지하면 "잘못된 메모리 해제 방법" 결함을 감지할 수 있으며 표시 수준은 중간입니다. 그림 1과 같이: 🎜🎜🎜🎜🎜그림 1: 잘못된 메모리 해제 방법 감지 예🎜delete[ on line 33 ]
를 사용하여 해제합니다. 이렇게 하면 잘못된 메모리 해제 방법을 피할 수 있습니다. 🎜🎜Code Guard를 사용하여 복구된 코드를 감지하면 "잘못된 메모리 해제 방법" 결함이 더 이상 존재하지 않는 것을 확인할 수 있습니다. 그림 2에 표시된 대로: 🎜🎜🎜🎜🎜🎜그림 2: 수리 후 감지 결과🎜🎜🎜4. 잘못된 메모리 해제 방법을 방지하는 방법🎜🎜🎜잘못된 메모리 해제 방법을 방지하려면 다음 사항에 주의해야 합니다. :🎜🎜(1 ) 메모리를 해제할 때 복잡한 프로그램 구조와 인력부주의로 인해 잘못된 해제 방법을 사용하는 것을 방지하기 위해 메모리 적용에 사용되는 방법을 명확히 합니다. 🎜🎜(2) 소스 코드 정적 분석 도구를 사용하면 이러한 유형의 문제를 효과적으로 감지할 수 있습니다. 🎜위 내용은 [Defect Weekly] Issue 31: 잘못된 메모리 릴리스의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!