본문 바로가기

오래된 흔적/Visual Studio.NET

warning C4996 (VS 2005&2008 CRT 함수 관련 경고)

warning C4996 (VS 2005&2008 CRT 함수 관련 경고) Warning

2008/06/17 08:13

====================== 첫번째 참조 =======================
비쥬얼 스튜디오 2005에서 컴파일 하다 보면 위의 warning이 뜨는것을 볼 수 있습니다.
몇가지 경우가 있는듯 한데


대표적으로 예전의 문자열 관련 CRT 함수를 쓰면 나타납니다.
위 warning의 의미는 "VS2005에서 이전 문자열 관련 CRT함수의 안전성을 강화하기 위하여
"_s"가 붙는 함수를 다시 만들었기 때문에 될 수 있으면 이전에 사용하던 함수는 사용하지 마라" 정도가 되겠습니다.

예) strcpy  -> strcpy_s

 

안전성이라고 해봐야 특별한것은 없고 메모리 관련 에러가 나면 확실하게 에러를 표시해 주는 기능 정도인거 같습니다 (이전 함수들은 메모리 버퍼의 크기에 대한 보장을 못합니다).


그래서 요즘 드는 생각들이 C 함수 보다는 C++이 제공해주는 (엄밀하게 말한다면
C++ 로 만든 표준 라이브러리)클래스를 보다 폭넓게 사용하는것이 좋겠다라는 생각이 듭니다.
STL에서 제공해주는 스트링 클래스나 여러 컨테이너를 사용한다면 직접 문자열을 다룬다거나
new delete를 사용하는 빈도가 줄어들 것입니다....

 

java가 부러운점이 있다면
필요로하는 거의모든 라이브러리를 표준차원에서 제공해준다는것이다.
C++ 같은경우 간단한 문법(사실 문법자체도 어렵거니와)과 STL을 뺀다면
표준이랄께 없기 때문입니다.


만약 이전에 짜놓았던 코드를 고치기 힘들면 복잡하게 생각할꺼 없고
stdafx.h 파일의 최 상단에
#define _CRT_SECURE_NO_DEPRECATE
한줄 넣어버리면 그만입니다...

 

s 가 붙은것으로 바꾸기 위한 과도기적 단계인듯 합니다.
 

====================== 두번째 참조 =======================
char* s1 = "Hello, world";
 
char s2[4];
strcpy(s2, s1);
 
위문장은 아무 문제없이 컴파일되죠.
기존 함수들은 버퍼오버플로(buffer overflow)이나 버퍼언더플로(buffer under flow) 문제가 발생할 소지가 다분하죠.
물론 strncpy라고 있지만.. 대부분의 프로그래머는 strcpy를 씁니다.
strncpy쓰는 프로그래머는 거의 못본거 같네요. 따지고 보면 이게 더 맞는 함수인데..
 
_s 함수를 추가함으로써 프로그래머가 실수하는 것을 미연에 막겠다는 뜻입니다.
 
warning이니까 당분간은 그냥두셔도 상관없겠지만..
곧 error로 바뀔거라고 생각합니다.

 

warning C4996: 'itoa': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _itoa. See online help for details.
해결법1 : 해당 cpp에 선언
#pragma warning(disable : 4996)
해결법2 : define _CRT_SECURE_NO_DEPRECATE

VS2008 에서 버퍼 오버런 방지를 위한 함수들이 추가가 되었습니다. 이전 버전 까지는 버퍼 오버런에 대해 매우 취약했습니다.

데이터 영역의 버퍼 오버런을 방지하긴 하드웨어 기술을 인텔에서는 Data Execution Prevention 로, AMD 에서는 No eXecution
 
이라는 이름으로 개발되고 있습니다. 아직 이러한 하드웨어 기술이 범용적이지 않으므로, 어느정도 소프트웨어 적으로
 
해결해 주어야 합니다. (말이 어려운데, 모든 메모리 복사관련 함수에 size_t를 넣었다고 생각하시면 됩니다.)
 
 
그냥 무시 하시지 마시고, 조금 불편하더라도 보안 CRT 함수를 사용하시는 것이 좋습니다. (매우 권장됩니다.)
참고로 아래 함수들이 추가가 되었습니다.

printf_s, _printf_p, _cprintf_s, _cprintf_p, _vcprintf_s, _vcprintf_p, fprintf_s, _fprintf_p, sprintf_s

_sprintf_p ,_snprintf_s, vprintf_s, _vprintf_p, vfprintf_s, _vfprintf_p, vsprintf_s, _vsprintf_p, _vsnprintf_s, scanf_s, _cscanf_s, fscanf_s, sscanf_s, _snscanf_s

 

_strtod_l, _strtol_l, _strtoul_l, _atof_l, _atol_l, _atoi_l, _atoi64_l

 

 _itoa_s, _ltoa_s, _ultoa_s


_strtoi64_l, _strtoui64_l, _i64toa_s, _ui64toa_s, strcat_s, strcpy_s, strlen_s, _strxfrm_l, strerror_s
_strerror_s

 

asctime_s, ctime_s, _ctime32_s, _ctime64_s, _strdate_s, _strtime_s

 

getenv_s, _makepath_s, _putenv_s, _searchenv_s, _splitpath_s


'오래된 흔적 > Visual Studio.NET' 카테고리의 다른 글

Installer 이야기  (0) 2009.11.17
Side by Side Assemblies  (0) 2009.10.12
VC++ Debug Option  (0) 2009.09.22
Deployment (C++) - 배포관련  (0) 2009.09.10
도대체 MANIFEST 파일이 뭔가..????  (0) 2009.09.10