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

ヌル ポインターを参照に格納する動作は未定義です。

したがって、参照に含まれると、コンパイラは自由にアドレスが非 null であると想定し、null チェックを最適化できます。

他のコンパイラの「成功」は、未定義の動作の可能性のある症状の 1 つにすぎません。

非オブジェクトへの参照を保存または作成しないでください。

于 2014-12-27T18:14:59.923 に答える