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

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

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

9 ответов

10 просмотров

в том, что 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- Автор вопроса

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

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

Anyone here suffers from unexplained aural migraines, who would be up for talking for a bit? Doesn't *have* to be aural, but I am not asking about headaches, I mean actual mi...
Martin Rys
55
подскажите пожалуйста, как мне освободить результат записанный в переменную result? в чем проблема подскажите если МОЖЕТЕ?
Михаил Helper
28
есть тут кто-то , кто только начал изучать си? если проходите курс на степике или как-то сами изучаете, пишите, может, скооперируемся?..
Eule
25
вопрос по москвину - не понимаю вот такого вопроса похоже Сколько разных всегда завершающихся функций с типом a -> a -> b -> a -> a можно реализовать? Две функции одинаково...
Fedor
11
Слушайте, ещё такая интересная задачка. Сделан аудит действий пользователей через триггеры в базе, соответственно каждый пользователь имеет свой логин и пароль в базе. Это пре...
Сергей Бычков
12
Скажите, тут нет проблемы? IMyInterface1 = interface function GetInterface2: IInterface2; ... function TMyInterface.GetInterface2: IInterface2; begin Result := TI...
Ruslan aka DUDE
18
Как попросить stack install делать executable без .exe на винде?
Danila Danko
9
Утра доброго. Просветите пожалуйста. Хочу сделать rest сервер на делфи. Посмотрел 3 фреймворка: dmvc, Mars, mormot. Ни в одном из них не упоминается ассинхронная обработка вхо...
Сергей Бычков
10
возможно для форматирования TimeStampZ нужен другой механизм, не?
Роман Лях (rgreat)
13
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Карта сайта