Diferença entre comportamento indefinido e mal formado, nenhuma mensagem de diagnóstico necessária

O padrão C ++ vem com um número impressionante de definições parapouco claro1 comportamento que significa mais ou menos o mesmo com diferenças sutis. Lendoesta resposta, Notei a redação"o programa está mal formado; não é necessário diagnóstico".

Definido pela implementação difere denão especificado comportamento em que a implementação no primeiro caso deve documentar claramente o que está fazendo (no último caso, não precisa), ambos sãobem formado. Indefinido comportamento difere do não especificado, pois o programa éerrôneo (1.3.13)
Caso contrário, todos têm em comum que o padrão não faz suposições ou requisitos sobre o que a implementação fará. Exceto pelo 1.4 / 8, que afirma que as implementações podem ter extensões que não alteram o comportamento de programas bem formados, mas são mal formadas de acordo com o padrão e a implementaçãodevo diagnosticar o uso desses, mas poderá continuar a compilar e executar o programa mal formado.

Amal formado caso contrário, o programa é definido apenas como não sendo bem formado (ótimo!). UMAbem formado Por outro lado, o programa é definido como um que adere à sintaxe e às regras semânticas diagnosticáveis. O que, consequentemente, significaria que um programa mal formado é aquele que quebra as regras de sintaxe ou de semântica (ou ambas). Em outras palavras, um programa mal formadona realidade não deve compilar (como traduzir, por exemplo, um programa com uma sintaxe incorreta de alguma maneira significativa?).

Eu estaria inclinado a pensar que a palavraerrôneo implica também que o compilador deve interromper a compilação com uma mensagem de erro (afinal,errôneo sugere que há um erro), mas a seção "Nota" na 1.3.13 permite explicitamente algo diferente, incluindo ignorar silenciosamente o problema (e compiladores comprovadamentenão quebrar a compilação por causa do UB, a maioria nem avisa por padrão).

Pode-se acreditar ainda queerrôneo e mal-formados são os mesmos, mas o padrão não entra em detalhes se for esse o caso ou o que a palavra deve significar.

Além disso, 1.4 afirma que

uma implementação em conformidade deve [...] aceitar e executar corretamente um programa bem formado

e

Se um programa contiver uma violação de uma regra para a qual não é necessário diagnóstico, [...] nenhum requisito em implementações com relação a esse programa.

Em outras palavras, uma implementação em conformidadedevo aceita um programa bem formado, mas pode muito bem aceitar um programa mal formado, e mesmo sem aviso. Exceto se o programa estiver mal formadoporque usa uma extensão.

O segundo parágrafo sugere que qualquer coisa em conjunto com "nenhum diagnóstico necessário" significa que não há requisitos da especificação, o que significa que é basicamente equivalente a "comportamento indefinido", exceto que não há menção deerrôneo.

Qual seria, portanto, a intenção por trás de usar uma redação como"mal formado; não é necessário diagnóstico"?

A presença de "nenhum diagnóstico" sugere que é idêntico (ouna maioria das vezes idêntico?) ao comportamento indefinido. Além disso, desdedefinido pela implementação enão especificado comportamento são definidos comobem formado, deve seralgo diferente.

Por outro lado, como um programa mal formado quebra as regras de sintaxe / semântica, na verdade não deve compilar. O que, no entanto, em conjunto com "nenhum diagnóstico necessário" significaria que um compilador teria permissão para sair silenciosamente sem o aviso, e você não seria capaz de encontrar um executável posteriormente.

Existe uma diferença entre "mal formado; não é necessário diagnóstico" e "comportamento indefinido" ou isso é simplesmente um sinônimo complicado para a mesma coisa?

1Na falta de uma redação melhor para o coletivo de comportamentos

questionAnswers(2)

yourAnswerToTheQuestion