Linux C语言 内存越界问题总结.doc_第1页
Linux C语言 内存越界问题总结.doc_第2页
Linux C语言 内存越界问题总结.doc_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Linux C语言 内存越界问题总结 内存越界问题是项目开发中比较难解决的问题,下面就简单的描述下内存越界的种类、现象及引起的原因。首先要明白进程地址空间的分配如下图: 如果进程是多线程的,则每个线程都会在用户的栈区开辟一个自己的栈。了解的上述分布图,知道每个变量、每块内存在系统中的布局,很容易区分一个 地址是否为有效地址,一个变量或者内存的数据被破坏了可以大致判断出是那个变量或者内存使用越界了。一:栈 1 :ESP寄存器始终指向栈的顶部 2:EBP寄存器指向函数的一个活动记录成为帧指针 3:C语言函数调用入栈的顺序是从右向左 4:如果函数返回一个大的结构体变量,调用该函数的函数要在栈中开辟一个同样大小的空间,然后把该空间的地址作为一个隐式参数传递给该函数,该函数将需要返回的内容拷贝到该地址,然后通过EAX寄存器返回该地址 下图是一个很常见的活动记录。总结栈的基本模型如下:参数N高地址参数函数参数入栈的顺序与具体的调用方式有关参数 3参数 2参数 1EIP返回本次调用后,下一条指令的地址EBP保存调用者的EBP,然后EBP指向此时的栈顶。临时变量1临时变量2临时变量3临时变量临时变量5低地址二:堆 1:malloc 分配小块内存时是在小于0x4000 0000的内存中分配的,通过brk/sbrk不断向上扩展。分配大块内存是是通过mmap分配在大于0x4000 0000的文件映射区。 2:malloc分配的内存前面存放该内存的大小,后面是空闲内存块(可能会被malloc调用分配出去)三:内存越界的种类1:栈溢出: 主要现象:(1):某些全局变量被修改 (2):某些任务不能正常工作函数调用不正常 (3):某些局部变量被修改 主要原因:(1):线程堆栈开辟的太小 (2):定义的太大的局部变量 (3):函数调用太深2:堆栈内部越界 主要现象:(1):某些局部变量被修改 (2):函数返回的时候死机 主要原因:(1):临时变量或者数组越界3:全局变量或者动态分配的内存越界主要现象:(1):全局变量被修改 (2):内存泄漏(如果动态分配的内存越界,有可能导致被越界的内存无法释放或者不能全部释放)主要原因:全局或者动态分配的内存越界。一些容易引起内存越界的操作:1:注意strcpy sprintf memcpy 函数目的缓冲区的大小2:strncpy strcpy 目的缓冲区的大小及源缓冲区是否以0结尾3:还要注意数组的大小、循环的次数4:链表的头部和尾部在处理插入和删除节点时的操作注:如果是全局变量被越界,可

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论