C\C++中内存管理问题

使用未初始化的内存:程序中不同变量的默认初始化方式也不同,对于全局,Static变量的初始值为,而临时变量和动态分配变量的初始值为随机数,使用随机数可能会导致无法预期的错误。

内存读写越界:比如访问数组越界,访问动态分配内存大小范围外的内存,这样可能会导致非法访问,或者是无意修改其他内存空间的数据,造成运行时错误。后果很严重。

内存覆盖:常见的C语言内存操作函数 strcpy, strncpy, memcpy, strcat,可以直接对内存操作,如果大小控制不好的话,很可能会导致覆盖掉非预期的内存空间的数据。缓冲区      溢出漏洞往往正是利用这点,后续日志中,我会详细介绍缓冲区溢出的原理,漏洞的探测和利用,以及从编码级别上的一些防护。

动态内存管理错误:常见的内存分配有三种,分为静态,栈上分配,堆上分配。静态分配即在编译是就被分配了空间,比如已初始化的变量一般放在ELF文件的.data段,不过在运行时还是保存在栈中。未初始化的全局变量,在ELF文件中仅仅是个.bss段的占位符(ELF文件格式,相关工具后续日志中汇相继介绍)。函数的局部变量属于栈上分配,大小视变量类型。比较灵活的内存分配方法属于堆上分配,常见的函数malloc, alloc, realloc, new等,动态释放函数包括free, delete。这里面需要注意的是动态内存管理师需要用户自己来管理,常见的内存动态管理错误有:

    • 申请和释放不一致:C++和C语言中的内存分配和释放函数不能混用。
    • 申请和释放不匹配:申请多少内存,用完后要释放掉,少释放容易导致内存泄露多释放也会产生问题(什么问题)。
    • 读写以释放的内存

    内存泄露:什么事内存泄露?内存泄露指的是,在程序中动态申请的内存,在使用完后既没有释放,又无法被程序的其他部分访问。

posted @ 2011-09-27 16:07  今夕何夕的何夕  阅读(377)  评论(0编辑  收藏  举报