当使用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
也会使错误消失。
为什么会出现这种情况?
程序格式不正确,因为使用了移动构造函数,但没有定义,这违反了One Definition规则。 扫描仪扫描仪诊断可能是由程序中的此bug引起的假阳性。
未使用复制构造函数,但它已中断,因为它可能通过空指针进行间接操作。