《Linu C语言 内存越界问题总结》由会员分享,可在线阅读,更多相关《Linu C语言 内存越界问题总结(3页珍藏版)》请在金锄头文库上搜索。
1、Linux C 语言 内存越界问题总结内存越界问题是项目开发中比较难解决的问题,下面就简单的描述下内存越 界的种类、现象及引起的原因。首先要明白进程地址空间的分配如下图:H 丁态不可见从可执行文件加载如果进程是多线程的,则每个线程都会在用户的栈区开辟一个自己的栈。了解的上述分布图,知道每个变量、每块内存在系统中的布局,很容易区分一 个 地址是否为有效地址,一个变量或者内存的数据被破坏了可以大致判断出是 那个变量或者内存使用越界了。一:栈1 : ESP 寄存器始终指向栈的顶部2:EBP 寄存器指向函数的一个活动记录成为帧指针3:C 语言函数调用入栈的顺序是从右向左4:如果函数返回一个大的结构体变
2、量,调用该函数的函数要在栈中开辟一 个同样大小的空间,然后把该空间的地址作为一个隐式参数传递给该函数,该函 数将需要返回的内容拷贝到该地址,然后通过EAX寄存器返回该地址下图是一个很常见的活动记录。参数返回地址ebp Old EBP保存的寄存器局部变量活动记录其他数据esp J总结栈的基本模型如下:参数N(高地址参数函数参数入栈的顺序与具体的调用参数3方式有关参数2参数1EIP返回本次调用后,下一条指令的地址EBP保存调用者的EBP,然后EBP指向此 时的栈顶。临时变量1临时变量2临时变量3临时变量临时变量5(低地址二:堆1:malloc 分配小块内存时是在小于 0x4000 0000 的内存
3、中分配的,通过 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:链表的头部和尾部在处理插入和删除节点时的操作注:如果是全局变量被越界,可以用 readelf 工具读出可执行文件的符号表,看 下该全局变量前面的变量是哪个,然后看下相关代码是否有越界的情况。