最近遇到一个问题,很有意思,在此记录下,以备后续参考。

程序运行异常,报错: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相关推荐

  1. HP-UX执行Oracle相关命令报错Memory fault(coredump)分析处理

    HP-UX安装Oracle 11.2.0.3单机执行任何命令均报错Memory Fault(coredump)分析解决 1. 故障现象 顺利无报错安装Oracle软件之后,执行netca.dbca等任 ...

  2. malloc()之后free报错的原因[详细解析]

    前言 今天闲着没事去敲一些简单的编程题来复习复习,结果在用free()函数的时候报错了. 由此引发了我的思考. 题目如下: 输入一串字符,以"?"结束.统计其中字母个数,数字个数, ...

  3. 【kafka】flink 发送 数据到 kafka 报错 Memory records is not writable

    1.场景1 1.1 概述 本次环境,kafka的版本为0.9.0.1,主要情况是flink写入数据到kafka shell端是可以发送的,我的程序重启后也是好的,运行一端时间后消息就发不出去了 然后程 ...

  4. 内存写越界导致破环堆结构引起的崩溃问题定位经验[如报错malloc(): memory corruption或free(): invalid next size]...

    前段时间开发的一个后端C模块上线后,线上出core,初始时,因为訪问压力不大,所以崩溃是上线3天左右出现的.当时用gdb跟进调用堆栈并检查源代码,发现出core位置的代码沒有啥问题.因为当时开发任务较 ...

  5. 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 ...

  6. 报错Native memory allocation (malloc) failed to allocate 32744 bytes for ChunkPool::allocate

    报错: Native memory allocation (malloc) failed to allocate 32744 bytes for ChunkPool::allocate 解决:

  7. idea启动报错Native memory allocation (malloc) failed to allocate

    idea启动报错Native memory allocation (malloc) failed to allocate idea启动的时候经常报内存不足.找了一些方法去设置,但是并没有什么卵用.只能 ...

  8. c语言代码re通常什么错误,C语言,realloc动态内存申请,出现报错double free or corruption (!prev)...

    程序大概如下: #include #include #include #include #include #define MALLOC(num,type) (type*)alloc((num)*siz ...

  9. 理解ASAN的shadow memory和读懂报错信息

    什么是ASAN ASAN(Address Sanitizer)是一个内存检测工具.gcc4.8版本及以上自带.支持多平台(x86, ARM, MIPS (both 32- and 64-bit ver ...

最新文章

  1. 行业深度见解•SD-WAN对于企业云的重要性
  2. python的selenium模块博客园_Python学习--Selenium模块学习(2)
  3. 捕捉mysql中不可忽视的知识点(一)
  4. 列出这周开发工作时间及内容,可以发表各种感想和这周阅读内容。
  5. QML和C ++之间的数据类型转换
  6. C++对C的加强之三目运算符功能增强
  7. Java并发包--阻塞队列(BlockingQueue)
  8. 结婚被要求写代码,到底是怎么回事。
  9. .net 下载文件几种方式
  10. nyoj--82--一笔画问题
  11. 【Flutter】Dart中的Mixins混入你知道是什么吗?
  12. Java面试宝典大集锦
  13. VC++ EasyPR车牌识别
  14. 桌面超简单小代码 bat形式
  15. sqlite3 dbconfig说明
  16. [吐血推荐]超冷笑话集锦!
  17. CDO玩“跨界”,数据驱动有戏了!
  18. 关于TI MMWAVE Demo 的一些经验
  19. 城市表层土壤重金属污染分析
  20. 大型门户网站的十四大技术

热门文章

  1. 如何让图片开口说话 3DMeNow教程
  2. usaco Cow Pedigrees
  3. java结束全部操作代码_Java创建与结束线程代码示例
  4. 小程序picker_小程序·云开发实战 - 迷你微博
  5. linux命令find的功能,linux find命令使用一览表
  6. oracle打散分组函数,oracle分组函数
  7. c++监听键盘_你会为颜值买单吗?杜伽fusion复古键盘晒单体验_键盘
  8. java 整合solr_SpringBoot整合Spring Data Solr
  9. python进程监控 supervisor_python supervisor进程监控工具的使用
  10. python做运动控制_第一课:用Python操控小龟小车运动