一、粗略了解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的发生,只能说有点惊险。

参考链接:

http://www.c4learn.com/c-programming/c-mistakes/pointer/

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐