if(null) 正在使用 clang++ 编译的特定计算机中执行
if(null) is being executed in a specific computer compiling with clang++
我有一个大代码,我们在团队中使用了很长时间。但是在我的机器上编译它时,它有几周的问题。该代码针对英特尔凌动 CPU 进行交叉编译,并在特定机器上运行。
当它在我的计算机上编译时,与其他任何人的电脑不同,它会导致segmentation fault
。分段错误来自不应执行的if
块内部:
Settings *s = &Global::getSettings();
std::cout << "Pointer value before if : " << s << std::endl;
if(s != 0)
{
std::cout << "Pointer value after if : " << &Global::getSettings() << std::endl;
.
.
.
}
Global::getSettings()
如下:
.
.
.
private:
static __thread Settings* theSettings;
public:
static Settings& getSettings() {return *theSettings;}
.
.
.
__thread Settings* Global::theSettings = 0;
在我的测试中,全局::设置的值没有改变,等于零。上部代码片段的输出是这样的:
Pointer value before if : 0
Pointer value after if : 0
问题:如何在条件等于零的情况下执行if
?!
PS:我正在使用 clang++ 在 Debian 机器上编译代码。
在引用中存储空指针是未定义的行为。
因此,一旦它进入引用,编译器就可以自由地假设地址是非空的,并优化你的空检查。
其他编译器的"成功"只是您未定义行为的一个可能症状。
不要存储或创建对非对象的引用。