Complementado:
Parece um detalhe técnico, mas esse "buraco negro" na lógica do programa é o que torna o comportamento indefinido extremamente perigoso, porque ele simplesmente torna seu código inválido. O compilador pode literamente fazer QUALQUER coisa!
- Funciona por sorte — até que não funcione mais.
Você pode pensar: "Que bom, deu certo!" Mas não deu. Isso é pura sorte. O programa é inválido, e esse "funcionamento" não tem garantia nenhuma. Troque o compilador, rode em outra máquina ou adicione uma instrução qualquer e o resultado pode ser um travamento, um valor absurdo ou algo pior. Confiar nisso é como jogar roleta-russa com seu software. Já peguei código em C que quebrava quando removia um comentário!!!
- compilador vira um inimigo imprevisível
O compilador não tem obrigação de "fazer sentido" e isso é aterrorizante. Um erro em uma linha pode derrubar o programa em outro ponto, tornando o bug um pesadelo para rastrear. O programa roda direitinho por semanas, mas do nada o erro pode bagunçar a memória, criando falhas misteriosas que só aparecem muito distante da instrução problemática no tempo e espaço.
O comportamento indefinido é perigoso porque destrói a confiabilidade do seu software.
Mas, por que tem tanto comportamento indefinido em C? Quando o comitê se reuniu para formalizar a linguagem C, havia muitas implementações concorrentes, cada uma com suas próprias peculiaridades e comportamentos. Definir um padrão único para todos os casos teria quebrado muitos compiladores e programas existentes, que já dependiam dessas diferenças. Assim, para manter a compatibilidade e a flexibilidade, o padrão optou por deixar certos comportamentos "indefinidos". Essa decisão permitiu que cada implementação de C continuasse a fazer o que já fazia, sem forçar uma mudança radical. Em resumo, o comportamento indefinido existe em C por uma questão de legado, um compromisso para não quebrar o que já estava estabelecido. Mais prático sempre ganha de técnicamente superior. Se C não fosse essa ZONA teria perdido para o ADA como padrão de assembly portátil, se na época não deu, achar que Rust vai substituir o C hoje é completa loucura!!!