【缺陷周话】第31期:错误的内存释放

这篇文章主要为大家分析了【缺陷周话】第31期:错误的内存释放的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“【缺陷周话】第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-14948dilawar sound2017-11-27 及之前版本中的 wav-file.cc文件存在错误的内存释放方法漏洞 (new[]/delete)。
CVE-2018-14947PDF2JSON 0.69 版本中的 XmlFonts.cc 文件的‘XmlFontAccu::CSStyle’函数存在错误的内存释放漏洞(new[]/delete)。
CVE-2018-14946PDF2JSON 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期:错误的内存释放

在上述示例代码中,第31行使用 new[] 创建对象数组,在第34行使用 delete 进行释放,由于在释放对象数组时,没有使用 new[] 对应的 delete[],因此存在“错误的内存释放方法”问题。

使用代码卫士对上述示例代码进行检测,可以检出“错误的内存释放方法”缺陷,显示等级为中。如图1所示:

【缺陷周话】第31期:错误的内存释放

图1:错误的内存释放方法的检测示例

3.2 修复代码

【缺陷周话】第31期:错误的内存释放

在上述修复代码中,Samate 给出的修复方式为:在第31行通过 new[] 创建对象数组,并在第33行使用 delete[] 进行释放。从而避免了错误的内存释放方法。

使用代码卫士对修复后的代码进行检测,可以看到已不存在“错误的内存释放方法”缺陷。如图2:

【缺陷周话】第31期:错误的内存释放

图2:修复后检测结果

4、  如何避免错误的内存释放方法

要避免错误的内存释放方法,需要注意以下几点:

(1)在进行内存释放时,明确内存申请使用的方法,避免由于程序结构复杂、人员疏忽而导致使用了错误的释放方法。

(2)使用源代码静态分析工具,可以有效对该类问题进行检测。

关于“【缺陷周话】第31期:错误的内存释放”就介绍到这了,更多相关内容可以搜索创新互联以前的文章,希望能够帮助大家答疑解惑,请多多支持创新互联网站!


当前文章:【缺陷周话】第31期:错误的内存释放
标题路径:http://scyanting.com/article/gpshdo.html