【发布时间】:2021-06-28 09:25:00
【问题描述】:
作为一个糟糕的c++程序员,我今天遇到了这个segfault:一个未初始化的shared_ptr 给了一个NULL,我的程序崩溃了。对于普通班级成员,如果成员未初始化,我会收到警告或错误。但在这种情况下不是。我在下面制作了一个复制品。
在调试模式下,此段错误。我没有收到预期的未初始化变量的编译器错误或警告。
这是一个错误吗?还是我误会了。 编译器不应该在这段代码上发出警告或错误吗?
我根本不希望它编译!
我认为编译器应该报错,说你需要在类构造函数中初始化私有wooo...
#include <iostream>
#include <memory>
#include <vector>
using namespace std;
class Wooo{
public:
int maybe;
int istrue(){
return maybe + 1;}
private:
Wooo(); // just to be explicit about deleted default constructor
};
class Weee{
public:
Weee(){}; // just empty constructor. reading wooo anywhere will give a NULL
Wooo seg_me(){
return *wooo.get();
};
private:
const std::shared_ptr<Wooo> wooo;
};
int main()
{
auto w = Weee();
cout<<"Hello World\n";
cout<< w.seg_me().istrue() << "\n";
return 0;
}
【问题讨论】:
-
嗯,它已初始化...到
nullptr。恐怕您的编译器不够聪明,无法警告您取消引用该空指针,但也许另一个静态分析器会。 -
识别 Undefined Behavior 的实例或其他有问题的代码属于 实施质量,因为这样做的范围从微不足道到不可能甚至如果你能解决停机问题。编译器通常只是假设它不会发生,并积极修剪路径以弥补不完美的信息并实现高效的代码。在运行时留下陷阱进行识别通常会降低效率,因此沦为调试模式和低优化。
-
可以确认,此行为被未定义的行为清理程序捕获。使用 -fsanitize=undefined 构建就像圣诞树一样点亮它
标签: c++ segmentation-fault c++17