Pergunta

Como usuário Tony pontos há uma [Observação] no parágrafo 1.3.12 de C++ padrão dizendo:

admissível comportamento indefinido intervalos de ignorar a situação completamente com resultados imprevisíveis, para se comportar durante a tradução ou a execução do programa em um documentados de forma característica do ambiente...

Isso não contradiz a definição de UB dizendo que ...essa Norma Internacional não impõe requisitos de?Quero dizer, eles dizem "não" requisitos e, em seguida, dizer "admissível UB" - direito no mesmo parágrafo.

Como isso deve ser interpretado?Não é, de fato, o limite de UB, de forma alguma?

Foi útil?

Solução

Do §6.5.1 de Parte 3 da norma ISO/IEC Directivas:

Notas e exemplos integrado no texto de uma norma devem ser utilizados apenas para dar informações adicionais pretende-se auxiliar o entendimento ou uso do padrão e não conter disposições para a qual é necessária para obedecer, a fim de ser a afirmação de conformidade com o standard.

Portanto, é totalmente não-normativos (não vinculativo) e apenas para eventuais esclarecimentos.

Outras dicas

Como as notas não são normativas, não limita o UB de forma alguma. É apenas um esclarecimento que uma implementação pode usar algumas construções que causam formalmente a UB como uma extensão documentada, embora qualquer programa que dependa de tal detalhe seja, é claro, inerentemente não portátil para outros ambientes.

Esta nota está explicando o que uma implementação pode fazer se encontrar código para o qual não houver comportamento definido. A palavra "permitida" não se destina a ser uma restrição, mas alguns exemplos de comportamentos comuns são dados.

É interessante notar que um compilador quase sempre precisa compilar algo! Considere este fragmento de código:

void f() { 1 / 0; }

O comportamento do tradutor ao encontrar isso não está bem definido, mas não pode apenas fazer o que quiser! De fato, se for um compilador, ainda é necessário compilar esta unidade de compilação. Isso ocorre porque o comportamento de um programa que contém essa função ainda pode ser bem definido! O compilador não pode saber se a função é chamada. De fato, essa questão surgiu onde a função era "main ()" e o controle certamente fluiria através da divisão zero, e o resultado é que o compilador não pode rejeitar nem mesmo esse programa. O motivo é: o programa ainda está bem formado e um compilador em conformidade é necessário para aceitar todos os programas bem formados (e rejeitar todos os mal formados e emitir uma mensagem de erro de diagnóstico, a menos que especificado de outra forma).

Isso não pode ser fácil de ser mal formado, porque é difícil especificar exatamente como os compiladores inteligentes podem ser necessários para detectar quando uma divisão por zero deve ocorrer.

Curiosamente, a reivindicação do padrão de que "não impõe requisitos" está de fato muito perto de estar errado. São características de um sistema de compilação que suporta compilação separada que não pode detectar se um pedaço de código para o qual não existe um comportamento bem definido é, de fato, executado, e assim o compilador é de fato requeridos para compilar algo de qualquer maneira, porque não pode deduzir se o programa tem comportamento indefinido.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top