if (null) выполняется на конкретном компьютере, компилирующемся с clang ++

У меня есть большой код, который мы долгое время использовали в нашей команде. Но это несколько недель, что есть проблема с ним, когда он скомпилирован на моей машине. Код кросс-компилируется для процессора 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.

4

Решение

Неопределенное поведение хранить нулевой указатель в ссылке.

Поэтому, как только он находится в ссылке, компилятор может предположить, что адрес не равен нулю, и оптимизировать проверку на ноль.

«Успех» других компиляторов был лишь одним из возможных симптомов вашего неопределенного поведения.

Не храните и не создавайте ссылки на не-объекты.

9

Другие решения


По вопросам рекламы [email protected]