У меня есть большой код, который мы долгое время использовали в нашей команде. Но это несколько недель, что есть проблема с ним, когда он скомпилирован на моей машине. Код кросс-компилируется для процессора Intel Atom и запускается на определенной машине.
Когда он компилируется на моем компьютере, в отличие от всех остальных, он вызывает 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
выполняться с условием равным нулю ?!
П.С .: Я использую clang ++ для компиляции кода на машине Debian.
Неопределенное поведение хранить нулевой указатель в ссылке.
Поэтому, как только он находится в ссылке, компилятор может предположить, что адрес не равен нулю, и оптимизировать проверку на ноль.
«Успех» других компиляторов был лишь одним из возможных симптомов вашего неопределенного поведения.
Не храните и не создавайте ссылки на не-объекты.