As diretrizes principais do C ++ têm a regra ES.20: sempre inicialize um objeto .
Evite erros usados antes do conjunto e seu comportamento indefinido associado. Evite problemas com a compreensão de inicialização complexa. Simplifique a refatoração.
Mas essa regra não ajuda a encontrar erros, apenas os oculta.
Vamos supor que um programa tenha um caminho de execução em que use uma variável não inicializada. Isso é um bug. Comportamento indefinido à parte, também significa que algo deu errado, e o programa provavelmente não atende aos requisitos do produto. Quando será implantado na produção, pode haver uma perda de dinheiro, ou pior ainda.
Como podemos rastrear bugs? Nós escrevemos testes. Mas os testes não cobrem 100% dos caminhos de execução e nunca cobrem 100% das entradas do programa. Mais do que isso, mesmo um teste cobre um caminho de execução com defeito - ele ainda pode passar. É um comportamento indefinido, afinal, uma variável não inicializada pode ter um valor válido.
Mas, além de nossos testes, temos os compiladores que podem escrever algo como 0xCDCDCDCD em variáveis não inicializadas. Isso melhora um pouco a taxa de detecção dos testes.
Melhor ainda - existem ferramentas como o Sanitizer de Endereço, que captura todas as leituras de bytes de memória não inicializados.
E, finalmente, existem analisadores estáticos, que podem olhar para o programa e dizer que existe uma leitura antes do conjunto nesse caminho de execução.
Portanto, temos muitas ferramentas poderosas, mas se inicializarmos a variável - os desinfetantes não encontrarão nada .
int bytes_read = 0;
my_read(buffer, &bytes_read); // err_t my_read(buffer_t, int*);
// bytes_read is not changed on read error.
// It's a bug of "my_read", but detection is suppressed by initialization.
buffer.shrink(bytes_read); // Uninitialized bytes_read could be detected here.
// Another bug: use empty buffer after read error.
use(buffer);
Existe outra regra - se a execução do programa encontrar um bug, o programa deverá morrer o mais rápido possível. Não é necessário mantê-lo vivo, basta travar, escrever um despejo de acidente e entregá-lo aos engenheiros para investigação.
A inicialização desnecessária de variáveis faz o oposto - o programa está sendo mantido vivo, quando já haveria uma falha de segmentação.
\0
ele, é buggy. Se estiver documentado para não lidar com isso, o seu código de chamada é incorreto. Se você corrigir seu código de chamada para verificar bytes_read==0
antes de usar, retornará ao ponto em que começou: seu código é incorreto se você não inicializar bytes_read
, seguro se o fizer. ( Geralmente, as funções são supostamente para encher os seus out-parâmetros, mesmo em caso de um erro : não é realmente Muitas vezes as saídas ou são deixados sozinhos ou indefinido..)
err_t
retornado por my_read()
? Se houver um bug em qualquer lugar do exemplo, é isso.
bytes_read
não for alterado (portanto, mantido zero), por que isso deveria ser um bug? O programa ainda pode continuar de maneira sadia, desde que não espere implicitamentebytes_read!=0
posteriormente. Portanto, é bom que os desinfetantes não reclamem. Por outro lado, quandobytes_read
não for inicializado de antemão, o programa não poderá continuar de maneira sã; portanto, não inicializarbytes_read
realmente introduz um bug que não existia anteriormente.