Resumen :
¿Debería una función en C verificar siempre para asegurarse de que no está desreferenciando un NULL
puntero? Si no es así, ¿cuándo es apropiado omitir estos controles?
Detalles :
He estado leyendo algunos libros sobre programación de entrevistas y me pregunto cuál es el grado apropiado de validación de entrada para argumentos de función en C. Obviamente, cualquier función que reciba información de un usuario debe realizar la validación, incluida la comprobación de un NULL
puntero antes de desreferenciarlo. Pero, ¿qué pasa en el caso de una función dentro del mismo archivo que no espera exponer a través de su API?
Por ejemplo, lo siguiente aparece en el código fuente de 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;
}
Si *graph
es NULL
así, un puntero nulo será desreferenciado, probablemente bloqueando el programa, pero posiblemente resultando en algún otro comportamiento impredecible. Por otro lado, la función es static
y quizás el programador ya haya validado la entrada. No lo sé, simplemente lo seleccioné al azar porque fue un breve ejemplo en un programa de aplicación escrito en C. He visto muchos otros lugares donde se usan punteros sin verificar NULL. Mi pregunta es general, no específica de este segmento de código.
Vi una pregunta similar en el contexto de la entrega de excepciones . Sin embargo, para un lenguaje inseguro como C o C ++ no hay propagación automática de errores de excepciones no controladas.
Por otro lado, he visto mucho código en proyectos de código abierto (como el ejemplo anterior) que no realiza ninguna comprobación de punteros antes de usarlos. Me pregunto si alguien tiene ideas sobre las pautas para cuándo poner cheques en una función en lugar de asumir que la función se llamó con los argumentos correctos.
Estoy interesado en esta pregunta en general para escribir código de producción. Pero también estoy interesado en el contexto de la programación de entrevistas. Por ejemplo, muchos libros de texto de algoritmos (como CLR) tienden a presentar los algoritmos en pseudocódigo sin ninguna comprobación de errores. Sin embargo, si bien esto es bueno para comprender el núcleo de un algoritmo, obviamente no es una buena práctica de programación. Por lo tanto, no quisiera decirle a un entrevistador que estaba omitiendo la comprobación de errores para simplificar mis ejemplos de código (como podría hacerlo un libro de texto). Pero tampoco quisiera parecer que produce código ineficiente con una comprobación de errores excesiva. Por ejemplo, graph_get_current_column_color
podría haberse modificado para verificar *graph
si es nulo, pero no está claro qué haría si *graph
fuera nulo, de lo contrario no debería desreferenciarlo.