C语言源码二次释放的危害是什么


今天给大家介绍一下C语言源码二次释放的危害是什么。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。二次释放简单理解就是对同一个指针指向的内存释放了两次,针对C语言源代码,对同一个指针进行两次free()操作,可能导致二次释放,本文3.1章节的缺陷代码就是对这类情况的描述。在C++语言中,浅拷贝操作不当是导致二次释放常见原因之一。如:调用一次赋值运算符或拷贝构造函数将会导致两个对象的数据成员指向相同的动态内存。此时引用计数机制变得非常重要,当引用计数不当时,一个对象超出作用域时,析构函数将会释放这两个对象共享的内存。另一个对象中对应的数据成员将会指向已经释放的内存地址,而当这个对象也超出作用域时,它的析构函数试图再次释放这块内存,导致二次释放问题。详细请参见CWE ID 415: Double Free。二次释放内存可能导致应用程序崩溃、拒绝服务攻击等问题,是 C/C++ 中常见的漏洞之一。2018年1月至11月,CVE中共有38条漏洞信息与其相关。部分漏洞如下:示例源于Samate Juliet Test Suite for C/C++ v1.3 (https://samate.nist.gov/SARD/testsuite.php),源文件名:CWE415_Double_Fr免费云主机域名ee__malloc_free_char_17.c。
在上述示例代码中,在第32行使用 malloc()进行内存分配,并在第36行使用free()对分配的内存进行了释放,在第38行 for 循环语句中,又对已经释放的内存 data 进行了一次释放,导致二次释放问题。使用360代码卫士对上述示例代码进行检测,可以检出“二次释放”缺陷,显示等级为中。如图1所示:图1:二次释放检测示例
在上述修复代码中,Samate 给出的修复方式为: 在第32行使用 malloc() 进行内存分配,并在第36行处使用 free() 进行释放,释放后不在对该内存进行释放操作。使用360代码卫士对修复后的代码进行检测,可以看到已不存在“二次释放”缺陷。如图2:
图2:修复后检测结果4、如何避免二次释放要避免二次释放,需要注意以下几点:(1)野指针是导致二次释放和释放后使用的重要原因之一,消除野指针的有效方式是在释放指针之后立即把它设置为NULL 或者设置为指向另一个合法的对象。(2)针对 C++ 浅拷贝导致的二次释放问题,始终执行深拷贝是不错的解决方案。(3)使用源代码静态分析工具,可以自动化的发现程序中可能存在的二次释放问题。以上就是C语言源码二次释放的危害是什么的全部内容了,更多与C语言源码二次释放的危害是什么相关的内容可以搜索云编程开发博客之前的文章或者浏览下面的文章进行学习哈!相信小编会给大家增添更多知识,希望大家能够支持一下云编程开发博客!

相关推荐: 域名后缀有什么区别

域名后缀有什么区别?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。域名后缀有什么区别1..com域名,commercial简称,初期表示商业机构注册使用此域名的目的,不过现在个免费云主机域名人、…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 02/07 12:24
下一篇 02/07 12:24