C++ 如果(null)在特定计算机中执行,则使用clang++;

C++ 如果(null)在特定计算机中执行,则使用clang++;,c++,debian,cross-compiling,clang++,ifnull,C++,Debian,Cross Compiling,Clang++,Ifnull,我有一个我们在团队中使用了很长时间的大型代码。但是当它在我的机器上编译时,已经有好几个星期了。代码是为Intel Atom CPU交叉编译的,并在特定机器上运行 当它在我的计算机上编译时,与其他任何人不同,它会导致分段错误。分段故障来自不应执行的if块内部: Settings *s = &Global::getSettings(); std::cout << "Pointer value before if : " << s << std::endl;

我有一个我们在团队中使用了很长时间的大型代码。但是当它在我的机器上编译时,已经有好几个星期了。代码是为Intel Atom CPU交叉编译的,并在特定机器上运行

当它在我的计算机上编译时,与其他任何人不同,它会导致
分段错误
。分段故障来自不应执行的
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::theSettings的值没有改变,等于零。上面代码段的输出如下所示:

Pointer value before if : 0
Pointer value after if : 0
问题:
if
如何在条件等于零的情况下执行


注意:我正在使用clang++在Debian机器上编译代码。

在引用中存储空指针是未定义的行为

因此,一旦它在引用中,编译器就可以自由地假设地址为非空,并优化空检查

其他编译器的“成功”只是您未定义行为的一个可能症状


不要存储或创建对非对象的引用。

我猜编译器在
Global::getSettings()
中看到了取消引用,推断
Global::theSettings
不能为null(或者,看到
s
正在使用
某个东西初始化,并推断它不能为null),并优化了空检查。这只是一个印象,还是您的代码是多线程的?这是一个多线程代码,但静态变量是在线程范围内定义的。哦,错误发生在任何线程启动之前。。您可能需要重新考虑您的界面以避免UB。
Pointer value before if : 0
Pointer value after if : 0