Diferencia entre comportamiento indefinido y mal formado, no se requiere mensaje de diagnóstico
El estándar C ++ viene con una sorprendente cantidad de definiciones parapoco claro1 comportamiento que significa más o menos lo mismo con diferencias sutiles. Leyendoesta respuesta, Noté la redacción"el programa está mal formado; no se requiere diagnóstico".
Definido por la implementación difiere desin especificar comportamiento en que la implementación en el primer caso debe documentar claramente lo que está haciendo (en el último caso, no es necesario), ambos sonbien formado. Indefinido el comportamiento difiere de no especificado en que el programa eserróneo (1.3.13).
De lo contrario, todos tienen en común que el estándar no hace suposiciones o requisitos sobre lo que hará la implementación. Excepto 1.4 / 8, que establece que las implementaciones pueden tener extensiones que no alteran el comportamiento de programas bien formados, pero están mal formadas de acuerdo con el estándar, y la implementacióndebe diagnostica el uso de estos, pero luego puede continuar compilando y ejecutando el programa mal formado.
Unmal formado De lo contrario, el programa solo se define como no bien formado (¡genial!). UNAbien formado programa, por otro lado, se define como uno que se adhiere a la sintaxis y las reglas semánticas diagnosticables. Lo que en consecuencia significaría que un programa mal formado es uno que rompe la sintaxis o las reglas semánticas (o ambas). En otras palabras, un programa mal formadoRealmente no debería compilarse en absoluto (¿cómo se traduciría, por ejemplo, un programa con una sintaxis incorrecta de alguna manera significativa?).
Me inclinaría a pensar que la palabraerróneo también implica que el compilador debe abortar la compilación con un mensaje de error (después de todo,erróneo sugiere que hay un error), pero la sección "Nota" en 1.3.13 permite explícitamente algo diferente, como ignorar silenciosamente el problema (y los compiladores demostrablementeno haga romper la compilación debido a UB, la mayoría ni siquiera advierte por defecto).
Uno podría creer además queerróneo y mal formados son lo mismo, pero el estándar no entra en detalles si ese es el caso o lo que se supone que significa la palabra.
Además, 1.4 establece que
una implementación conforme deberá [...] aceptar y ejecutar correctamente un programa bien formado
y
Si un programa contiene una violación de una regla para la cual no se requiere diagnóstico, [...] no se requieren implementaciones con respecto a ese programa.
En otras palabras, una implementación conformedebe aceptar un programa bien formado, pero bien podría aceptar uno mal formado, e incluso sin previo aviso. Excepto, si el programa está mal formadoporque usa una extensión.
El segundo párrafo sugiere que cualquier cosa en conjunto con "no se requiere diagnóstico" significa que no hay requisitos de la especificación, lo que significa que es mayormente equivalente a "comportamiento indefinido", excepto que no se mencionaerróneo.
¿Cuál sería, por lo tanto, la intención detrás del uso de una redacción como"mal formado; no se requiere diagnóstico"?
La presencia de "sin diagnóstico" sugeriría que es idéntico (oprincipalmente ¿idéntico?) al comportamiento indefinido. Además, desdedefinido por la implementación ysin especificar el comportamiento se define comobien formado, debe seralgo diferente.
Por otro lado, dado que un programa mal formado rompe las reglas de sintaxis / semántica, en realidad no debería compilarse. Sin embargo, lo que, junto con "no se requiere diagnóstico", significaría que un compilador podría salir silenciosamente sin una advertencia, y luego no podría encontrar un ejecutable.
¿Hay alguna diferencia entre "mal formado; no se requiere diagnóstico" y "comportamiento indefinido", o es simplemente un sinónimo complicado para la misma cosa?
1A falta de una mejor redacción para el colectivo de comportamientos