우리가 c언어로 scanf를 사용하려고 할 때, 비주얼 스튜디오 코드를 사용하면 에러코드 C4996과 함께 오류가 발생하며 빌드가 되지 않는 것을 볼 수 있다.
이때 발생하는 오류가 뭐냐하면 scanf가 안전하지 않으므로 scanf_s를 쓰거나, _CRT_SECURE_NO_WARNINGS를 이용하라는 것이다.
그럼 scanf가 안전하지 않은 이유는 무엇일까? 이는 scanf가 받을 수 있는 입력 데이터의 크기가 있는데 사용자가 고의로 또는 실수로 해당 데이터 크기를 초과하는 값을 입력할 경우, 초과된 데이터가 다른 메모리를 침범해서 프로그램에 오류가 발생할 수 있기 때문에 이를 막기위해 scanf_s로 일정 크기까지만 입력받는 함수를 사용하라고 권장하는 것이다.
그럼 해결 방법을 알아보자. 해결 방법에는 여러가지가 있는데, 다음과 같이 여기서는 크게 4가지를 알아볼 것이다.
- scanf_s
- #define _CRT_SECURE_NO_WARNINGS
- #pragma warning(disable:4996)
- SDL(Security Development Lifecycle) 검사 끄기
scanf_s 함수는 비주얼 스튜디오에서만 사용되는 비표준 함수로 C에서 문자열이나 파일에 관련된 버퍼나 스택 등 메모리에 문제가 생길수도 있기 때문에 _s. 즉 메모리 사이즈를 요구함으로써 문제를 해결할 수 있다. 하지만 다른 편집기에서는 컴파일 오류가 나므로 이 방법은 범용적으로 크게 추천하지는 않는다.
CRT는 C Run-Time Libraries의 줄임말이다. 즉, C 기본 라이브러리의 한 부분이다. scanf, gets, strcpy, fopen 과 같은 함수들을 사용할 때, buffer의 capacity가 부족할 때, buffer overflow가 발생하게 된다. 즉, 메모리의 낭비를 불러온다. 즉, 이런 함수들을 사용할 때, vs에서 unsafe 경고가 발생하는 이유는 "좋은 함수를 만들어놨으니 사용하라!"라는 의미이다. 하지만 기존의 함수를 사용해도 이상이 없는 상황에 경고로 인해 컴파일이 되지않는 경우가 생길 수 있다. 이때, 전처리기에 _CRT_SECURE_NO_WARINGS를 추가하거나 #pragma waring(disable:4996)을 사용해서 경고문이 발생하지 않게 할 수 있다.
마지막 SDL 검사 끄기 방법은 scanf 오류가 나는 이유가 보안 문제 때문인데 보안 검사를 꺼버리면 scanf 오류가 사라진다는 개념으로 그냥 보안 검사를 꺼버리는 설정 방법이다.
'Language > C' 카테고리의 다른 글
선언(declaration)과 정의(definition) (0) | 2023.11.05 |
---|---|
구조체 (0) | 2023.11.05 |
typedef, enum, union (0) | 2023.11.05 |
컴파일과 디버깅 (0) | 2023.11.02 |
포인터 (0) | 2023.10.27 |