
A situação em que o código C ++ é sintaticamente válido, mas seu comportamento não é definido no Padrão, costuma ser chamado de comportamento simplesmente indefinido na literatura em língua russa. No próprio Padrão, para tais situações, existem até três termos: comportamento indefinido , comportamento não especificado e comportamento definido pela implementação . Nesta breve nota, entenderemos como eles diferem.
Comportamento definido pela implementação
Esse termo é usado para descrever situações em que o código C ++ é totalmente válido, mas seu comportamento depende da implementação (por exemplo, o compilador ou o tempo de execução), e esse comportamento está documentado . Por exemplo, o tamanho em bytes de um ponteiro ou tipo int depende das configurações específicas da implementação ou do compilador, mas isso é descrito na documentação e você pode confiar nessa documentação.
Comportamento não especificado
O termo significa que o comportamento do código C ++ válido não é definido pelo Padrão e depende da implementação; além disso, não está documentado (pelo menos oficialmente). Exemplo: o procedimento para calcular os valores dos argumentos da função é determinado pelo compilador, mas em nenhum lugar há uma descrição de como. O padrão nos diz: esses são recursos comportamentais que não são fixos em lugar algum; portanto, você não pode confiar neles. Portanto, o comportamento do seu código não deve depender desses recursos.
Comportamento indefinido
Essa é a variante mais perigosa da incerteza. No Padrão, é usado para descrever comportamentos que podem levar a conseqüências completamente imprevisíveis. Os exemplos mais impressionantes são acessar os limites de uma matriz ou desreferenciar um ponteiro para um objeto liberado. A pior parte é que o programa não precisa terminar imediatamente ou nem produzir nenhum erro; no entanto, seu comportamento não pode mais ser invocado.
Concluindo, lembro novamente que todos os termos acima se referem a códigos sintaticamente válidos que serão compilados com êxito (no entanto, os compiladores costumam dar avisos para os casos mais óbvios de comportamento indefinido ). Código inválido do ponto de vista do Padrão é chamado de programa mal formado .