널포인터가 인자로 들어오는 경우에 대해 당신은 어떤 코딩을 했나요?
대비해 별도의 처리를 했네요?
대비해 별도의 처리를 않았네요?
그렇게 하신 이유는 무엇인가요?
배경
1) 코드 작성이나 코드 평가 과정에서 null pointer 가 인자로 들어오는 경우에 대한 시시비비가 종종 관찰됐다. (아래는 null pointer가 인자로 들어오는 경우에 대해 들었던 여러 다른 생각들의 예다.)
생각 ⓪ : 그냥 무엇도 하지 않는다.
생각 ① : return (NULL); 로 종료시킨다.
생각 ② : 에러로 터뜨린다.
생각 ③ : 인자 둘 중에 하나만 null pointer면 그냥 함수를 정상 작동시킨다.
2) 과제 공통 가이드라인(Common Instructions)에서 아래의 문장을 확인했다.
“네가 만든 함수는 undefined behavior(segmetation fault, bus error, double free, etc)를 제외하고 예기치 못하게 종료해서는 안 된다. 네가 만든 함수가 undefined behavior도 아닌데 예기치 못한 종료를 하면 빵점이다.“
의문
Q : null pointer가 함수의 인자로 들어오는 경우는 undefined behaviors인가 아닌가?
•
널포인터가 undefined behaviors 라면
: null pointer 가 함수의 인자로 들어와도 함수는 예상치 못하게 종료되어도 괜찮다.
•
널포인터가 undefined behaviors가 아니라면
: null pointer 가 함수의 인자로 들어와서 예상치 못하게 종료되지 않도록 예외처리 해야한다.
탐구
C표준에 따르면 null pointer를 유효하지 않은 값(invalid value)으로, 그로 인한 결과를 undefined bevavior로 정의하고 있다.
결론
•
C표준에서 null pointer가 인자로 들어오는 경우 null pointer를 invalid value로 분류하고, invalid value를 인자로 받아 작동한 함수의 행동은 undefined behavior로 규정하고 있다.
•
과제의 Common Instruction 에 따르면 undefined behavior의 경우 예상치 못하게 함수가 종료되는 것을 허용한다.
•
따라서 우리의 함수는 null pointer가 인자로 들어오는 경우에 대해 별도의 처리를 하든, 하지 않든 둘 다 괜찮다. (빵점 처리 되지 않는다)
첨언
위 결론은 과제 수행에 한정해야한다.
과제를 벗어나 사이드 프로젝트나 현업에서는 프로그램의 운영의 묘, 개발자의 가치관에 따라 null pointer가 인자로 들어오는 경우에 대해 별도 처리를 하는 것에 대해 상황별 논의가 수반되어야 할 것이다.