解释:内存溢出、内存泄露、内存越界、缓冲区溢出、栈溢出 您所在的位置:网站首页 程序运行超出输出限制是什么意思 解释:内存溢出、内存泄露、内存越界、缓冲区溢出、栈溢出

解释:内存溢出、内存泄露、内存越界、缓冲区溢出、栈溢出

2024-07-11 06:30| 来源: 网络整理| 查看: 265

什么原因会造成内存越界使用呢?有以下几种情况,可供参考: 例1:         char buf[32] = {0};         for(int i=0; i 32         {             buf[i] = 'x';         }         ....         例2:         char buf[32] = {0};         string str = "this is a test sting !!!!";         sprintf(buf, "this is a test buf!string:%s", str.c_str()); //out of buffer space         ....     例3:         string str = "this is a test string!!!!";         char buf[16] = {0};         strcpy(buf, str.c_str()); //out of buffer space          类似的还存在隐患的函数还有:strcat,vsprintf等 同样,memcpy, memset, memmove等一些内存操作函数在使用时也一定要注意。          当这样的代码一旦运行,错误就在所难免,会带来的后果也是不确定的,通常可能会造成如下后果: 1.破坏了堆中的内存分配信息数据,特别是动态分配的内存块的内存信息数据,因为操作系统在分配和释放内存块时需要访问该数据,一旦该数据被破坏,以下的几种情况都可能会出现。          *** glibc detected *** free(): invalid pointer:         *** glibc detected *** malloc(): memory corruption:         *** glibc detected *** double free or corruption (out): 0x00000000005c18a0 ***         *** glibc detected *** corrupted double-linked list: 0x00000000005ab150 ***         2.破坏了程序自己的其他对象的内存空间,这种破坏会影响程序执行的不正确性,当然也会诱发coredump,如破坏了指针数据。 3.破坏了空闲内存块,很幸运,这样不会产生什么问题,但谁知道什么时候不幸会降临呢? 通常,代码错误被激发也是偶然的,也就是说之前你的程序一直正常,可能由于你为类增加了两个成员变量,或者改变了某一部分代码,coredump就频繁发生,而你增加的代码绝不会有任何问题,这时你就应该考虑是否是某些内存被破坏了。 排查的原则,首先是保证能重现错误,根据错误估计可能的环节,逐步裁减代码,缩小排查空间。 检查所有的内存操作函数,检查内存越界的可能。常用的内存操作函数: sprintf snprintf  vsprintf vsnprintf strcpy strncpy strcat  memcpy memmove memset bcopy 如果有用到自己编写的动态库的情况,要确保动态库的编译与程序编译的环境一致。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有