C++ free(): invalid size 问题排查过程记录
一、粗略了解bug基本情况从截图可看出,错误原因为free():invalid size xxxxx我去网上搜索了下这个错误,https://stackoverflow.com/questions/18990767/free-ptr-error-invalid-size初步结论:动态申请的内存结构被破坏了二、从堆栈角度看问题是json::JsonWriter对象内部的string变量在析构时(即~
一、粗略了解bug基本情况

从截图可看出,错误原因为free():invalid size xxxxx
我去网上搜索了下这个错误,https://stackoverflow.com/questions/18990767/free-ptr-error-invalid-size
初步结论:动态申请的内存结构被破坏了
二、从堆栈角度看问题

是json::JsonWriter对象内部的string变量在析构时(即~basic_string出问题),可能是此接口被内存越界写了!!!
三、从源代码角度看问题

从源代码角度来看,貌似没有啥导致函数堆栈溢出的契机,上招数,我们先试图把问题逐步简化下。
将代码的逻辑简单抽象下,如下
void FuncA()
{
uint64_t name;
uint32_t age;
//json::JsonWriter 变量
//调用封装函数,内部是msgrecv和msgsend
Execute();
json::JsonWriter writer; //报错信息,writer变量中的string成员在析构时报错
}
比较有意思的是,此错误有几个特点
1.在release和debug模式下不同平台下的bug情况
| 平台 | debug | release |
|---|---|---|
| intel平台 | 无 | 无 |
| arm平台 | 有 | 无 |
这种错误应该是函数堆栈溢出,但是至于是如何造成堆栈溢出的,一直没找不到原因。
四、bug产生的原因
我以前处理过的堆栈溢出,一般都是几种情况
1.函数内数组写越界了
2.memcpy写越界了
3.写文件缓存区buffer时,写越界了
但是在代码中调用了Execute函数,这个函数中使用了msgsnd和msgrecv函数,查看这两个函数的man文档,终于发现了问题
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,
int msgflg);

msgsz:传递的是mtext的长度,而不是总长度,但是公司代码传递的长度是总长度,导致调用函数后写入数据的长度大于正常值(多写了4个字节或8个字节)。
至于为啥在intel平台下debug和release模式下都无此bug,估计是每个函数栈的尾部会预留一部分长度来防止写越界,而我们写入的4个字节或8个字节刚好在函数栈预留的长度范围内,所以没有导致bug的发生,只能说有点惊险。
参考链接:
更多推荐


所有评论(0)