Resumo :
Uma função em C sempre deve verificar se não está referenciando um NULL
ponteiro? Caso contrário, quando é apropriado ignorar essas verificações?
Detalhes :
Eu tenho lido alguns livros sobre entrevistas de programação e estou me perguntando qual é o grau apropriado de validação de entrada para argumentos de função em C? Obviamente, qualquer função que receba informações de um usuário precisa executar a validação, incluindo a verificação de um NULL
ponteiro antes de desferenciá-lo. Mas e no caso de uma função no mesmo arquivo que você não espera expor por meio de sua API?
Por exemplo, o seguinte aparece no código-fonte do git:
static unsigned short graph_get_current_column_color(const struct git_graph *graph)
{
if (!want_color(graph->revs->diffopt.use_color))
return column_colors_max;
return graph->default_column_color;
}
Se *graph
for NULL
, um ponteiro nulo será desreferenciado, provavelmente travando o programa, mas possivelmente resultando em outro comportamento imprevisível. Por outro lado, a função é static
e, portanto, talvez o programador já tenha validado a entrada. Eu não sei, eu apenas o selecionei aleatoriamente, porque foi um pequeno exemplo em um programa aplicativo escrito em C. Eu já vi muitos outros lugares em que ponteiros são usados sem verificar NULL. Minha pergunta é geral, não específica para este segmento de código.
Vi uma pergunta semelhante dentro do contexto de entrega de exceções . No entanto, para uma linguagem não segura como C ou C ++, não há propagação automática de erros de exceções não tratadas.
Por outro lado, vi muitos códigos em projetos de código aberto (como o exemplo acima) que não fazem nenhuma verificação de ponteiros antes de usá-los. Eu estou querendo saber se alguém tem idéias sobre diretrizes para quando colocar cheques em uma função vs. assumindo que a função foi chamada com argumentos corretos.
Estou interessado nesta questão em geral para escrever código de produção. Mas também estou interessado no contexto das entrevistas de programação. Por exemplo, muitos livros didáticos de algoritmos (como CLR) tendem a apresentar os algoritmos no pseudocódigo sem nenhuma verificação de erro. No entanto, embora isso seja bom para entender o núcleo de um algoritmo, obviamente não é uma boa prática de programação. Portanto, não gostaria de dizer a um entrevistador que estava ignorando a verificação de erros para simplificar meus exemplos de código (como um livro didático). Mas eu também não gostaria de parecer produzir código ineficiente com verificação de erro excessiva. Por exemplo, o graph_get_current_column_color
poderia ter sido modificado para verificar se *graph
há nulo, mas não está claro o que faria se *graph
fosse nulo, além de não desreferê-lo.