strcpy_s등의 _s 류의 문자열처리 함수에 대해
VC++ 6.0으로 작성된 프로젝트를 VS 2005 이상으로 변환해서 컴파일 하거나,
VS2005로 프로젝트 작성시 strcpy, sprintf, strcat 등의 C 런타임 함수를 사용하면 다음과 같은 warning 메시지를 접하게 된다.
warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
strcpy_s, sprintf_s, strcat_s 와 같은 안전한 스트링 함수를 사용하라는 내용인데...
이 함수들의 원형을 살펴보면 두번째 인자가 캐릭터의 숫자임을 알 수 있다.
< 밑에 GrooveFella님이 지적해주신대로 sizeof(buffer)가 아니라 _countof(buffer)로 계산해야 한다. >
errno_t strcpy_s( char *strDestination, size_t numberOfElements, const char *strSource );
즉 strDestination 버퍼를 넘어서는 메모리 복사를 방지하는 스트링 함수라 이해하면 되겠다.
그래서 _s(afe)로 추측되는 함수들을 만들어 놨을 테고...
그럼 이 보기 싫은 warnig을 어떻게 처리할 것인가?
1. 제일 무식한 방법으로는 아래의 pragma를 설정하여, 해당 warnig을 표시하지 않도록 설정한다.
#pragma warning(disable: 4996)
2. 그게 아니면 당연히 _s류의 함수로 바꿔야 겠지?
여기서 한가지 집고 넘어가자면
char szBuf[MAX_PATH]; |
형태의 코딩이 가능하다는 거다.
char *pszBuf = new char[MAX_PATH]; |
이러한 코딩은 “error C2660: 'strcpy_s' : 함수는2개의매개변수를사용하지않습니다.”라는 컴파일 에러가 발생한다.
두 코드의 차이점이 보이는가?
그렇다. _s류 함수의 첫번째 인자로 배열이 들어가면, 매크로에 의해 사이즈가 자동으로 계산된다.
3. 자... 그럼 조금 더 생각해 보자.
strcpy_s는 strncpy와 무엇이 다를까? 아니면 똑같이 동작하는가?
아래의 코드를 돌려보면 답은 명확해 진다.
char *pszBuf = new char[6]; |
(1) 의 코드는 할당된 메모리(6byte)를 넘어서서 7byte까지 'a'로 채운 후 다음 코드가 진행된다.
( 머 이후의 상황이야 엄한 곳에서 메모리를 할당하거나 해제 할 때 문제가 발생 할 테지, 운이 억수로
나쁘다면 문제가 없는 것처럼 보일 수 도 있을 테고...)
(2)의 코드는 메모리 에러를 발생시키며, 프로그램이 종료된다.
귀찮다고 방치하지 말고, 이 기회에 바꿔보는 건 어떨까?
'C++' 카테고리의 다른 글
std::map (0) | 2009.09.03 |
---|---|
std::vector (0) | 2009.08.26 |
오버로드/오버라이드 (2) | 2009.04.01 |
Warning C4748: /GS can not protect parameters and local variables from local buffer overrun because optimizations are disabled in function (0) | 2009.01.21 |
Name Mangling(Name Decoration) (0) | 2008.10.07 |