본문 바로가기
Program/C++ MFC

[C++] Error 'scanf': This function or variable may be unsafe 발생 해결 방법

by 냠만 2024. 5. 23.

[Scanf 사용 에러 발생]

상위 Visualstudio 에서 빌드를 할 경우 표준라이브러리 Scanf나 Gets, atoi 함수를 사용하게 되면 해당 문구가 출력되는 경우가 있습니다.
빌드나 디버그가 되지 않아 컴파일이 불가능합니다.

 

아래와 같이 에러메시지가 발생되며 빌드 자체가 안되게 됩니다.

'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.



메모리의 안정성 때문에 VS에서 자체적으로 막아놓은 것으로 보입니다.
SDL (Security Development Lifecycle) 항목을 제외시키면 문제가 해결됩니다.


[SDL]

해당 기능은 msdn에서 확인해보면 컴파일 시 추후 문제가 될 수 있는 부분을 경고 및 오류로 설정하는 기능입니다.
1. 단항 빼기 연산자 부호가 없는 경우
2. 음의 정수 상수가 부호 없는 형식으로 변환된 경우
3. 블록에서 continue사용 goto break, finally 비정상적 종료 중 정의되지 않는 동작이 있는 경우
4. 변수 초기화 코드가 없는 경우
5. 초기화하지 않은 지역변수 사용
6. 잠재적 초기화되지 않는 포인터 변수 사용
7. 특정 함수 사용 시 버퍼의 오버런 발생

등등이 있습니다. 결론적으로 프로그래머가 인식하지 못하는 잠재적 위협을 VS가 사전에 제거해 주는 역할을 합니다.
컴파일 및 디버그 시 기능을 떨어질 수 있지만 결과적으로 좋은 코드를 생성할 수 있도록 도와줍니다.


[SDL 해제]

방법1
프로젝트 속성 옵션에서 SDL 해제

솔루션 탐색기에서 우클릭으로 속성창에 진입해 줍니다.

속성페이지에 진입하게 되면 C++ 언어를 선택해 주고 하단부에 있는 SDL검사를 아니오로 변경, 적용을 눌러줍니다.

예는 SDL 검사를 진행하겠다는 의미이니 반드시 '아니오'로 변경해 주세요.

 


방법2
'#define _CRT_SECURE_NO_WARNINGS' 사용

에러메시지를 자세히 살펴보면 해당 메시지가 존재합니다.

'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.

해당 메시지를 사용하게 되면 해당 디파인이 영향을 주는 공간에서는 SDL 검사를 진행하지 않겠다는 의미입니다.

기본적으로 제공되는 기능인 SDL검사 기능을 제거하는 방법은 위와 같은데요. 결과적으로는 SDL 검사를 진행하는 걸 추천드립니다. 단순 입출력을 제외하고는 실제 코드에서 발생될 수 있는 잠재적 위협을 찾아주는 역할이기 때문에 어떤 형식으로든 도움이 된다고 생각하기 때문입니다.