malloc为什么会报错:memory corruption
最近遇到一个问题,很有意思,在此记录下,以备后续参考。
程序运行异常,报错:malloc: memory corruption.
用gdb 调试程序,bt 如下,程序在申请344 bytes内存时失败。
疑问:344bytes内存并不大,为何会失败呢?
进一步,打开AddressSanitizer,重选编译并运行程序,AddressSanitizer报错如下,报错内容分3部分贴出如下(信息安全,隐藏掉部分堆栈信息):
1. 重点:红色字体:heap-buffer-overflow on address 0xf3805ef0, 蓝色字体, WRITE of size 4 at 0xf3805ef0
解释:堆溢出,在*.c的211行对0xf3805ef0地址非法写,尝试写4个byte.
2.绿色字体:0xf3805ef0 is located 192 byte to the right of 688-byte regin [0xf3805b80,0xf3805e30)
在*.c的507行分配了688个byte - 对应内存区域[0xf3805b80,0xf3805e30), 程序非法访问的地址0xf3805ef0 位于此内存区域右侧的192个byte的位置。
3. Summary.
分析过程不必赘述,我把结论写一下:
1. 在*.c的507行分配了688个byte - 对应内存区域[0xf3805b80,0xf3805e30)
分析code, 发现这里是分配了2个结构体struct M,sizeof(struct M) = 344.
typedef struct M
{...int data;...
} M_t
2. 在*.c的211行对0xf3805ef0地址非法写,尝试写4个byte.
查看code,在211行尝试写一个struct M的成员data, 而data成员之前结构体成员的长度为192.
注意cellGroupId的offset 和 size.
回味下面ASAN的提示:
0xf3805ef0 is located 192 byte to the right of 688-byte regin [0xf3805b80,0xf3805e30)
由此可以推测:程序动态分配了2个struct M, 由于code 存在bug, 却访问了第三个struct M.
最后进一步debug,发现程序确实是指针操作出错,访问了2个struct M后面的内存。
思考:malloc失败 与 AddressSanitizer: heap-buffer-overflow
没有开启AddressSanitizer时,程序写struct M的成员data时并没有直接报错,而是延迟到再次malloc内存时报错?
个人认为如下:
1. 程序非法写struct M的成员data,0xf3805ef0 地址位于堆上,此地址是可写的。(如果是访问.text代码段地址的话,程序是会马上终止的。)
2. malloc时,我推测内存管理模块会check将要分配出的内存区域是否正常。 怎么检查:比如,没有分配出的内存区域设置为默认值或者魔数,如果发现有其它的非法值存在,就发生了非法写,也就是说此内存还没有被分配出去,就已经有code 对其做了写操作。
根据之前内存池管理(https://blog.csdn.net/wowricky/article/details/83218126)的经验, 内存管理模块会在malloc和free时对内存区域进行检查,如果存在异常会直接报错memory corruption。所以malloc时的内存报错,通常是由于之前的内存越界访问导致的,这种问题通常比较难以定位。我碰到的这个问题比较幸运,非法访问地址0xf3805ef0 是前一个动态内存区域[0xf3805b80,0xf3805e30) 操作不当导致的。
malloc为什么会报错:memory corruption相关推荐
- HP-UX执行Oracle相关命令报错Memory fault(coredump)分析处理
HP-UX安装Oracle 11.2.0.3单机执行任何命令均报错Memory Fault(coredump)分析解决 1. 故障现象 顺利无报错安装Oracle软件之后,执行netca.dbca等任 ...
- malloc()之后free报错的原因[详细解析]
前言 今天闲着没事去敲一些简单的编程题来复习复习,结果在用free()函数的时候报错了. 由此引发了我的思考. 题目如下: 输入一串字符,以"?"结束.统计其中字母个数,数字个数, ...
- 【kafka】flink 发送 数据到 kafka 报错 Memory records is not writable
1.场景1 1.1 概述 本次环境,kafka的版本为0.9.0.1,主要情况是flink写入数据到kafka shell端是可以发送的,我的程序重启后也是好的,运行一端时间后消息就发不出去了 然后程 ...
- 内存写越界导致破环堆结构引起的崩溃问题定位经验[如报错malloc(): memory corruption或free(): invalid next size]...
前段时间开发的一个后端C模块上线后,线上出core,初始时,因为訪问压力不大,所以崩溃是上线3天左右出现的.当时用gdb跟进调用堆栈并检查源代码,发现出core位置的代码沒有啥问题.因为当时开发任务较 ...
- git 大文件报错Out of memory, malloc failed、 The remote end hung up unexpectedly
git clone出现 "fatal: The remote end hung up unexpectedly" 设置 git config --global http.post ...
- 报错Native memory allocation (malloc) failed to allocate 32744 bytes for ChunkPool::allocate
报错: Native memory allocation (malloc) failed to allocate 32744 bytes for ChunkPool::allocate 解决:
- idea启动报错Native memory allocation (malloc) failed to allocate
idea启动报错Native memory allocation (malloc) failed to allocate idea启动的时候经常报内存不足.找了一些方法去设置,但是并没有什么卵用.只能 ...
- c语言代码re通常什么错误,C语言,realloc动态内存申请,出现报错double free or corruption (!prev)...
程序大概如下: #include #include #include #include #include #define MALLOC(num,type) (type*)alloc((num)*siz ...
- 理解ASAN的shadow memory和读懂报错信息
什么是ASAN ASAN(Address Sanitizer)是一个内存检测工具.gcc4.8版本及以上自带.支持多平台(x86, ARM, MIPS (both 32- and 64-bit ver ...
最新文章
- 行业深度见解•SD-WAN对于企业云的重要性
- python的selenium模块博客园_Python学习--Selenium模块学习(2)
- 捕捉mysql中不可忽视的知识点(一)
- 列出这周开发工作时间及内容,可以发表各种感想和这周阅读内容。
- QML和C ++之间的数据类型转换
- C++对C的加强之三目运算符功能增强
- Java并发包--阻塞队列(BlockingQueue)
- 结婚被要求写代码,到底是怎么回事。
- .net 下载文件几种方式
- nyoj--82--一笔画问题
- 【Flutter】Dart中的Mixins混入你知道是什么吗?
- Java面试宝典大集锦
- VC++ EasyPR车牌识别
- 桌面超简单小代码 bat形式
- sqlite3 dbconfig说明
- [吐血推荐]超冷笑话集锦!
- CDO玩“跨界”,数据驱动有戏了!
- 关于TI MMWAVE Demo 的一些经验
- 城市表层土壤重金属污染分析
- 大型门户网站的十四大技术
热门文章
- 如何让图片开口说话 3DMeNow教程
- usaco Cow Pedigrees
- java结束全部操作代码_Java创建与结束线程代码示例
- 小程序picker_小程序·云开发实战 - 迷你微博
- linux命令find的功能,linux find命令使用一览表
- oracle打散分组函数,oracle分组函数
- c++监听键盘_你会为颜值买单吗?杜伽fusion复古键盘晒单体验_键盘
- java 整合solr_SpringBoot整合Spring Data Solr
- python进程监控 supervisor_python supervisor进程监控工具的使用
- python做运动控制_第一课:用Python操控小龟小车运动