双倍释放或内存损坏

Double free or memory corruption

本文关键字:内存 损坏 释放      更新时间:2023-10-16

我有一个类似的代码

char *verboseBuf = NULL;
if(somethin){
    for(a loop){
        for(another loop){
            if(somethin else){
                if(curl execution){
                    if(fail){
                        verboseBuf = (char *) malloc(sizeof(char) * (currSize +1));
                        fread(verboseBuf, 1, currSize, verboseFd);
                        verboseBuf[currSize + 1] = '';
                        string verbose = verboseBuf;
                        free(verboseBuf);
                    }   
                }   
            }   
        }   
    }   
}

我唯一使用verboseBuf的地方是在最后的if循环中。但是我有

*** glibc detected *** ./test: double free or corruption (!prev): 0x13c13290 ***

但是,如果我只在一个地方使用它,怎么能两次释放它呢?每次我使用它,我都会把它释放出来。我试着使用addr2line来找到它之前被释放的地方,但得到的只是一个??:0

这一行正在写入超过缓冲区末尾的一个字节。

verboseBuf[currSize + 1] = '';

该消息并不意味着您释放了两次东西,它意味着glibc检测到堆损坏,释放两次东西是常见的原因之一,但不是唯一的原因。

在这种情况下,线路

verboseBuf[currSize + 1] = '';

溢出了缓冲区的末尾,破坏了分配器存储在它之后的任何记账数据。删除+1,它应该可以工作了。

verboseBuf[currSize + 1] = '';设为verboseBuf[currSize] = '';