About "malloc(): corrupted top size"
上周碰到一个很奇怪的问题,一直出现”malloc(): corrupted top size”这个错误,导致application异常退出。反复检查malloc的size,甚至手动变化这个size的大小,还是一直出错。百思不得其解。这个周末闲来无事,认真检查了整个代码,发现竟然是之前malloc的buffer小了,导致memory操作越界,但竟然没有当场出错,而是再次的malloc的时候才报错误。示例代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
unsigned char *buff = NULL;
unsigned char *buff1 = NULL;
buff = malloc(10);
printf("%s %d\n", __func__, __LINE__);
memset(buff, 0xff, 5000);
printf("%s %d\n", __func__, __LINE__);
if (argc == 2) {
printf("%s %d\n", __func__, __LINE__);
buff1 = malloc(4);
printf("%s %d\n", __func__, __LINE__);
free(buff1);
}
free(buff);
return 0;
}
先不带参数运行:
1
2
3
# ./malloc_test
main 12
main 14
惊讶不,申请了10个字节,memset 5000个字节,竟然没有错误。随意带一个参数再运行:
1
2
3
4
5
6
# ./malloc_test 1
main 12
main 14
main 17
malloc(): corrupted top size
Aborted
这次出错了,第二次malloc没有成功,没有运行到19行打印就直接退出。
另外,博主只能用arm gcc cross compiler编译好binary在arm开发板可以重复这个问题。在Linux主机上用gcc编译,同样的程序会crash。但是把memset的size从5000改小到20,运行没有任何错误提示。同样,把5000该小到20,arm开发板上也没有错误发生。
测试程序比较简单,如果是在一个比较大的项目里,是否就此埋下了一个坑就不得而知了。总之,嵌入式开发中对memory的操作还是要小心,比如我的测试程序里就没有检查malloc是否返回了一个有效值:smirk:。
CPU: ARM Cortex-A55
Compiler: GNU Toolchain for the A-profile Architecture 8.3-2019.02
另外,把编译器换成最新的Arm GNU Toolchain 13.3,编译的时候有warning,但是,运行的时候连错误都没有……
有什么方法可以提早发现这种错误呢?
记录一下,以防遗忘。
This post is licensed under CC BY 4.0 by the author.