반응형

원인


"error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."
"error 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."

scanf와 같은 함수 사용 시 C4996 오류가 발생하는 원인과 이유 그리고 해결 방법에 대해서 알아보자.

 

최신 Visual Studio에서 C4996 오류가 발생하는 이유는 scanf, strcpy, fopen 과 같은 함수들을 사용했기 때문인데,

이 함수들은 버퍼 오퍼플로우(BOF) 등의 보안 취약점을 가지고 있으므로 사용을 자제하라는 의미이다.

 

이러한 위험성을 가진 함수들은 C++14 이상에서는 deprecated 되어 있다.

728x90

해결 방법


1. 안전한 함수로 대체 하기 scanf_s, strcpy_s, fopen_s (★Best)

가장 권장되는 방법은 보안 취약점이 해결되는 안전한 함수로 대체하여 사용하는 것이다.

scanf_s, strcpy_s, fopen_s 등의 secure 함수로 대체하여 사용하면 오류가 해결되며, 동시에 취약점도 해결할 수 있다.

scanf_s("%d", &n);

 

2. 매크로 추가 #define _CRT_SECURE_NO_WARNINGS

scanf_s, strcpy_s 등의 함수는 안전하지만 그만큼 쓰기가 번거로운 경우가 있다.

취약점에 민감할 필요가 없는 코드를 작성하는 경우 코드 최상단에 _CRT_SECURE_NO_WARNINGS 를 정의해주면

해당 소스 파일(c, cpp)에서 이전과 같이 안전하지 않은(unsafe) scanf, strcpy, fopen 등의 함수를 사용할 수 있다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

(※주의. '#define _CRT_SECURE_NO_WARNINGS'는 반드시 최상단('#include <studio.h>' 보다 위)에 정의해야 한다.

 

3. 프로젝트 속성에서 SDL 검사 옵션 해제하기

SDL(Security Development Lifecycle) 옵션을 해제해주면 모든 소스 파일에서 안전하지 않은 함수를 사용할 수 있다.

  • [프로젝트 속성] -> [C/C++] -> [SDL 검사]: 아니요(/sdl-) 선택

* SDL(Security Development Lifecycle)이란? 보안 개발 수명주기의 줄임말로서, 개발 프로세스의 모든 단계에서 보안 및 개인 정보 고려 사항을 도입하여 개발자가 매우 안전한 소프트웨어를 구축하고 보안 규정 준수 요구 사항을 해결하며 개발 비용을 줄일 수 있도록 마련된 지침이다.

(출처: Microsoft SDL)


최신 Visual Studio에서 C4996 오류가 발생하는 원인과 이유, 그리고 해결 방법 3가지에 대해서 살펴보았다.

 

가능하면 SDL을 사용해서 취약점이 발생하지 않는 안전한 코드를 작성하는 것을 권장한다.

하지만 학교 과제나 개인 토이 프로젝트를 진행하는 경우라면 해당 옵션을 끄고 사용하면,

조금이나마 더 빠른 개발이 가능할지도 모르겠다.

반응형

+ Recent posts