当使用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; }
然而,当初始化 a
与 Buffer a = func();
(不含三元if),错误就会消失。此外,使用 -std=c++11
也使错误消失。
为什么会出现这种情况?
由于使用了move构造函数,但没有定义,这违反了一定义规则,所以程序是畸形的。程序中的这个bug可能会造成扫描器诊断为假阳性。
复制构造函数没有被使用,但它被破坏了,因为它有可能通过一个空指针间接。