что при всех тестах УБ всегда вела себя одинаково (допустим, он собирал всегда одним компилятором и с одними настройками компиляции). Долбоеб программист предполагает, что поведение программы не изменится при трансляции в такой модный современный и безопасный язык Вэ. Но имба разработчик языка Вэ решил, что данный конкретный УБ будет трансформирован в код без УБ, но не с тем поведением, к которому привык долбоеб программист, и что делать?
Ладно там всякие сегфолты и того, но что делать с сиквенс пойнтами: когда функции имеют сайд эффекты, а порядок вызова этих функций в каком-то комплексном выражении определяется настройками оптимизации компилятора и самим компилятором. Если последовательность сайд эффектов важна, то во что должен чудо транслятор в Вэ развернуть такую последовательность?
Ну если программист настолько идиот, то его ничего не спасёт.
Можно без оскорблений? Есть такая отличная статья про UB - What every compiler writer should know about programmers.
Это чисто формальный вопрос, нельзя код с УБ конвертировать в код без УБ, так как разработчик может полагаться на одно конкретное поведение УБ и считать это нормальным.
Тут выше уже писали, что в таком случае ссзб. Почему это запрещает конвертацию?
Теряется исходное поведение программы, стало быть транслятор некорректен.
Ну вообще gcc тоже изменяет семантику
Эмм, транслятор должен сохранять семантику, а не поведение. А семантика в таком случае определения хоть какого-то поведения вместо UB сохранится.
Для GCC это УБ, компилятор имеет на это право, язык без УБ должен иметь одно и тоже поведение и не менять его от настроек оптимизации или от фазы луны.
Ну а CompCert доказанным образом внутри себя семантику для C11 не меняет
Обсуждают сегодня