if(null) 正在使用 clang++ 编译的特定计算机中执行

if(null) is being executed in a specific computer compiling with clang++

本文关键字:编译 计算机 执行 clang++ null if      更新时间:2023-10-16

我有一个大代码,我们在团队中使用了很长时间。但是在我的机器上编译它时,它有几周的问题。该代码针对英特尔凌动 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 机器上编译代码。

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

因此,一旦它进入引用,编译器就可以自由地假设地址是非空的,并优化你的空检查。

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

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