


Linux C语言内存跨界问题概述------------王继福内存跨界问题是项目开发中难以解决的问题。下面简要介绍内存越界原因的类型,现象和原因。首先,我们必须了解进程地址空间的分配,如下所示:如果进程是多线程的,则每个线程将在用户的堆栈区域中打开自己的堆栈。了解了上面的分布图,了解了系统中每个变量和每个内存的布局,就很容易区分地址是有效地址,变量还是内存数据被破坏,您可以大致确定哪个变量或内存使用量是超出范围。 1:堆栈1:ESP寄存器始终指向堆栈的顶部2:EBP寄存器指向函数的活动记录并成为帧指针3:C语言函数在堆栈上的调用顺序是从右到右左4:如果函数返回较大的结构变量,请调用函数



的功能

应在堆栈中打开一个相同大小的空间,然后将该空间的地址作为隐式参数传递给该函数。该函数将要返回的内容复制到该地址,然后通过EAX寄存器返回该地址。下图是一个非常常见的活动记录。堆栈的基本模型总结如下:参数N↓高地址参数...将功能参数放在堆栈上的顺序与特定的调用方法有关。参数3参数2参数1 EIP返回此调用,下一条指令EBP的地址保存调用者的EBP,此时EBP指向堆栈的顶部。临时变量1临时变量2临时变量3临时变量...临时变量5↓低地址2:堆1:Malloc在内存较小时分配一小块内存

它分配在0x4000 0000的内存中,并通过brk / sbrk连续扩展。大内存块的分配是通过在大于0x4000 0000的文件映射区域中分配的mmap分配的。2:内存的大小存储在malloc分配的内存的前面,然后是空闲内存块(可以由malloc分配)调用)3:越界内存的类型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工具读取可执行文件的符号表,检查哪个变量在全局变量的前面,然后检查是否相关代码超出范围,请继续阅读
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shoujiruanjian/article-320256-1.html
习主席前脚刚离开