프로그래밍/C++, C언어 오류 해결

scanf 사용시 오류 (scan_f)

FORHAPPy 2021. 9. 5. 14:16

<해결1. 기존 scanf 사용하고자 할 경우>

#define _CRT_SECURE_NO_WARNINGS (소스코드 첫 부분)
#pragma warning(disable:4996) (소스코드 첫 부분)
 _CRT_SECURE_NO_WARNINGS  (프로젝트 속성\c/c++\전처리기\전처리기 정의에 추가)
소스파일 만들 시 Security 체크 해제 

 

<해결2. scanf_s로 사용하고자 할 경우>

 

sizeof 연산자를 세번째 인자에 넣는다.

 

char str[50];

scanf_s("%s", str, sizeof(str));

 

 

 

<scan_f 사용하는 이유>

 

scanf 가 버퍼 오버플로우에 취약한 문제때문에 scanf_s를 대신 사용하도록 한다.

오버플로우란 할당된 버퍼에 들어갈 수 있는 양보다 더 많은 양을 넣게 되면 프로그램이 멈추는데 

이것을 해커들이 이용했기 떄문에 문제를 해결하기 위해 scanf_s가 등장했다.

 

%d, %f와 같은 고정폭 변수만을 입력받아 오는 경우에는 문제가 되지 않지만,

%c, %s와 같이 문자를 입력 받을 경우 버퍼 오버플로우가 발생할 수 있다.

 

따라서 세번째 인자를 사용하는 이유도 버퍼 메모리의 크기를 2번째 인자로 미리 설정하여서

버퍼 오버플로우를 방지하기 위함이다. 

 

3번째 인자는 공간의 크기를 말하는데

scanf_s는 scanf와는 다르게 사이즈를 넘어서게 되면 저장을 하지 않기 때문에

오버플로우 현상이 일어나지 않는다.

 

 

 

간단하게 개념을 정리해 보면

 

<버퍼오버플로우란?>

프로세스가 데이터를 버퍼에 저장할 때 프로그래머가 지정한 곳 바깥에 저장하는 것을 의미

>데이터 오염을 뜻한다.

 

<버퍼란?>

데이터를 한 곳에서 다른 한 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 메모리 영역