C4996 에러
이전 포스팅에서 Visual Studio를 사용하며 C언어를 공부할 때,
어떤 오류때문에 코드를 실행할 수 없는 경우가 있다고 했는데 왜 오류가 생기는지와 해결법을 알아보자.

물론 오류엔 여러가지가 있지만, 앞에 말한 오류는 "C4996"이라는 이름의 에러이다.
이 에러(=오류)가 발생하면, 아래에 설명할 SDL검사라는 녀석이 우리가 만든 코드가 빌드되지 않게 막는다.
그래서 대부분의 사람들은 SDL검사를 꺼두거나 오류가 뜨지 않게 설정(오류->경고)하는 편이다.
오류가 뜨면 빌드가 불가능한데, 경고는 빌드가 가능하기 때문이다.
C4996 에러에 대해서는 다음 포스팅에서 알아보고, 오늘은 SDL검사와 그 해결법에 대해서 간단히 알아보자.
(포스팅 순서: "SDL검사" -> C4996에러 -> 버퍼오버플로 -> 안전함수)
SDL 검사

SDL검사가 뭘까? 꺼야하는 기능이면 왜 있는걸까?
나도 1학년 때 프로그래밍 수업과 동아리에서 프로그래밍을 할 때, 교수님과 선배들이
SDL검사를 끄거나 코드 윗줄에 #define _CRT_SECURE_NO_WARNINGS를 입력하라고 했었다.
물론 교수님이 왜 끄는지(=버퍼오버플로 / 다음 포스팅에서 설명할 것이다.) 간략히 설명해주시겠지만,
SDL검사라는 것에 대해선 자세히 알지 못 했다.
대충 이거 켜두면 오류나서 코드 실행안된다 이 정도? 그럼 대체 왜 있는겨
게다가 수업 내내 기존함수만 써서 이후로도
안전 함수(=기존함수의 문제를 보완한 함수/얘도 나중에 설명)는 잘 안 쓰기도 했고 말이다.
SDL검사라는 것에 대해 당시엔 크게 신경쓰지 않았다.
처음에 의문을 갖다가도 결국엔 그냥 별 생각없이 끄기만 했다.
시중에 판매되는 대부분의 C언어 학습 책들을 살펴보더라도 SDL검사에 대해서는 크게 언급이 없다.
보안에 문제가 있다는 걸 알려주긴 하지만 그 설명이 워낙 짧을 뿐더러, 안전함수에 대한 설명도 적거나 없다.

이러한 이유로 대부분의 사람들은 SDL검사나 안전함수에 대해 자세히 알지 못한 채,
그냥 SDL검사를 자연스럽게 끄고 시작한다.
아니면 코드 윗줄에 #define _CRT_SECURE_NO_WARNINGS 를 입력해버리거나 말이다.
그래서 이번 기회에 이 녀석이 뭐하는 놈인고..를 간단히 설명해보려 한다.
SDL검사란?

우선 SDL 검사라는 용어를 풀어쓰면 Security Development Lifecycle로
직역하면 "보안 개발 수명 주기"라고 할 수 있다.
일단 이것만 듣고는 뭔가 느낌은 오는데, 아직까지 100% 이해가 되진 않는다.
설명하자면, SDL검사는 사용자가 보안상 결함이 있는 함수를 사용하면,
보안 경고를 오류로 처리하여 컴파일을 막고
보안이 강화된 함수(안전함수/Secure Function)로 바꿔 쓰라고 강요하는 것이다.
(안전함수 예: scanf_s(), gets_s())

여기까지 보면 "엥? 그럼 엄청 중요한 거 아냐, 안전함수 쓰면 되지 왜 꺼?"라고 생각할 수 있다.
나 역시 그렇게 생각했기에 예전엔 복습하면서 한동안 SDL검사를 끄지 않고 안전함수를 써가며 코딩을 했었다.
대다수의 사람들은 이 검사를 그냥 꺼버린다. 코드 맨윗줄에 다른 코드를 추가한다거나.
안전함수를 쓰는 것보다 기존 함수를 쓰는 것이 익숙하고 편해서 그렇다..라고도 할 수는 있지만
사실 이 외에 다른 결정적인 이유가 있다. 그 점에 대해서는 "안전함수 포스팅"에서 알아보고
당장에 C4996에러라는 것 때문에 코드 실행이 안되는 것부터 해결해보자.
오류 해결법은? => SDL검사 해제
1. 솔루션 탐색기의 [소스 파일]폴더에서 소스파일을 우클릭하여 속성 클릭.
//프로젝트 속성 단축키[Alt + F7]를 사용하면 편리하다.

2. 프로젝트 속성 창이 뜨면 왼쪽의 [구성 속성]탭에서 C/C++ -> 일반 선택, SDL검사 드롭박스를 클릭.

3. 아니오(/sdl-) 선택 후, 확인 클릭.
4. F7을 눌러 솔루션 빌드를 해보면 실패가 뜨지 않는 것을 볼 수 있고,
이후 Ctrl + F5를 눌러 코드를 실행시켜보면 잘 실행된다.

++다른 해결방법들

SDL검사 해제 외에도 C4996 에러를 표시하지 않는 방법들이 있다.
1. #pragma warning(disable : 4996)

소스코드의 앞에 #pragma warning(disable : 4996)를 입력해주면 된다.
pragma warning은 특정 경고를 끄고 켜겠다는 의미인데,
뒤에 (disable:4996)이 붙음으로써 4996관련 경고를 끄겠다!가 된다.
2. #define _CRT_SECURE_NO_WARNINGS

이것도 마찬가지로 소스코드 앞에 #define _CRT_SECURE_NO_WARNINGS를 입력해주면 된다.
이 코드의 의미는 알아서 할테니까 조용히 하라는 뜻이다.
이제 컴파일러의 경고를 표시하지 않는다.
CRT는 C Runtime의 축약형인데, C런타임에 대한 자세한 내용을 알고 싶다면 아래 사이트를 참고하자.
링크: https://learn.microsoft.com/ko-kr/cpp/c-runtime-library/c-run-time-library-reference?view=msvc-170
2.5. 만약, 소스 상단에 #define _CRT_SECURE_NO_WARNINGS가 있는 게 너무 거슬리고 불편하다면

프로젝트 속성[Alt+F7] -> C/C++ -> 전처리기 -> 전처리기 정의에
"_CRT_SECURE_NO_WARNINGS;"를 입력해주면 된다.
전처리기 기능을 담당하는 코드가 #define이라서 결론적으로 같은 기능이다.
3. _s가 붙는 안전함수 사용하기 -> 자세한 내용은 [안전함수]포스팅 참고.

자세한 내용은 안전함수 포스팅에서 설명하겠지만,
_s가 붙는 안전함수들은 변수의 크기를 지정해주는 형식이 추가로 붙는다.
4. 만약 특정 소스파일 내에서만 C4996에러를 무시할 게 아니라, 프로젝트 전체에서 C4996에러를 해제할 경우

프로젝트 속성[Alt+F7] -> C/C++ -> 명령줄 -> 추가 옵션에 "/wd 4996"라고 입력하면 된다.
마무리
아무튼 오늘 이렇게 SDL검사가 무엇인지와 C4996에러로 코드가 실행되지 않는 문제를 해결해 보았다.
이 주제로 쓰고 있던 글이 너무 길어져서 주제를 나눠 하나씩 새로 쓰고 있다.
(다음 포스팅 주제: SDL검사 -> C4996에러 -> 버퍼오버플로 -> 안전함수)
궁금한 점 있으면 댓글로~~
'C 연구 노트' 카테고리의 다른 글
[C/VS] C4996 에러 (0) | 2023.08.14 |
---|---|
[C] Visual Studio 2022 설치 (0) | 2023.08.13 |