Здравствуйте, Pzz, Вы писали:
A>>То при выходе из функции сгенерится исключение illegal instruction, A>>и программа упадёт в Core Dump.
А>> раньше было неопределённое поведение.
Pzz>gcc туда лепит UD2
Здравствуйте, alpha21264, Вы писали:
A>А вы знаете, что такое illegal instruction?
Бывает. Если не под ту архитектуру собрать. Или исполняемый файл изменить рандомно. Или ODR нарушить неудачно.
A>
A>bool my_function()
A>{
A> ... // тут не важно что
A> // и вот тут не поставлен return
A>}
A>
Нулевая терпимость к предупреждениям позволяет избежать такого рода ошибок.
A>А вы знаете, что такое illegal instruction? A>Вот я теперь знаю. A>Если написать вот так:
A>
A>bool my_function()
A>{
A> ... // тут не важно что
A> // и вот тут не поставлен return
A>}
A>
A>То при выходе из функции сгенерится исключение illegal instruction, A>и программа упадёт в Core Dump.
A>А раньше было неопределённое поведение. A>Вот. Наткнулся.
Здравствуйте, Nuzhny, Вы писали:
N>А компилятор наверняка тебя предупредил!
Любопытно, а почему это не является ошибкой компиляции? В чём смысл генерировать невалидный бинарик, падающий во время исполнения, если уже известно, что в исходнике ошибка?
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, ·, Вы писали:
·>Здравствуйте, Nuzhny, Вы писали:
N>>А компилятор наверняка тебя предупредил! ·>Любопытно, а почему это не является ошибкой компиляции? В чём смысл генерировать невалидный бинарик, падающий во время исполнения, если уже известно, что в исходнике ошибка?
Если эта функция нигде не вызывается, то это не ошибка. Ваш Кэп.
Возможно, адрес функции как-то используется, даже без вызовов, например, как уникальный идентификатор, или как блокировщик выбрасывания не используемых единиц трансляции.
Или как static_assert, что содержащейся в ней код — компилируемый.
Здравствуйте, Chorkov, Вы писали:
C>·>Любопытно, а почему это не является ошибкой компиляции? В чём смысл генерировать невалидный бинарик, падающий во время исполнения, если уже известно, что в исходнике ошибка? C>Если эта функция нигде не вызывается, то это не ошибка. Ваш Кэп.
Ну даже формально оно всё равно же может падать. UB же. Например, загружается код в exec-секцию какого-то умного процессора и инвалидные инструкции вызовут падение, даже без их выполнения.
C>Возможно, адрес функции как-то используется, даже без вызовов, например, как уникальный идентификатор, или как блокировщик выбрасывания не используемых единиц трансляции.
Если так, то это либо всё равно UB (и потенциальное падение), либо тело функции вообще не компилируется, а создаётся только адрес. Ну тогда ладно, пусть такое не будет ошибкой компиляции, но тогда и сабжа не будет.
C>Или как static_assert, что содержащейся в ней код — компилируемый.
По-моему "компилируемый" должно означать — порождающий некий машкод, а не сабж.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, kov_serg, Вы писали:
A>>То при выходе из функции сгенерится исключение illegal instruction, A>>и программа упадёт в Core Dump.
A>>А раньше было неопределённое поведение.
_>Здорово. Правда?
Не знаю, мне не понравилось.
Программа прекрасно работала несколько лет и при переходе на новый кумпилятор стала падать.
Здравствуйте, ·, Вы писали:
N>>А компилятор наверняка тебя предупредил! ·>Любопытно, а почему это не является ошибкой компиляции? В чём смысл генерировать невалидный бинарик, падающий во время исполнения, если уже известно, что в исходнике ошибка?
Возвращаемое значение просто не использовалось и программа работала. Уж мог бы догадаться! В смысле — компилятор.
Здравствуйте, alpha21264, Вы писали:
A>·>Любопытно, а почему это не является ошибкой компиляции? В чём смысл генерировать невалидный бинарик, падающий во время исполнения, если уже известно, что в исходнике ошибка? A>Возвращаемое значение просто не использовалось и программа работала. Уж мог бы догадаться! В смысле — компилятор.
Ну мне кажется, что было бы разумнее, если бы упало на этапе компиляции с ошибкой, чем вот так. Но это же плюсы: сгенерить заведомо сломаный машкод и пожелать удачи — это норма!
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, ·, Вы писали:
·>Здравствуйте, Nuzhny, Вы писали:
N>>А компилятор наверняка тебя предупредил! ·>Любопытно, а почему это не является ошибкой компиляции? В чём смысл генерировать невалидный бинарик, падающий во время исполнения, если уже известно, что в исходнике ошибка?
компилятор всё равно превращает
int foo(){
return 0;
}
void main() {
int i = foo()
}
так что есть return или нет — на работоспособность никак не влияет. Программист точно также может забыть сделать *ret = 0 во втором коде, как и в первом не вызвать return. Ошибка одного порядка. Второй код — это UB, но вполне корректный с точки зрения синтаксиса. И у первого поведение должно быть идентичное.
Ещё представим, что функция foo и main разнесены по разным единицам трансляции. Компилятор смотрит на оба куска кода и они ему кажутся отдельно вполне корректными. UB то произойдёт на этапе использования неинициализированной переменной. А проинициализирована переменная или нет, компилятор понять не может.
Здравствуйте, sergii.p, Вы писали:
SP>компилятор всё равно превращает
Неважно что там внутре компилятора. С т.з. исходного кода там именно return.
SP>так что есть return или нет — на работоспособность никак не влияет. Программист точно также может забыть сделать *ret = 0 во втором коде, как и в первом не вызвать return. Ошибка одного порядка.
Если не влияет, откуда тогда сабж? Как компилятор умудрился сгенерить illegal instruction и зачем?
Могу предоложить лишь ситуацию, когда код unreachable:
Здравствуйте, so5team, Вы писали:
S>А что делать компилятору вот в такой ситуации:
Я бы выдал ошибку компиляции и заставил поправить исходник, добавив явное
S> react_to_invalid_input(make_params_description(params));
std::abort(); // это
S>}
Не верится что это может создать серьёзную проблему, т.к. такого кода довольно мало. Зато сабж — поджидает на каждом углу.
S>И написан react_to_invalid_params еще тогда, когда про [[noreturn]] никто и не заикался.
Но это, конечно не backward compatible.. так что вряд ли кто-то на такое пойдёт. Остаётся только грустить...
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
C>Если эта функция нигде не вызывается, то это не ошибка. Ваш Кэп.
C>Возможно, адрес функции как-то используется, даже без вызовов, например, как уникальный идентификатор, или как блокировщик выбрасывания не используемых единиц трансляции.