《实际工作中调试问题记录》
1.malloc了一段内存,free的时候提示double free or corruption (out)后崩溃
原因是应用层malloc了一个size的堆,然后用这个buffer去ioctl驱动层复制数据。但是驱动层复制的数据大于size。导致应用层free的时候崩溃了。
问题分析:
这是典型“写越界导致堆元数据被破坏”的崩溃,不是 free 本身有问题。
- buffer = malloc(FACTORY_EEPROM_SIZE) 只分配了 N 字节
- 但 ioctl(..., GT24P_IOCTL_READ_ALL, buffer) 实际往里写了 >N 字节
- 这会把 buffer 后面的堆管理信息(chunk header/next chunk)覆盖掉
- 等到 free(buffer) 时,glibc 在做一致性检查,发现堆结构被破坏,于是报 double free or corruption 并abort
所以崩溃点在 free,根因在 越界写。
2.
浙公网安备 33010602011771号