요약 :
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
되었지만 null이 아닌 경우 수행 할 작업이 명확 *graph
하지 않지만 역 참조해서는 안됩니다.