Zusammenfassung :
Sollte eine Funktion in C immer prüfen, ob sie keinen NULL
Zeiger dereferenziert ? Wenn nein, wann ist es angebracht, diese Prüfungen zu überspringen?
Details :
Ich habe einige Bücher über Programmierinterviews gelesen und frage mich, wie hoch der Grad der Eingabevalidierung für Funktionsargumente in C ist. Offensichtlich muss jede Funktion, die Eingaben von einem Benutzer entgegennimmt, eine Validierung durchführen, einschließlich der Überprüfung auf einen NULL
Zeiger, bevor er dereferenziert wird. Aber was ist mit einer Funktion in derselben Datei, die Sie nicht über Ihre API verfügbar machen möchten?
Zum Beispiel erscheint folgendes im Quellcode von 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;
}
Wenn dies der Fall *graph
ist, NULL
wird ein Nullzeiger dereferenziert, was möglicherweise zum Absturz des Programms führt, möglicherweise jedoch zu einem anderen unvorhersehbaren Verhalten. Andererseits ist die Funktion static
und so hat der Programmierer möglicherweise die Eingabe bereits validiert. Ich weiß nicht, ich habe es nur zufällig ausgewählt, weil es ein kurzes Beispiel in einem in C geschriebenen Anwendungsprogramm war. Ich habe viele andere Stellen gesehen, an denen Zeiger verwendet werden, ohne nach NULL zu suchen. Meine Frage ist allgemein nicht spezifisch für dieses Codesegment.
Ich sah eine ähnliche Frage im Zusammenhang mit der Ausnahmebehandlung . Für eine unsichere Sprache wie C oder C ++ gibt es jedoch keine automatische Fehlerweitergabe für nicht behandelte Ausnahmen.
Andererseits habe ich in Open-Source-Projekten (wie im obigen Beispiel) viel Code gesehen, der vor der Verwendung keine Überprüfung von Zeigern durchführt. Ich frage mich, ob jemand über Richtlinien nachdenkt, wann eine Funktion überprüft werden soll, anstatt davon auszugehen, dass die Funktion mit korrekten Argumenten aufgerufen wurde.
Ich interessiere mich allgemein für diese Frage zum Schreiben von Produktionscode. Mich interessiert aber auch der Kontext von Programmierinterviews. Beispielsweise tendieren viele Algorithmus-Lehrbücher (wie CLR) dazu, die Algorithmen ohne jegliche Fehlerprüfung im Pseudocode darzustellen. Dies ist zwar gut, um den Kern eines Algorithmus zu verstehen, aber offensichtlich keine gute Programmierpraxis. Daher möchte ich keinem Interviewer mitteilen, dass ich die Fehlerprüfung übersprungen habe, um meine Codebeispiele zu vereinfachen (wie es in einem Lehrbuch der Fall sein könnte). Aber ich möchte auch nicht erscheinen, um ineffizienten Code mit übermäßiger Fehlerprüfung zu erzeugen. Zum Beispiel graph_get_current_column_color
könnte das geändert worden sein, um *graph
auf null zu prüfen, aber es ist nicht klar, was es tun würde, wenn *graph
null wäre, außer dass es es nicht dereferenzieren sollte.