<해결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와는 다르게 사이즈를 넘어서게 되면 저장을 하지 않기 때문에
오버플로우 현상이 일어나지 않는다.
간단하게 개념을 정리해 보면
<버퍼오버플로우란?>
프로세스가 데이터를 버퍼에 저장할 때 프로그래머가 지정한 곳 바깥에 저장하는 것을 의미
>데이터 오염을 뜻한다.
<버퍼란?>
데이터를 한 곳에서 다른 한 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 메모리 영역
'프로그래밍 > C++, C언어 오류 해결' 카테고리의 다른 글
비주얼 스튜디오 어셈블리코드 확인방법 (0) | 2021.09.15 |
---|---|
"const char *" 형식의 인수가 "char *" 형식의 매개 변수와 호환되지 않습니다. (0) | 2021.09.03 |