윈도우즈 프로그래밍에서 HANDLE을 리턴하는 함수를 사용시 최근에 봤던 문제점들을 보자.(의외로 많이 봤다.)
아래와 같이 CreateFile을 사용하는 상황에서 제대로 자원이 할당되었다면, 할당된 자원에 대한 HANDLE이 리턴이 될 것이다. Line 7에서는 제대로 할당되지 않았을때를 대비한 방어코드가 들어가 있어서 별 문제가 없는 것처럼 보인다.
하지만, 해당 코드에 대한 분석을 하게 되면, Line 7에서 Redundant Condition과 Line 10에서 Free Null Pointer 오류를 볼 수 있다.
이유는 간단하다. CreateFile이 자원 할당 실패시 NULL을 반환하는게 아니라 INVALID_HANDLE_VALUE(-1로 정의되어 있음.)를 반환하기 때문이다.(MSDN 참조)
void CreateFileTest(std::string fileName) { HANDLE file; file = CreateFile(_T("somePath"), GENERIC_READ, 0, 0, CREATE_ALWAYS, 0, 0); if ( file != NULL ) { // doSomething CloseHandle(file); } else { printf("Error\n"); } }
아래와 같이 수정하면 된다.