Riepilogo :
Se una funzione in C verifica sempre che non stia differenziando un puntatore NULL
? In caso contrario, quando è opportuno saltare questi controlli?
Dettagli :
Ho letto alcuni libri sulle interviste di programmazione e mi chiedo quale sia il grado appropriato di convalida dell'input per gli argomenti delle funzioni in C? Ovviamente qualsiasi funzione che richiede l'input da un utente deve eseguire la convalida, incluso il controllo di un puntatore NULL
prima di dereferenziarlo. Ma che dire nel caso di una funzione all'interno dello stesso file che non ti aspetti di esporre tramite la tua API?
Ad esempio il seguente appare nel codice sorgente di 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
è NULL
allora un puntatore nullo sarà dereferenziato, probabilmente causando il crash del programma, ma probabilmente con qualche altro comportamento imprevedibile. D'altra parte la funzione è static
e quindi forse il programmatore ha già validato l'input. Non lo so, l'ho appena selezionato a caso perché era un breve esempio in un programma applicativo scritto in C. Ho visto molti altri posti dove i puntatori sono usati senza verificare NULL. La mia domanda è generale non specifica per questo segmento di codice.
Ho visto una domanda simile nel contesto di gestione delle eccezioni . Tuttavia, per un linguaggio non sicuro come C o C ++ non esiste la propagazione automatica degli errori delle eccezioni non gestite.
D'altra parte ho visto un sacco di codice in progetti open source (come nell'esempio sopra) che non esegue alcun controllo dei puntatori prima di usarli. Mi chiedo se qualcuno abbia dei pensieri sulle linee guida per quando mettere i controlli in una funzione, assumendo che la funzione sia stata chiamata con argomenti corretti.
Sono interessato a questa domanda in generale per la scrittura di codice di produzione. Ma sono anche interessato al contesto delle interviste di programmazione. Ad esempio, molti libri di testo sugli algoritmi (come CLR) tendono a presentare gli algoritmi in pseudocodice senza alcun controllo degli errori. Tuttavia, mentre questo è utile per comprendere il nucleo di un algoritmo, ovviamente non è una buona pratica di programmazione. Quindi non vorrei dire a un intervistatore che stavo saltando il controllo degli errori per semplificare i miei esempi di codice (come potrebbe essere un libro di testo). Ma anche io non vorrei apparire per produrre codice inefficiente con eccessivo controllo degli errori. Ad esempio il graph_get_current_column_color
potrebbe essere stato modificato per verificare *graph
per null ma non è chiaro cosa farebbe se *graph
fosse nullo, diverso da quello non dovrebbe dereferenziarlo.