Я видел, как термины «IB» и «UB» использовались несколько раз, особенно в контексте C ++. Я пробовал поискать их в Google, но очевидно, что эти двухбуквенные комбинации находят много применения. :П
Итак, я спрашиваю вас ... что они имеют в виду, когда говорят, что они плохие?
c++
terminology
definition
Chao
источник
источник
Ответы:
IB: поведение, определяемое реализацией. Стандарт оставляет за конкретным компилятором / платформой определение точного поведения, но требует, чтобы оно было определено.
Использование поведения, определяемого реализацией, может быть полезным, но делает ваш код менее переносимым.
UB: Неопределенное поведение. Стандарт не определяет, как должна вести себя программа, вызывающая неопределенное поведение. Также известен как «носовые демоны», потому что теоретически он может заставить демонов вылетать из вашего носа.
Использование неопределенного поведения почти всегда плохая идея. Даже если иногда кажется, что это работает, любое изменение среды, компилятора или платформы может случайно нарушить ваш код.
источник
Поведение, определяемое реализацией, и неопределенное поведение
Стандарт C ++ очень специфичен в отношении эффектов различных конструкций, и, в частности, вы всегда должны знать об этих категориях проблем :
Неопределенное поведение означает, что нет никаких гарантий. Код может работать, или он может поджечь ваш жесткий диск или заставить демонов вылететь из вашего носа . Что касается языка C ++, то может случиться абсолютно все. На практике это обычно означает, что у вас есть неисправимая ошибка. Если это произойдет, вы не можете действительно доверять ничего о приложении (потому что один из эффектов этого непредсказуемого поведения может просто быть напутают памяти , используемых в остальной части вашего приложения). Необязательно быть последовательным, поэтому повторный запуск программы может дать разные результаты. Это может зависеть от фаз луны, цвета рубашки, которую вы носите, или чего-то еще.
Неопределенное поведение означает, что программа должна делать что-то разумное и последовательное, но не требуется документировать это.
Поведение, определяемое реализацией, аналогично неопределенному, но также должно быть задокументировано авторами компилятора. Примером этого является результат
reinterpret_cast
. обычно он просто изменяет тип указателя, не изменяя адрес, но отображение фактически определяется реализацией, поэтому компилятор может отображать совершенно другой адрес, если он задокументировал этот выбор. Другой пример - размер int. Стандарт C ++ не заботится о том, составляет ли он 2, 4 или 8 байтов, но он должен быть задокументирован компилятором.Но общим для всего этого является то, что их лучше избегать. По возможности придерживайтесь поведения, которое на 100% определяется самим стандартом C ++. Таким образом, вам гарантирована портативность.
Вам также часто приходится полагаться на поведение, определяемое реализацией. Это может быть неизбежно, но вы все равно должны обращать на это внимание и помнить, что вы полагаетесь на то, что может измениться между разными компиляторами.
С другой стороны, следует всегда избегать неопределенного поведения . В общем, вы должны просто предположить, что это заставит вашу программу так или иначе взорваться.
источник
IB: поведение, определяемое реализацией - компилятор должен задокументировать, что он делает.
>>
Примером может служить выполнение операции с отрицательным значением.UB: неопределенное поведение - компилятор может делать что угодно, в том числе просто давать сбой или давать непредсказуемые результаты. В эту категорию попадает разыменование нулевого указателя, но также и более тонкие вещи, такие как арифметика указателя, выходящая за пределы объекта массива.
Другой родственный термин - «неопределенное поведение». Это что-то среднее между определенным реализацией и неопределенным поведением. для неопределенного поведения компилятор должен делать что-то в соответствии со стандартом, но какие именно варианты предоставляет стандарт, зависит от компилятора и не требует определения (или даже согласованности). Такие вещи, как порядок оценки подвыражений, попадают в эту категорию. Компилятор может выполнять их в любом порядке, и может делать это по-разному в разных сборках или даже в разных запусках одной и той же сборки (маловероятно, но разрешено).
источник
Краткая версия:
Поведение, определяемое реализацией (IB): правильно запрограммировано, но неопределенно *
Неопределенное поведение (UB): неправильно запрограммировано (т.е. ошибка !)
*) «неопределенный» в том, что касается языкового стандарта, он, конечно, будет определяться на любой фиксированной платформе.
источник
UB: неопределенное поведение
IB: поведение, определяемое реализацией
источник