You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

malloc报错‘corrupted top size’原因排查求助

问题排查:malloc: corrupted top size 错误分析

问题描述

开发小型项目时,间接调用下述函数后出现malloc: corrupted top size错误。已用Valgrind定位到函数中的fread操作,但未发现代码问题,询问是否忽略细节或需从其他方向排查。

问题函数:

bmpHead_t* readBMPHeader(FILE* inputFile){
    checkBMPFile(inputFile);
    bmpHead_t* newHeader = malloc(sizeof(bmpHead_t));
    int headerSize = sizeof(bmpHead_t) / 2;
    uint16_t* wordBuff = malloc(headerSize);
    fseek(inputFile, 0, SEEK_SET);
    fread(wordBuff, sizeof(uint16_t), headerSize, inputFile);
    newHeader->signature[0] = (uint8_t)((wordBuff[0] & 0xFF00) >> 8);
    newHeader->signature[1] = (uint8_t)(wordBuff[0] & 0xFF);
    uint32_t tmp = ((uint32_t)wordBuff[2] << 16) | wordBuff[1];
    newHeader->fileSize = tmp;
    newHeader->reserved1 = wordBuff[3];
    newHeader->reserved2 = wordBuff[4];
    tmp = ((uint32_t)wordBuff[6] << 16) | wordBuff[5];
    newHeader->offToPixels = tmp;
    return newHeader;
}

补充说明:读取的是Windows的BITMAPFILEHEADER结构。


核心问题:内存分配错误

你忽略了malloc参数的字节数计算逻辑,这是导致堆损坏的直接原因:

  • uint16_t* wordBuff = malloc(headerSize); 此处headerSize是sizeof(bmpHead_t)/2,代表需要的uint16_t元素个数,但malloc的参数要求是字节数而非元素个数。正确的分配应为malloc(headerSize * sizeof(uint16_t)),否则你仅分配了headerSize个字节,远小于实际需要的内存(每个uint16_t占2字节)。
  • 这种缓冲区溢出会破坏堆的元数据,触发malloc: corrupted top size错误,Valgrind定位到fread是因为溢出行为发生在写入缓冲区的过程中。

其他需修复的细节

  1. 检查fread返回值:fread返回成功读取的元素个数,若返回值小于headerSize,说明读取失败,后续操作会使用未初始化或错误的数据,进一步引发异常。
  2. 修复内存泄漏:函数中wordBuff分配后未释放,会造成内存泄漏,需在return前添加free(wordBuff);。

其他排查方向(若修复后仍有问题)

  • 检查checkBMPFile函数是否修改了文件指针位置或损坏了文件流状态,导致后续fread行为异常。
  • 确认bmpHead_t的定义是否与BITMAPFILEHEADER完全匹配(包括成员类型、字节对齐规则),若结构定义错误,会导致sizeof(bmpHead_t)计算偏差,进而引发后续内存分配和数据解析错误。
  • 检查调用readBMPHeader的代码是否正确处理返回指针,比如是否存在重复释放、越界访问newHeader的情况。

内容的提问来源于stack exchange,提问作者YourAverageYeet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 08:13:15