Сообщение Re[3]: C++ illegal instruction от 31.07.2025 14:33
Изменено 31.07.2025 15:07 sergii.p
Re[3]: C++ illegal instruction
Здравствуйте, ·, Вы писали:
·>Здравствуйте, Nuzhny, Вы писали:
N>>А компилятор наверняка тебя предупредил!
·>Любопытно, а почему это не является ошибкой компиляции? В чём смысл генерировать невалидный бинарик, падающий во время исполнения, если уже известно, что в исходнике ошибка?
компилятор всё равно превращает
во что-то такое
так что есть return или нет — на работоспособность никак не влияет. Программист точно также может забыть сделать *ret = 0 во втором коде, как и в первом не вызвать return. Ошибка одного порядка. Второй код — это UB, но вполне корректный с точки зрения синтаксиса. И у первого поведение должно быть идентичное.
·>Здравствуйте, 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>>А компилятор наверняка тебя предупредил!
·>Любопытно, а почему это не является ошибкой компиляции? В чём смысл генерировать невалидный бинарик, падающий во время исполнения, если уже известно, что в исходнике ошибка?
компилятор всё равно превращает
во что-то такое
так что есть return или нет — на работоспособность никак не влияет. Программист точно также может забыть сделать *ret = 0 во втором коде, как и в первом не вызвать return. Ошибка одного порядка. Второй код — это UB, но вполне корректный с точки зрения синтаксиса. И у первого поведение должно быть идентичное.
Ещё представим, что функция foo и main разнесены по разным единицам трансляции. Компилятор смотрит на оба куска кода и они ему кажутся отдельно вполне корректными. UB то произойдёт на этапе использования неинициализированной переменной. А проинициализирована переменная или нет, компилятор понять не может.
·>Здравствуйте, 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);
}