Что точно означают “IB” и “UB”?

Я видел условия "IB" и "UB", используемый несколько раз, особенно в контексте C++. Я попытался гуглить их, но по-видимому те двухбуквенные комбинации видят большое использование.:P

Так, я спрашиваю Вас..., что они имеют в виду, когда они сказаны, как будто они - плохая вещь?

103
задан cHao 8 November 2012 в 21:39
поделиться

4 ответа

IB: Поведение, определяемое реализацией. Стандарт оставляет на усмотрение конкретного компилятора/платформы определение точного поведения, но требует, чтобы оно было определено.

Использование поведения, определяемого реализацией, может быть полезным, но делает ваш код менее переносимым.

UB: Неопределенное поведение. Стандарт не определяет, как должна вести себя программа, вызывающая неопределенное поведение. Также известен как "носовые демоны", потому что теоретически может заставить демонов вылететь из вашего носа.

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

129
ответ дан 24 November 2019 в 04:20
поделиться
  • IB: это поведение, определяемое реализацией - компилятор должен документировать, что оно делает. Выполнение операции >> над отрицательным значением является примером.

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

Другой связанный термин - "неопределенное поведение". В случае неопределенного поведения компилятор должен сделать что-то в соответствии со стандартом, но какие именно варианты дает стандарт, зависит от компилятора и не обязательно должно быть определено (или даже согласовано). Такие вещи, как порядок оценки подвыражений, попадают в эту категорию. Компилятор может выполнять их в любом порядке, который ему нравится, и может делать это по-разному в разных сборках или даже в разных запусках одной и той же сборки (маловероятно, но допускается).

8
ответ дан 24 November 2019 в 04:20
поделиться

Поведение, определяемое реализацией, и поведение Undefined

Стандарт C ++ очень специфичен в отношении эффектов различных конструкций, и, в частности, вы всегда должны знать эти категории проблем :

  • Неопределенное поведение означает, что нет абсолютно никаких гарантий. Код может сработать, или он может поджечь ваш жесткий диск, или заставить демонов вылететь вам из носа . Что касается языка C ++, то может случиться абсолютно все. На практике это обычно означает, что у вас есть неисправимая ошибка.Если это произойдет, вы не сможете действительно доверять чему-либо в своем приложении (потому что одним из последствий такого неопределенного поведения могло быть просто нарушение памяти, используемой остальной частью вашего приложения). Необязательно быть последовательным, поэтому повторный запуск программы может дать разные результаты. Это может зависеть от фаз луны, цвета рубашки, которую вы носите, или чего-то еще.

  • Неопределенное поведение означает, что программа должна делать что-то разумное и последовательное, но не требуется документировать это.

  • Определяемое реализацией поведение аналогично неопределенному, но также должно быть задокументировано разработчиками компилятора. Примером этого является результат reinterpret_cast . обычно , он просто изменяет тип указателя без изменения адреса, но отображение фактически определяется реализацией, поэтому компилятор может отображать совершенно другой адрес, если поскольку он задокументировал этот выбор. Другой пример - размер int. Стандарт C ++ не заботится о том, 2, 4 или 8 байтов, но он должен быть задокументирован компилятором

. Но общим для всех них является то, что их лучше избегать. По возможности придерживайтесь поведения, которое на 100% определено самим стандартом C ++. Таким образом, вам гарантирована портативность.

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

Неопределенного поведения, с другой стороны, следует всегда избегать. В общем, вы должны просто предположить, что это заставит вашу программу так или иначе взорваться.

17
ответ дан 24 November 2019 в 04:20
поделиться
Другие вопросы по тегам:

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