개발자의시작

[Visual Studio][C언어] scanf 에러 해결방법 (_s) 본문

개발환경(IDE)

[Visual Studio][C언어] scanf 에러 해결방법 (_s)

LNLP 2020. 5. 13. 16:48

비주얼 스튜디오를 사용할 때 다음과 같은 프로그램을 실행시킵니다. 

 

 

겉보기에 코드에 딱히 문제가 없는 것 같지만 실행을 시켜보면 다음과 같은 오류창이 뜨는 경우가 있습니다.

 

에러 메시지를 읽어보면 다음과 같습니다.

 

오류 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. 

 

비주얼스튜디오2013이후 보안정책이 강화되어 나타나는 문제라고 합니다. scanf와 같은 사용자 입력을 받는 함수 중 버퍼오버플로우 취약점이 있어 이를 방지하기 위해 이러한 조치를 취한 것 같습니다.

 

이를 해결방법으로 몇가지 정리해보았습니다.

 

1. _s 삽입

 

scanf 와 같은 입력을 받는 함수에서 주로 발생하는 문제입니다. 이를 해결하는 가장 간단한 방법으로 함수 뒤에 _s를 삽입해주는 것입니다. 결과를 확인해보면 아래와 같이 잘 작동하는 것을 확인할 수 있습니다.

 

2. _CRT_SECURE_NO_WARNINGS

 

위와 같은 매크로를 정의하여 불안전한 함수를 사용하는 것을 명시적으로 허락하는 것입니다. 매크로를 작성하고 사용한 결과 프로그램이 원하는 대로 작동하는 것을 확인할 수 있습니다.

 

3. 전처리기 정의

 

2번 _CRT_SECURE_NO_WARNINGS 매크로를 명시적으로 정의한것과 비슷하지만 코드를 작성할 때마다 이를 작성하지 않고 미리 전처리기를 정의하는 방법이 있습니다. 방법은 아래와 같습니다.

 

프로젝트를 우클릭하여 속성(R)을 클릭합니다. 

 

속성페이지가 나타납니다. 왼쪽에 1) 구성 속성, 2) C/C++, 3) 전처리기를 클릭하면 다음과 같은 창이 나타납니다. 

 

 

전저리기 정의 우측에 보면 영어로 무언가 쓰여 있습니다. 이를 클릭하고 미리 쓰여 있던 글 맨뒤에 ; 를 추가한 뒤 _CRT_SECURE_NO_WARNINGS를 추가하고 마지막으로 ; 를 꼭 붙여줍니다. 그다음 적용을 눌러주고 프로그램을 다시 실행시켜주면 아래와 같이 문제없이 프로그램이 작동되는 것을 확인할 수 있습니다. 

 

 

 

이상 포스팅 마치며 질문 또는 이상한 점 있으면 댓글로 남겨주세요.

 

감사합니다. 

Comments