Страницы

Поиск по вопросам

воскресенье, 1 декабря 2019 г.

Разница между неопределённым, неспецифицированным и зависимым от реализации поведением

#cpp #cpp_faq


В чём разница между undefined behavior, unspecified behavior и implementation-defined
behavior?
    


Ответы

Ответ 1



undefined behavior - неопределённое поведение. Поведение, на которое стандарт языка не накладывает каких-либо требований. Неопределённое поведение может ожидаться, когда не указано явное поведение или когда программа использует ошибочные конструкции или данные. Допустимая реакция на неопределённое поведение может варьироваться от полного игнорирования ситуации с непредсказуемыми результатами до нормального поведения во время трансляции или выполнения программы в соответствии с ожидаемым поведением окружения (с или без вывода диагностических сообщений), или до прекращения трансляции или выполнения программы (с выводом диагностического сообщения). Многие ошибочные конструкции программы не приводят к неопределённому поведению, а требуют вывода соответствующих диагностических сообщений. Примеры неопределённого поведения: доступ к элементам массива вне разрешенных границ. Например, выделено 5 элементов, а пытаемся прочитать элемент с индексом >= 5. удаление объекта производного класса через delete на указателе, статический тип которого является базовым классом, при отсутствии виртуального деструктора в базовом классе. многократное изменение переменной или неупорядоченные изменение и независимое чтение при отсутствии порядка вычислений. Например: i = i++ + i; unspecified behavior - неустановленное поведение. Поведение для корректной программы и корректных данных, которое зависит от реализации (компилятора). Такое поведение не обязано быть описанным в документации на компилятор. Пример: порядок вычисления аргументов функции. implementation-defined behavior - определённое в реализации (компиляторе) поведение. Поведение, которое чётко должно быть прописано в документации на любой компилятор. Примеры: размеры стандартных типов. Например, sizeof(int). наличие дополнительных вариантов функции main, кроме как int main() и int main(int, char**).

Ответ 2



Вот, что говорит стандарт о неопределённом поведении: behavior for which this International Standard imposes no requirements Что это значит? Это значит, что произойти может всё, что угодно: проверка, результат которой UB может не сработать, может сработать не так или вообще быть вырезана из программы. Программа может аварийно завершиться, зависнут или ещё что угодно. Неопределённое поведение означает, что программа некорректна и любое поведение возможно. Включая полное отсутствие какого-либо поведения. Теперь к неспецифицированному: behavior, for a well-formed program construct and correct data, that depends on the implementation Как можно видеть, если поведение не специфицированно в стандарте, не означает, что программа некорректна, а лишь означает, что конкретное поведение зависит от реализации. Но это поведение будет понятным и ожидаемым. Т.е. оно не может измениться при неоднократных запусках программы, которая использует ту же самую реализацию. Как должно быть понятно из текста стандарта, неспецифицированное и зависимое-от-реализации поведение говорят об одном и том же. Отличие заключается только в том, что зависимое-от-реализации поведение должно быть документировано, а неспецифицированное — нет: behavior, for a well-formed program construct and correct data, that depends on the implementation and that each implementation documents

Комментариев нет:

Отправить комментарий