He visto los términos "IB" y "UB" usados varias veces, particularmente en el contexto de C ++. He intentado buscarlos en Google, pero aparentemente esas combinaciones de dos letras tienen mucha utilidad. :PAGS
Entonces, les pregunto ... ¿qué quieren decir cuando se dicen como si fueran algo malo?
c++
terminology
definition
cHao
fuente
fuente
Respuestas:
IB: Comportamiento definido por la implementación. El estándar deja que el compilador / plataforma en particular defina el comportamiento preciso, pero requiere que se defina.
El uso de un comportamiento definido por la implementación puede ser útil, pero hace que su código sea menos portátil.
UB: Comportamiento indefinido. El estándar no especifica cómo debe comportarse un programa que invoca un comportamiento indefinido. También conocido como "demonios nasales" porque teóricamente podría hacer que los demonios salgan volando de tu nariz.
Usar un comportamiento indefinido casi siempre es una mala idea. Incluso si parece funcionar a veces, cualquier cambio en el entorno, el compilador o la plataforma puede romper el código de forma aleatoria.
fuente
Comportamiento definido por la implementación y comportamiento indefinido
El estándar C ++ es muy específico sobre los efectos de varias construcciones y, en particular, siempre debe estar atento a estas categorías de problemas :
El comportamiento indefinido significa que no hay absolutamente ninguna garantía. El código podría funcionar, o podría incendiar su disco duro o hacer que los demonios salgan volando por su nariz . En lo que respecta al lenguaje C ++, puede pasar absolutamente cualquier cosa. En términos prácticos, esto generalmente significa que tiene un error irrecuperable. Si esto sucede, realmente no puede confiar en nada acerca de su aplicación (porque uno de los efectos de este comportamiento indefinido podría haber sido arruinar la memoria utilizada por el resto de su aplicación). No es necesario que sea coherente, por lo que ejecutar el programa dos veces puede dar resultados diferentes. Puede depender de las fases de la luna, el color de la camisa que llevas puesta o absolutamente cualquier otra cosa.
El comportamiento no especificado significa que el programa debe hacer algo sensato y coherente, pero no es necesario que lo documente .
El comportamiento definido por la implementación es similar al no especificado, pero los redactores del compilador también deben documentarlo. Un ejemplo de esto es el resultado de a
reinterpret_cast
. por lo general , simplemente cambia el tipo de puntero, sin modificar la dirección, pero el mapeo está realmente definido por la implementación, por lo que un compilador podría mapear a una dirección completamente diferente, siempre que documente esta elección. Otro ejemplo es el tamaño de un int. Al estándar C ++ no le importa si tiene 2, 4 u 8 bytes, pero debe estar documentado por el compiladorPero lo común de todos estos es que es mejor evitarlos. Cuando sea posible, siga el comportamiento 100% especificado por el estándar C ++. De esa manera, tiene la portabilidad garantizada.
A menudo, también debe confiar en algún comportamiento definido por la implementación. Puede ser inevitable, pero aun así debe prestarle atención y ser consciente de que depende de algo que puede cambiar entre diferentes compiladores.
El comportamiento indefinido, por otro lado, siempre debe evitarse. En general, debe asumir que hace que su programa explote de una forma u otra.
fuente
IB: es un comportamiento definido por la implementación; el compilador debe documentar lo que hace. Realizar una
>>
operación en un valor negativo es un ejemplo.UB: comportamiento indefinido: el compilador puede hacer lo que sea, incluso fallar o dar resultados impredecibles. Desreferenciar un puntero nulo cae en esta categoría, pero también cosas más sutiles como la aritmética del puntero que cae fuera de los límites de un objeto de matriz.
Otro término relacionado es "comportamiento no especificado". Esto es una especie de comportamiento entre la implementación definida y la indefinida. para un comportamiento no especificado, el compilador debe hacer algo de acuerdo con el estándar, pero exactamente qué opciones le da el estándar depende del compilador y no necesita ser definido (ni siquiera consistente). Cosas como el orden de evaluación de sub-expresiones entran en esta categoría. El compilador puede realizarlos en el orden que quiera, y podría hacerlo de manera diferente en diferentes compilaciones o incluso en diferentes ejecuciones de la misma compilación (improbable, pero permitido).
fuente
La versión corta:
Comportamiento definido por la implementación (IB): Correctamente programado pero indeterminado *
Comportamiento indefinido (UB): Programado incorrectamente (¡es decir, un error !)
*) "indeterminado" en lo que respecta al estándar del lenguaje, por supuesto, estará determinado en cualquier plataforma fija.
fuente
UB: Comportamiento indefinido
IB: comportamiento definido por la implementación
fuente