Secure CRT Functions

Visual C++ 2005에서는 CRT함수들이 ‘_s’ 꼬리를 달고 새로 작성됐다. 대표적인 특징이라면, 버퍼의 크기를 파라미터로 넘겨준다는 것인데, 예를 들어 memcpy함수의 경우 destination buffer의 크기를 명시하는 값이 파라 미터로 추가되는 식이다. 따라서 memcpy_s함수의 프로토타입은 다음과 같이 선언된다.

감히, MSDN을 무시하고 이런 함수를 사용한다면…, 적어도 나의 경우에는, 당연히 Buffer Overflow를 방지할 수 있도록 수정된 것이라고 기대했다. 나라면 분명히 그렇게 했을 것이다. 그러나 Microsoft는 그렇게 하지 않았다.

It should also be noted that the secure functions do not prevent or correct security errors; rather, they catch errors when they occur. They perform additional checks for error conditions, and in the case of an error, they invoke an error handler. ((Security Enhancements in the CRT , MSDN))

즉, 에러를 보안오류를 해결해주진 않고, 그 에러에 대한 처리를 할 수 있도록 해준다는 것이다. MSDN을 좀 더 살펴보면, _set_invalid_parameter_handler함수를 사용한 예제가 나오긴 한다. 근데, 그렇게 하는 게 정말 좋은 거야?

결론…,
감히 MSDN을 무시해? 넌 당해도 싸!

RegCreateKeyEx() & Windows 2000

Windows XP와 Windows Vista에서는 아무런 문제가 없는 VC++ 2005로 작성된 프로그램이 Windows 2000에서만 런타임에러를 토해버린다. Micorsoft를 싸잡아 욕하면서 꽤 많은 시간을 삽질한 결과…, 역시나 내 실수다.

out 파라미터인 phkResult가 NULL인 경우, 이러한 예외상황을 Windows XP와 Windows Vista에서는 적절히 처리하는데 반해서 Windows 2000은 그렇지 못하다.

MSDN이 말하지 않았으면, 하지 말라는 거다!