まとめ:
Cの関数は、NULL
ポインターを間接参照していないことを常に確認する必要がありますか?そうでない場合、これらのチェックをスキップするのが適切ですか?
詳細:
プログラミングのインタビューに関する本をいくつか読んでいますが、Cの関数引数の入力検証の適切な程度はどうなっているのでしょうか?明らかに、ユーザーから入力を受け取る関数は、NULL
参照を解除する前にポインターをチェックするなど、検証を実行する必要があります。しかし、APIを介して公開することを期待しない同じファイル内の関数の場合はどうでしょうか?
たとえば、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;
}
場合*graph
であるNULL
ヌル・ポインタは、おそらくプログラムをクラッシュが、おそらく他のいくつかの予期しない動作が得られ、逆参照されます。一方、関数はstatic
そうなので、プログラマーはすでに入力を検証しているかもしれません。Cで書かれたアプリケーションプログラムの短い例であるため、ランダムに選択しただけです。NULLをチェックせずにポインターが使用される場所は他にもたくさんあります。私の質問は、一般にこのコードセグメントに固有のものではありません。
例外処理の文脈の中で同様の質問があるのを見ました。ただし、CやC ++などの安全でない言語では、未処理の例外の自動エラー伝播はありません。
一方、オープンソースプロジェクト(上記の例など)では、使用する前にポインターのチェックを行わないコードがたくさん見られました。関数にチェックを入れるタイミングと、関数が正しい引数で呼び出されたと仮定するタイミングに関するガイドラインについて誰かが考えているかどうか疑問に思っています。
私は本番コードを書くためにこの質問全般に興味があります。しかし、私はプログラミングインタビューのコンテキストにも興味があります。たとえば、多くのアルゴリズムの教科書(CLRなど)は、エラーチェックなしで擬似コードでアルゴリズムを提示する傾向があります。ただし、これはアルゴリズムの中核を理解するのには適していますが、明らかにプログラミングの実践としては適切ではありません。そのため、(教科書のように)コード例を単純化するためにエラーチェックをスキップしていることをインタビュアーに伝えたくありません。しかし、私はまた、過度のエラーチェックを伴う非効率なコードを生成するようには見えません。たとえば、null graph_get_current_column_color
をチェックするように変更された可能性があり*graph
ますが、*graph
nullである場合の動作は明確ではありません。