본문 바로가기

Testing Tools/CodeSonar

Windows에서 HANDLE 사용 관련...

윈도우즈 프로그래밍에서 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");
	}
}

아래와 같이 수정하면 된다.