4

我有一个大代码,我们在团队中使用了很长时间。但是它在我的机器上编译时出现了几个星期的问题。该代码针对 Intel Atom 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;

在我的测试中 Global::theSettings 的值没有改变并且等于零。上面的代码片段的输出是这样的:

Pointer value before if : 0
Pointer value after if : 0

问题:如何if在条件为零的情况下执行?!

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

4

1 回答 1

9

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

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

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

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

于 2014-12-27T18:14:59.923 回答