Что означает [Примечание] в абзаце undefined behavior в стандарте C ++?

StackOverflow https://stackoverflow.com/questions/4274763

Вопрос

Как пользователь Tony указывает на в пункте 1.3.12 стандарта C ++ есть [Примечание], в котором говорится

допустимое неопределенное поведение варьируется от полного игнорирования ситуации с непредсказуемыми результатами до поведения во время трансляции или выполнения программы документированным образом, характерным для среды...

Разве это не противоречит определению UB, в котором говорится, что ..настоящий Международный стандарт не предъявляет никаких требований?Я имею в виду, что они говорят "никаких требований", а затем говорят "допустимый UB" - прямо в том же абзаце.

Как следует интерпретировать это примечание?Действительно ли это каким-либо образом ограничивает UB?

Это было полезно?

Решение

Из §6.5.1 Часть 3 директив ISO / IEC:

Примечания и примеры, интегрированные в тексте стандарта, должны использоваться только для предоставления дополнительной информации, предназначенной для оказания помощи в понимании или использовании стандарта и не должно содержать положения, к которым необходимо соответствовать требованиям соответствия стандартный

Так что это совершенно не нормативно (необязательное) и предназначено только для возможного разъяснения.

Другие советы

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

Эта заметка объясняет, что может сделать реализацию, если она сталкивается с кодом, для которых нет определенного поведения. Слово «допустимое» не предназначено для ограничения, а некоторые примеры распространенного поведения приведены.

Интересно отметить, что компилятор почти всегда должен что-то составить! Рассмотрим этот фрагмент кода:

void f() { 1 / 0; }

Поведение переводчика при столкновении этого не четко определено, но он не может просто сделать все, что он любит! На самом деле, если это компилятор, он все еще требуется для компиляции этого устройства компиляции. Это связано с тем, что поведение программы, содержащей эту функцию, все равно может быть хорошо определенной! Компилятор не может знать, называется функцией. На самом деле этот вопрос возникл, где функция была «основным ()» и контролем, была наверняка будет проходить через нулевое разделение, а выделение состоит в том, что компилятор не разрешается отклонить даже эту программу. Причина в том: программа все еще хорошо сформирована, а соответствующий компилятор должен принимать все хорошо сформированные программы (и отклонить все плохо сформированные и выдавать сообщение об ошибке диагностики, если не указано иное).

Это не может быть легко сделано плохо сформированным, потому что трудно точно указать, насколько интеллектуальные компиляторы могут быть обязаны при обнаружении, когда должен иметь место для разделения нуля.

Поэтому интересно, претензия на стандарт, о котором он «накладывает никаких требований», на самом деле очень близко к неправиству. Это характеристики системы компиляции, поддерживающей отдельную компиляцию, которую не может обнаружить, если кусок кода, для которого нет четко определенного поведения, на самом деле выполняется, и поэтому компилятор на самом деле требуется чтобы что-то скомпилировать в любом случае, потому что он не может вывести, если программа имеет неопределенное поведение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top