169 похожих чатов

А в чём отличие UB от дополнений компилятора? И то и

то не написано в стандарте, и то и то собирается компилятором определённым образом.

9 ответов

26 просмотров

в том, что implementation-specified behaviour имеет ограниченное поведение. например, возвращаемое значение функции system — это implementation-defined, а разыменование нулевого указателя — undefined behaviour. при попытке что-то сделать с возвращаемым значением system, программа гарантировано продолжит работать, а после разыменования нулевого указателя ничего уже не гарантируется

2happy- Автор вопроса
hirrolot
в том, что implementation-specified behaviour имее...

Не совсем понимаю. Если я напишу в с++ __int128_t, а потом соберу это на другом компиляторе - у меня нихрена не соберётся. А в случае с UB компилятор определённым образом их разрешает. Например gcc со шлангом собирают *(&arr+1)-arr как длину массива. Всегда собирают так, если значение в стеке (в куче же тоже должен, да?) то всё работает. И чем же это не дополнение компилятора?

2happy- Автор вопроса
hirrolot
в си нет __int128_t

В си нет, я просто не знаю какой пример из си привести. Но в плюсах есть дополнение компилятора - __int128_t. Чем подобное дополнение отличается от обрабатываемого определённым образом UB

2happy
В си нет, я просто не знаю какой пример из си прив...

Не определеное поведение на то и не определеное поведение что никто не знает что будет

2happy
Не совсем понимаю. Если я напишу в с++ __int128_t,...

В каком стеке? В какой куче? Стандарт вообще не оперирует такими понятиями. Ну хоть с типами языка для начала ознакомился и с классами хранения. Рассказываю для самых маленьких (ибо здесь по-моему любому это очевидно), есть 3 понятия - поведение, определяемое реализацией (сюда же можно включить и вещи, поддержка которых также определяется реализацией, будь то int64_t или vla, а также нестандартные прагмы), есть неопределённое поведение, места которого строго детерминированы стандартом, а также есть расширения компиляторов - это атрибуты, деклспецы, свои ключевые слова, да и всякие внутренние фишечки вроде определения функций внутри скоупа других функций, возвращаемое значение блоков стейтментов, автоподстановка ветки тернарника и тд. Соответственно то, что определяется реализацией, как уже сказал хиро, будет работать строго определённым образом на конкретной платформе (ну либо же не будет работать вовсе), поведение можно гарантировано узнать, прочитав документацию компилятора. Неопределённое поведение же это инварианты, предоставляемые стандартом, при нарушении которых вообще никто ничего не может гарантировать, у тебя может длина массива посчитаться, а может ракета на Вашингтон вылететь, а если рассматривать чуть более реальные варианты, то компилятору ничто не мешает твоё разыменовании адреса за границей массива преобразовать в разыменование нула - какая разница? Что так, что так поведение неопределённое. Расширения же компиляторов это то, что реализует каждый компиль самостоятельно, т.е. определённые синтаксические конструкции, которые гарантировано будут работать на конкретном компиляторе, порой даже для конкретной архитектуры (те же ассемблерные вставки). К стандарту это никакого отношения не имеет, т.к. стандарт оперирует только первыми двумя понятиями.

ID - описано в документации на компилятор и работает определённым образом . UB - не описано нигде и может работать как угодно. В частности в конкретном компиляторе конкретные ситуации неопределённого поведения могут быть описаны как какое-то вполне определенное поведение в каких-то частных случаях например в отладочной библиотеке runtime языка Освобождение неверного указателя на динамическую память например через функцию Free может вызывать какую-то вполне определённую диагностику и например завершение программы

2happy
Не совсем понимаю. Если я напишу в с++ __int128_t,...

Ты не парь себе мозги этим сейчас, по программируешь-постепенно всё поймёшь про неопределённое поведение про специфику реализации это всё не страшно просто это термины стандарта языка и это высший пилотаж технической и инженерной мысли без высшего образования и опыта в инженерии это понять сложно сразу же . Но поработав и обретение некоторую практику ты легко с этим свыкнешься и каких-то вопросов У тебя это вызывать не будет.

2happy- Автор вопроса

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта