LINUX.ORG.RU

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

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

Это не «без условий» а «без тела», хотя и условий у него конечно тоже нет.

Вообще, там написано «бесконечный цикл без побочных эффектов». То есть вот такой код тоже UB:

void f(void) {
  unsigned i = 0;
  for(;;) {
    i++;
    if(false)
      break;
  }
}

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

UB - это ситуация «нельзя полагаться на результат компилирования данного кода».

Не совсем. UB – это ситуация, когда нельзя полагаться на результат компиляции всего модуля. А не только проблемного куска.

Исправление hateyoufeel, :

Это не «без условий» а «без тела», хотя и условий у него конечно тоже нет.

Вообще, там написано «бесконечный цикл без побочных эффектов». То есть вот такой код тоже UB:

void f(void) {
  unsigned i = 0;
  for(;;) {
    i++;
    if(false)
      break;
  }
}

И вот это уже страшнее, потому что такой код, несмотря на его бредовость, вполне может возникнуть во время рефакторинга каким-то боком и вместо ошибки логики ты можешь получить вообще хз что.

UB - это ситуация «нельзя полагаться на результат компилирования данного кода».

Не совсем. UB – это ситуация, когда нельзя полагаться на результат компиляции всего модуля. А не только проблемного куска.

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

Это не «без условий» а «без тела», хотя и условий у него конечно тоже нет.

Вообще, там написано «бесконечный цикл без побочных эффектов». То есть вот такой код тоже UB:

void f(void) {
  unsigned i = 0;
  for(;;) {
    i++;
  }
}

UB - это ситуация «нельзя полагаться на результат компилирования данного кода».

Не совсем. UB – это ситуация, когда нельзя полагаться на результат компиляции всего модуля. А не только проблемного куска.