Информация об изменениях

Сообщение Re[3]: C++ illegal instruction от 31.07.2025 14:33

Изменено 31.07.2025 15:07 sergii.p

Re[3]: C++ illegal instruction
Здравствуйте, ·, Вы писали:

·>Здравствуйте, Nuzhny, Вы писали:


N>>А компилятор наверняка тебя предупредил!

·>Любопытно, а почему это не является ошибкой компиляции? В чём смысл генерировать невалидный бинарик, падающий во время исполнения, если уже известно, что в исходнике ошибка?

компилятор всё равно превращает

int foo(){
  return 0;
}

void main() {
  int i = foo()
}


во что-то такое

void foo(int* ret) {
  *ret = 0;
}

void main() {
  int i;
  foo(&i);
}


так что есть return или нет — на работоспособность никак не влияет. Программист точно также может забыть сделать *ret = 0 во втором коде, как и в первом не вызвать return. Ошибка одного порядка. Второй код — это UB, но вполне корректный с точки зрения синтаксиса. И у первого поведение должно быть идентичное.
Re[3]: C++ illegal instruction
Здравствуйте, ·, Вы писали:

·>Здравствуйте, Nuzhny, Вы писали:


N>>А компилятор наверняка тебя предупредил!

·>Любопытно, а почему это не является ошибкой компиляции? В чём смысл генерировать невалидный бинарик, падающий во время исполнения, если уже известно, что в исходнике ошибка?

компилятор всё равно превращает

int foo(){
  return 0;
}

void main() {
  int i = foo()
}


во что-то такое

void foo(int* ret) {
  *ret = 0;
}

void main() {
  int i;
  foo(&i);
}


так что есть return или нет — на работоспособность никак не влияет. Программист точно также может забыть сделать *ret = 0 во втором коде, как и в первом не вызвать return. Ошибка одного порядка. Второй код — это UB, но вполне корректный с точки зрения синтаксиса. И у первого поведение должно быть идентичное.

Ещё представим, что функция foo и main разнесены по разным единицам трансляции. Компилятор смотрит на оба куска кода и они ему кажутся отдельно вполне корректными. UB то произойдёт на этапе использования неинициализированной переменной. А проинициализирована переменная или нет, компилятор понять не может.

void foo(int* ret) {
  //*ret = 0;
}

void main() {
  int i;
  foo(&i);
  printf("%i", i);
}