malloc到未初始化的内存

在最近开发过程中发现一个malloc到未初始化内存的错误.

在使用CLISH(一款命令行开源软件)的时候,每次这个程序退出的时候都会发生core dump,错误为invalid pointer: 0x00007ffff02b35d8 .

但是这个错误只在某一台机器上发生错误,在完全相同配置(软硬件)的另外一台机器的时候,并不发生错误,调整clish加载的xml文件的之后,这个错误也会消失.

通过gdb调试发现core发生在free一个ptype_t指针的时候发生的错误,并且该指针地址为一个非法地址,这个指针指向的结构是一个声明了引用,但是并没有声明定义的类型(PTYPE).

在声明这个引用的定义之后,错误会消失.

在调试过程中,在最后free之前将指针指向NULL,就不会发生core.

再最初初始化了这个类型之后,后面有很多的代码都有机会更改这个结构的指针,没办法搜寻所有代码进行分析.

最后把目光转向初始化

 

clish_ptype_t *
clish_ptype_new(const char              *name,
                const char              *help,
                const char              *pattern,
                clish_ptype_method_e     method,
                clish_ptype_preprocess_e preprocess)
{
    clish_ptype_t *this = malloc(sizeof(clish_ptype_t));
    memset(this, 0, sizeof(clish_ptype_t)); //这行是后加的

    if(NULL != this)
    {
        clish_ptype_init(this,name,help,pattern,method,preprocess);
    }
    return this;
}

 

 

这个函数初始化之后,就进行init,填充指针指向的地址,但是由于这个类型没有定义,所以有些内容就不会被填充,如果malloc的地址又是一个未初始化的地址,里面的内容就会被当成地址在最后free的时候释放,由于这个地址是非法的,所以就会发生最后的invalid pointer错误.

 

这个错误其实是配置错误,所有在xml引用的类型都应该有定义,有定义的类型都不会发生coredump

从另外一个角度讲,这个错误也是由于malloc内存之后没有进行初始化,完全信赖后面的init方法会正确进行初始化造成的, 所以这也是一个clish的bug, malloc之后一定要进行初始化, 虽然这个错误发生并不是绝对的.

既然建议所有申请的内存都要进行初始化,不知道为什么这个标准api万年不变呢?

还有一个问题就是这个内存释放发生在程序退出的时机,但是程序退出之后,所有内存都要返回给操作系统,那这个内存释放是否是画蛇添足呢?


 

你可能感兴趣的:(C/C++,debug)