提问者:小点点

为什么用三元if初始化一个类会导致double-free?


当使用clang编译以下代码并启用clang-analyzer时:

#include <stdlib.h>
struct Buffer {
    unsigned char *buf;
    Buffer() : buf(0) {}
    Buffer(const Buffer &that) {
        buf = new unsigned char;
        *buf = *that.buf;
    }
    Buffer(Buffer &&);
    ~Buffer() { delete buf; }
    Buffer &operator=(const Buffer &that) = delete;
    Buffer &operator=(Buffer &&that) = delete;
};

Buffer func() {
    Buffer a;
    return a;
}

int main() { Buffer a = 1 ? func() : Buffer(); }

使用命令:

scan-build clang++ main.cc -std=c++17

将产生以下错误:

main.cc:10:17: warning: Attempt to free released memory
    ~Buffer() { delete buf; }

但是,当用buffer a=func();(没有三元if)初始化a时,错误将消失。 此外,使用-std=C++11也会使错误消失。

为什么会出现这种情况?


共1个答案

匿名用户

程序格式不正确,因为使用了移动构造函数,但没有定义,这违反了One Definition规则。 扫描仪扫描仪诊断可能是由程序中的此bug引起的假阳性。

未使用复制构造函数,但它已中断,因为它可能通过空指针进行间接操作。