C++ illegal instruction
От: alpha21264 СССР  
Дата: 31.07.25 10:14
Оценка: -4 :))) :))
А вы знаете, что такое illegal instruction?
Вот я теперь знаю.
Если написать вот так:

bool my_function()
{
   ... // тут не важно что
       // и вот тут не поставлен return
}


То при выходе из функции сгенерится исключение illegal instruction,
и программа упадёт в Core Dump.

А раньше было неопределённое поведение.
Вот. Наткнулся.

Течёт вода Кубань-реки куда велят большевики.
Re: C++ illegal instruction
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 31.07.25 10:19
Оценка:
Здравствуйте, alpha21264, Вы писали:

A>А раньше было неопределённое поведение.


А компилятор наверняка тебя предупредил!
Re: C++ illegal instruction
От: Pzz Россия https://github.com/alexpevzner
Дата: 31.07.25 10:23
Оценка: :)
Здравствуйте, alpha21264, Вы писали:


A>То при выходе из функции сгенерится исключение illegal instruction,

A>и программа упадёт в Core Dump.

А> раньше было неопределённое поведение.


gcc туда лепит UD2

https://mudongliang.github.io/x86/html/file_module_x86_id_318.html

Теперь у нас неопределенное поведение с аппаратным ускорением реализуется, а не абы как.
Re: C++ illegal instruction
От: andrey.desman  
Дата: 31.07.25 10:31
Оценка: +5
Здравствуйте, alpha21264, Вы писали:

A>То при выходе из функции сгенерится исключение illegal instruction,

A>и программа упадёт в Core Dump.

Или не сгенерируется и не упадет, а вернет что-то рандомное.

A>А раньше было неопределённое поведение.


Ничего не поменялось.
Re[2]: C++ illegal instruction
От: alpha21264 СССР  
Дата: 31.07.25 10:44
Оценка:
Здравствуйте, Pzz, Вы писали:

A>>То при выходе из функции сгенерится исключение illegal instruction,

A>>и программа упадёт в Core Dump.

А>> раньше было неопределённое поведение.


Pzz>gcc туда лепит UD2


Таки да. Сам видел.

Pzz>https://mudongliang.github.io/x86/html/file_module_x86_id_318.html


Pzz>Теперь у нас неопределенное поведение с аппаратным ускорением реализуется, а не абы как.


Теперь оно стало определённым — Core Dump.
А до этого программа нормально работала — возвращаемое значение просто не использовалось.

Течёт вода Кубань-реки куда велят большевики.
Re[2]: C++ illegal instruction
От: alpha21264 СССР  
Дата: 31.07.25 10:45
Оценка:
Здравствуйте, Nuzhny, Вы писали:

A>>А раньше было неопределённое поведение.


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


Типа да. Но он сейчас стал таким занудным — на трёх экранах бессмысленной выдачи я это сообщение просмотрел.

Течёт вода Кубань-реки куда велят большевики.
Re: C++ illegal instruction
От: B0FEE664  
Дата: 31.07.25 11:41
Оценка:
Здравствуйте, alpha21264, Вы писали:

A>А вы знаете, что такое illegal instruction?

Бывает. Если не под ту архитектуру собрать. Или исполняемый файл изменить рандомно. Или ODR нарушить неудачно.

A>
A>bool my_function()
A>{
A>   ... // тут не важно что
A>       // и вот тут не поставлен return
A>}
A>

Нулевая терпимость к предупреждениям позволяет избежать такого рода ошибок.
И каждый день — без права на ошибку...
Re: C++ illegal instruction
От: kov_serg Россия  
Дата: 31.07.25 12:06
Оценка:
Здравствуйте, alpha21264, Вы писали:


A>А вы знаете, что такое illegal instruction?

A>Вот я теперь знаю.
A>Если написать вот так:

A>
A>bool my_function()
A>{
A>   ... // тут не важно что
A>       // и вот тут не поставлен return
A>}
A>


A>То при выходе из функции сгенерится исключение illegal instruction,

A>и программа упадёт в Core Dump.

A>А раньше было неопределённое поведение.

A>Вот. Наткнулся.

Здорово. Правда?
Re[2]: C++ illegal instruction
От: · Великобритания  
Дата: 31.07.25 12:16
Оценка:
Здравствуйте, Nuzhny, Вы писали:

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

Любопытно, а почему это не является ошибкой компиляции? В чём смысл генерировать невалидный бинарик, падающий во время исполнения, если уже известно, что в исходнике ошибка?
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[3]: C++ illegal instruction
От: Chorkov Россия  
Дата: 31.07.25 13:00
Оценка:
Здравствуйте, ·, Вы писали:

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


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

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

Если эта функция нигде не вызывается, то это не ошибка. Ваш Кэп.

Возможно, адрес функции как-то используется, даже без вызовов, например, как уникальный идентификатор, или как блокировщик выбрасывания не используемых единиц трансляции.
Или как static_assert, что содержащейся в ней код — компилируемый.
Отредактировано 31.07.2025 13:02 Chorkov . Предыдущая версия .
Re[4]: C++ illegal instruction
От: · Великобритания  
Дата: 31.07.25 13:52
Оценка:
Здравствуйте, Chorkov, Вы писали:

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

C>Если эта функция нигде не вызывается, то это не ошибка. Ваш Кэп.
Ну даже формально оно всё равно же может падать. UB же. Например, загружается код в exec-секцию какого-то умного процессора и инвалидные инструкции вызовут падение, даже без их выполнения.

C>Возможно, адрес функции как-то используется, даже без вызовов, например, как уникальный идентификатор, или как блокировщик выбрасывания не используемых единиц трансляции.

Если так, то это либо всё равно UB (и потенциальное падение), либо тело функции вообще не компилируется, а создаётся только адрес. Ну тогда ладно, пусть такое не будет ошибкой компиляции, но тогда и сабжа не будет.

C>Или как static_assert, что содержащейся в ней код — компилируемый.

По-моему "компилируемый" должно означать — порождающий некий машкод, а не сабж.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Отредактировано 31.07.2025 13:53 · . Предыдущая версия .
Re[2]: C++ illegal instruction
От: alpha21264 СССР  
Дата: 31.07.25 14:16
Оценка:
Здравствуйте, kov_serg, Вы писали:

A>>То при выходе из функции сгенерится исключение illegal instruction,

A>>и программа упадёт в Core Dump.

A>>А раньше было неопределённое поведение.


_>Здорово. Правда?


Не знаю, мне не понравилось.
Программа прекрасно работала несколько лет и при переходе на новый кумпилятор стала падать.

Течёт вода Кубань-реки куда велят большевики.
Re[3]: C++ illegal instruction
От: alpha21264 СССР  
Дата: 31.07.25 14:19
Оценка:
Здравствуйте, ·, Вы писали:

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

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

Возвращаемое значение просто не использовалось и программа работала. Уж мог бы догадаться! В смысле — компилятор.

Течёт вода Кубань-реки куда велят большевики.
Re[4]: C++ illegal instruction
От: · Великобритания  
Дата: 31.07.25 14:31
Оценка: +2
Здравствуйте, alpha21264, Вы писали:

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

A>Возвращаемое значение просто не использовалось и программа работала. Уж мог бы догадаться! В смысле — компилятор.
Ну мне кажется, что было бы разумнее, если бы упало на этапе компиляции с ошибкой, чем вот так. Но это же плюсы: сгенерить заведомо сломаный машкод и пожелать удачи — это норма!
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[3]: C++ illegal instruction
От: sergii.p  
Дата: 31.07.25 14:33
Оценка:
Здравствуйте, ·, Вы писали:

·>Здравствуйте, 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);
}
Отредактировано 31.07.2025 15:07 sergii.p . Предыдущая версия .
Re[4]: C++ illegal instruction
От: · Великобритания  
Дата: 31.07.25 15:17
Оценка:
Здравствуйте, sergii.p, Вы писали:

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

Неважно что там внутре компилятора. С т.з. исходного кода там именно return.


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

Если не влияет, откуда тогда сабж? Как компилятор умудрился сгенерить illegal instruction и зачем?
Могу предоложить лишь ситуацию, когда код unreachable:
bool f() {
  if(inFactAlwaysTrue()) {
    return true;
  }
//never getting here, never crashing
}

вот наверное тут будет не очень хорошо с т.з. совместимости кидать ошибку компиляции.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[3]: C++ illegal instruction
От: so5team https://stiffstream.com
Дата: 01.08.25 06:02
Оценка: +2
Здравствуйте, ·, Вы писали:

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

·>Любопытно, а почему это не является ошибкой компиляции?

А что делать компилятору вот в такой ситуации:
int calculate_something(calc_params & params) {
  if(is_valid_params(params)) {
    ... // Что-то делаем.
    return calculated_result;
  }

  react_to_invalid_input(make_params_description(params));
}

Где react_to_invalid_params реализован в какой-то внешней библиотеке приблизительно таким образом:
void react_to_invalid_params(const std::string & description) {
  ... // Что-то делаем, типа логирования, отсылки писем в Спортлото и лигу сексу...
  std::abort();
}

И написан react_to_invalid_params еще тогда, когда про [[noreturn]] никто и не заикался.
Re[4]: C++ illegal instruction
От: · Великобритания  
Дата: 01.08.25 11:15
Оценка:
Здравствуйте, so5team, Вы писали:

S>А что делать компилятору вот в такой ситуации:

Я бы выдал ошибку компиляции и заставил поправить исходник, добавив явное

S>  react_to_invalid_input(make_params_description(params));
std::abort(); // это
S>}


Не верится что это может создать серьёзную проблему, т.к. такого кода довольно мало. Зато сабж — поджидает на каждом углу.

S>И написан react_to_invalid_params еще тогда, когда про [[noreturn]] никто и не заикался.

Но это, конечно не backward compatible.. так что вряд ли кто-то на такое пойдёт. Остаётся только грустить...
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Отредактировано 01.08.2025 11:17 · . Предыдущая версия .
Re[3]: C++ illegal instruction
От: flаt  
Дата: 01.08.25 15:35
Оценка: +3
Здравствуйте, alpha21264, Вы писали:


A>Типа да. Но он сейчас стал таким занудным — на трёх экранах бессмысленной выдачи я это сообщение просмотрел.


Дык сборка должна быть warning free (-Werror, /WX) — как раз чтобы не терять важное среди "трёх экранов бессмысленной выдачи".
Re[4]: C++ illegal instruction
От: flаt  
Дата: 01.08.25 15:39
Оценка:
Здравствуйте, Chorkov, Вы писали:


C>Если эта функция нигде не вызывается, то это не ошибка. Ваш Кэп.


C>Возможно, адрес функции как-то используется, даже без вызовов, например, как уникальный идентификатор, или как блокировщик выбрасывания не используемых единиц трансляции.


Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.