LINUX.ORG.RU

История изменений

Исправление hateyoufeel, (текущая версия) :

Еще раз - нет никакого «абсолютного» ЮБ, что вот поведение прям вообще пальцем в небо

Это ты на простых примерах можешь так считать. А теперь сходи разберись, почему в проекте 20-летней давности на 500к строк что-то так почему-то неправильно выполняется.

Тут можно вспомнить про то, как MSVC не делает strict aliasing оптимизацию, делая ЮБ вполне определенными в рамках себя.

Потому что программисты на C не могут в strict aliasing в большинстве случаев. Большая часть линуксокода перестаёт работать, если его включить.

А я лучше эту ошибку найду при помощи нормального компилятора без дерьмооптимизаций и исправлю, а твой код на ЮБ будет работать т.к. шланг выплюнул каку-то непотребную какашку (хоть она и малость быстрее, да) и хрен ты его обнаружишь, ибо шибко ЮБ-эксперт.

$ cat null1.cc 
#include <iostream>

char f(int i) {
  if (i == 1)
    return *(char*)0;
  return 'f';
}

int main()
{
  std::cout << f(1) << std::endl;
}

$ clang++ null1.cc -o null -O2 -fsanitize=undefined
null1.cc:5:12: warning: indirection of non-volatile null pointer will be deleted, not trap [-Wnull-dereference]
    return *(char*)0;
           ^~~~~~~~~
null1.cc:5:12: note: consider using __builtin_trap() or qualifying pointer with 'volatile'
1 warning generated.

$ ./null 
null1.cc:5:12: runtime error: load of null pointer of type 'char'
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior null1.cc:5:12 in 
f

Ах какой же шланг нехороший!

Но ГЦЦ поступает много умнее - дефолтно выбирает более надежный вариант, а особые гурманы доведут производительность до предела.

Ты реально упорный в отстаивании своего желания говнокодить.

Жесть, велосипедист. Все есть и работает, тебе твои ЮБ шоры мешают.

У тебя вот не работает :D

Исходная версия hateyoufeel, :

Еще раз - нет никакого «абсолютного» ЮБ, что вот поведение прям вообще пальцем в небо

Это ты на простых примерах можешь так считать. А теперь сходи разберись, почему в проекте 20-летней давности на 500к строк что-то так почему-то неправильно выполняется.

Тут можно вспомнить про то, как MSVC не делает strict aliasing оптимизацию, делая ЮБ вполне определенными в рамках себя.

Потому что программисты на C не могут в strict aliasing в большинстве случаев. Большая часть линуксокода перестаёт работать, если его включить.

А я лучше эту ошибку найду при помощи нормального компилятора без дерьмооптимизаций и исправлю, а твой код на ЮБ будет работать т.к. шланг выплюнул каку-то непотребную какашку (хоть она и малость быстрее, да) и хрен ты его обнаружишь, ибо шибко ЮБ-эксперт.

$ cat null1.cc 
#include <iostream>

char f(int i) {
  if (i == 1)
    return *(char*)0;
  return 'f';
}

int main()
{
  std::cout << f(1) << std::endl;
}

$ clang++ null1.cc -o null -O2 -fsanitize=undefined
null1.cc:5:12: warning: indirection of non-volatile null pointer will be deleted, not trap [-Wnull-dereference]
    return *(char*)0;
           ^~~~~~~~~
null1.cc:5:12: note: consider using __builtin_trap() or qualifying pointer with 'volatile'
1 warning generated.

$ ./null 
null1.cc:5:12: runtime error: load of null pointer of type 'char'
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior null1.cc:5:12 in 
f

Ах какой же шланг нехороший!

Но ГЦЦ поступает много умнее - дефолтно выбирает более надежный вариант, а особые гурманы доведут производительность до предела.

Ты реально упорный в отстаивании своего желания говнокодить.