sirve - sintaxis de c++
¿Qué debe hacer el compilador de C++ con los programas mal formados de acuerdo con el Estándar? (4)
¿Se requiere que la implementación de C ++ haga algo específico cuando se encuentra con un programa mal formado o el comportamiento de la implementación de C ++ simplemente no está definido?
Si el Estándar no especifica lo contrario, una implementación debería emitir un mensaje de diagnóstico (error o advertencia). Sin embargo, para algunas infracciones, el Estándar especifica explícitamente que no se requiere ningún diagnóstico . En este caso, el programa está mal formado, pero no se requiere que las implementaciones se lo indiquen al usuario, generalmente, porque hacerlo en el caso general sería demasiado difícil.
Con respecto a la Regla de una definición, por ejemplo, consulte el Párrafo 3.2 / 4 de la Norma C ++ 11:
Cada programa contendrá exactamente una definición de cada función o variable no en línea que se utiliza en ese programa; no requiere diagnóstico
Con respecto a los requisitos sobre implementaciones cuando se produce una violación de una regla, el párrafo 1.4 / 2 especifica:
[...]
- Si un programa no contiene violaciones de las reglas de esta Norma Internacional, una implementación conforme debe, dentro de sus límites de recursos, aceptar y ejecutar ese programa correctamente.
- Si un programa contiene una violación de cualquier regla diagnosticable o la ocurrencia de una construcción descrita en esta Norma como "soportada condicionalmente" cuando la implementación no es compatible con esa construcción, una implementación conforme emitirá al menos un mensaje de diagnóstico .
- Si un programa contiene una violación de una regla para la cual no se requiere ningún diagnóstico, esta Norma Internacional no impone ningún requisito en las implementaciones con respecto a ese programa.
También es relevante el párrafo 1.4 / 1, que explica lo que se entiende por " reglas diagnosticables " en el párrafo citado anteriormente:
El conjunto de reglas diagnosticables consta de todas las reglas sintácticas y semánticas en esta Norma Internacional, excepto aquellas reglas que contienen una notación explícita de que "no se requiere diagnóstico" o que se describen como resultado de "comportamiento indefinido".
Para resumir: si un programa mal formado contiene una infracción diagnosticable para la cual el Estándar no especifica explícitamente " no se requiere diagnóstico ", las implementaciones conformes deberían emitir un diagnóstico.
El estándar C ++ 03 define un programa bien formado (1.3.14 [defns.well.formed]) como
un programa C ++ construido de acuerdo con las reglas de sintaxis, las reglas semánticas diagnosticables y la Regla de una definición (3.2)
Además, define un programa mal formado (1.3.4 [defns.ill.formed]) como
entrada a una implementación de C ++ que no es un programa bien formado (1.3.14)
y el Estándar está lleno de afirmaciones tales como "si X entonces el programa está mal formado" por ejemplo (2.13.1 / 3):
Un programa está mal formado si una de sus unidades de traducción contiene un literal entero que no puede representarse por ninguno de los tipos permitidos.
Sin embargo, no he encontrado qué se requiere para la implementación de C ++ con los programas mal formados.
Supongamos que tengo un programa mal formado. ¿Ahora que?
¿Se requiere que la implementación de C ++ haga algo específico cuando se encuentra con un programa mal formado o el comportamiento de la implementación de C ++ simplemente no está definido?
(En primer lugar, lo siento por mi inglés)
La Norma, en la §1.4.2 dice:
Si un programa contiene una violación de cualquier regla diagnosticable, [...] una implementación conforme emitirá al menos un mensaje de diagnóstico.
La definición de un programa mal formado es "un programa que no está bien formado" (§1.3.9), y un programa bien formado es (§1.3.26):
Programa C ++ construido según las reglas de sintaxis, las reglas semánticas diagnosticables y la Regla de una definición
Entonces, un programa mal formado viola implícitamente la regla "algunos". Si una regla R tiene la siguiente estructura:
Si un programa tiene la propiedad P, es un programa mal formado.
Cuando un programa tiene dicha propiedad P, viola implícitamente una regla (por definición de un programa mal formado), aunque no está claro qué regla es la que se está violando, ya que R no la tiene (de una punto de vista estrictamente lógico).
Citar [intro.compliance] §2:
Si un programa no contiene violaciones de las reglas en esta Norma Internacional, una implementación conforme debe, dentro de sus límites de recursos, aceptar y ejecutar ese programa correctamente.
Si un programa contiene una violación de cualquier regla diagnosticable o la ocurrencia de una construcción descrita en esta Norma como "soportada condicionalmente" cuando la implementación no admite esa construcción, una implementación conforme emitirá al menos un mensaje de diagnóstico.
Si un programa contiene una violación de una regla para la cual no se requiere ningún diagnóstico, esta Norma Internacional no impone ningún requisito en las implementaciones con respecto a ese programa.
No he encontrado ningún otro pasaje relevante en la norma. Si combinamos esto con [defns.undefined]:
comportamiento indefinido
Comportamiento para el cual esta Norma Internacional no impone requisitos.
[ Nota: se puede esperar un comportamiento indefinido cuando esta Norma Internacional omita cualquier definición explícita de comportamiento o cuando un programa utiliza una construcción errónea o datos erróneos. El comportamiento indefinido permisible va desde ignorar la situación completamente con resultados impredecibles, a comportarse durante la traducción o la ejecución del programa de una manera documentada característica del entorno (con o sin la emisión de un mensaje de diagnóstico), hasta terminar una traducción o ejecución (con la emisión de un mensaje de diagnóstico). Muchas construcciones de programas erróneas no generan un comportamiento indefinido; se requieren para ser diagnosticados. nota final
Yo diría que llegamos a "emitir un mensaje de diagnóstico y aún más el comportamiento no está definido", porque la norma no dice nada más sobre eso.
La única cita relevante que pude encontrar dice que se requiere una implementación para diagnosticar un programa mal formado, pero puede terminar de compilarlo:
1.4 Cumplimiento de la implementación [intro.compliance]
8) Una implementación conforme puede tener extensiones (incluidas funciones de biblioteca adicionales), siempre que no alteren el comportamiento de ningún programa bien formado. Las implementaciones son necesarias para diagnosticar programas que utilizan dichas extensiones que están mal formadas de acuerdo con esta Norma Internacional. Sin embargo, habiendo hecho esto, pueden compilar y ejecutar tales programas.