É um comportamento indefinido que excede os limites de conversão e existem ferramentas do verificador para encontrá-lo?

PERGUNTA ORIGINAL:

Estou pesquisando no padrão C90 por coisas que você deve conhecer, ao escrever códigos portáteis, enquanto confia pouco na boa vontade do fornecedor do compilador e presumo que meu software possa matar alguém às vezes, se eu fizer algo errado. Digamos que sou um pouco paranóico.

No momento, estou pensando nos "limites de conversão" (5.2.4.1 ANSI / ISO 9899: 1990). Conforme apontado no padrão e em: "O ansi C coloca um limite no número de variáveis externas em um programa?", esses são os requisitos mínimos para uma implementação em conformidade padrão. Agora, por outro lado, isso significa que qualquer implementação não precisa fazer mais - e se eu quiser ter certeza de que meu código funcione para qualquer implementação entre eles, esses limites representam limites absolutos para mim.

Até agora tão irritante.

Portanto, o fornecedor do compilador escolhe limites iguais ou acima dos limites mínimos de inflação exigidos.

O que acontece agora se alguém exceder esses limites de inflação definidos pela implementação de uma implementação específica? Na minha cópia do ANSI / IO 9899: 1990 (C90), não encontrei nada, portanto acho que é um Comportamento Indefinido "do tipo 3." (por omissão). Por outro lado, não seria a primeira vez que eu não entendi o padrão ou não encontrei a passagem certa.

Então, aqui estão as minhas questões:

Está excedendo os limites de conversão de um comportamento indefinido de implementação específica no C90?

O comportamento do C90 é válido para as versões corrigidas até C95 / C96 e para as novas iterações C99 e C11?

Alguém viu uma ferramenta de verificação lá fora, que verifica os limites mínimos ou definidos pelo usuário (ferramenta)?

ASPECTOS ALÉM DA PERGUNTA ORIGINAL:Aspectos interessantes nas respostas e comentários:

1) ComoMichael Burr apontado de forma diretacomentar a pergunta, de acordo com o C-Standard (verifiquei apenas o C90 sem correções e o rascunho do C99, Michael referenciouaqui) uma implementação em conformidade C precisa aceitar apenas UM programa, que contém todos os limites ao mesmo tempo, o que, na interpretação mais estrita, anula qualquer garantia de limite mínimo.

2) Comorubenvb eKeith Thompson Como mencionado, implementações de alguma qualidade devem fornecer diagnósticos para o caso, de que seus limites definidos de implementação são excedidos, especialmente se não estiverem em conformidade com os requisitos mínimos (rubenvb vinculou um exemplo para MSVC em umComente)

3) Como exceder os limites do compilador pode ser um comportamento indefinido, mas certamente leva a algum erro, os valores das "variáveis" às quais os limites de conversão se aplicam a um determinado pedaço do meu código representam pré-condições para reutilização.

Minhas estratégias pessoais para lidar com eles

1) Portanto, para uma paranóia máxima, vou me enganar e incomodar o suporte dos fornecedores do compilador com uma solicitação para me garantir que os limites escolhidos pela implementação se apliquem a qualquer programa. :-(

2) Portanto, investigarei as documentações do compilador e a capacidade de sofrimento do compilador para obter a confirmação de que: - para cada limite de conversão, se for excedido, um diagnóstico será gerado e - porque é um comportamento indefinido, se toda instância de exceder um limite de conversão gerar um diagnóstico - ou outro erro já impediu uma compilação.

3) Portanto, tentarei colocar uma mão na ferramenta (ou me desenvolver, se for necessário), que mede esses valores e os forneça como pré-condição para a reutilização de código do meu programa. ComoKeith Thompson apontado nesteresponda alguns valores podem precisar de um conhecimento mais profundo sobre como a Implementação é ... implementada. Não sei perfeitamente o que pode ajudar nesses casos, além das ações em 2.), no entanto, tanto quanto vejo, tenho que testar - mas só preciso testar se há UB (sem diagnóstico) e se isso é necessário. Nesse caso, um teste bem-sucedido não pode garantir a correção no caso geral.

RESPONDIDAS:

Sim, é um comportamento indefinido por obmissão.

Keith Thompson mostrou em seu (aceito)resposta com terminologia e referência aos documentos padrão C, que é um comportamento indefinido.

Uma ferramenta que verifica os limites de transação no código ainda não foi descoberta pelos comentaristas. Se ocorrer uma ferramenta para alguém que tenha (mesmo parcialmente) essa funcionalidade, deixe uma resposta ou comentário.

questionAnswers(3)

yourAnswerToTheQuestion