비주얼 스튜디오 2013(VS 2013) 버전 이상부터 scanf 을 사용하면 아래와 같은 에러가 나면서 컴파일이 안됩니다


어디가 틀렸나 찾아봐도 찾을 수 없죠 ㅠㅠ


에러 메시지를 보면 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. 라고 나옵니다


scanf 함수가 취약하니 scanf_s를 사용하거나 _CRT_SECURE_NO_WARNINGS 를 사용하라고 합니다




그럼 이제 scanf를 사용할 수 있도록 _CRT_SECURE_NO_WARNINGS를 사용해 봅시다


솔루션 탐색기에서 자신의 프로젝트 명을 마우스 오른쪽 클릭 -> 속성에 들어갑니다



속성창이 뜨면 구성 속성 -> C/C++ -> 전처리기 -> 전처리기 정의 부분에


아래의 그림처럼 _CRT_SECURE_NO_WARNINGS;를 추가해줍니다.



원래 있던 글 뒤에 ;(구분자) 뒤에 _CRT_SECURE_NO_WARNINGS를 넣어주고 ; 까지 넣어줍니다



그리고 다시 빌드(컴파일) 시켜보면 에러가 없어집니다



또 전처리기에 등록하는 방법말고 아래와 같이 소스코드에 ifdef를 이용하여 define으로 _CRT_SECURE_NO_WARNINGS을 선언해 주면 됩니다



_CRT_SECURE_NO_WARNINGS 대신 #pragma warning(disable: 4996) 을 사용하여도 됩니다

(4996은 아까 에러의 메시지에 써있음)

pragma는 한 번만 실행하게 되기 위해 사용합니다 ifdef와 비슷한 기능을 합니다



또 이런식으로 추가해주는 방법 말고 가장 간단한 방법은


솔루션 프로젝트를 만들때 SDL(Security Development Lifecycle) 검사 부분을 체크해제하는 것입니다



하지만, 가장 좋은 방법은 취약한 함수인 scanf 대신에scanf_s를 사용해보는 것입니다


scanf는 버퍼오버플로우 취약점이 존재하기 때문에 이렇게 반 강제적으로 scanf의 사용을 막은거 같습니다


아래의 링크를 통해 scanf_s의 사용방법을 알아두고 scanf_s를 사용합시다!


MSDN - scanf_s


int num=0;

scanf_s("%d", &num, sizeof(4));

이런식으로 사이즈 지정해주는 scanf_s