C 연구 노트

[C/VS] SDL 검사, C4996에러 해결 방법

잭희 2023. 8. 13. 22:00

C4996 에러


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

 

VS에서 scanf()함수를 썼을 때 발생하는 C4996에러 (코드 실행도 불가능)

 

물론 오류엔 여러가지가 있지만, 앞에 말한 오류는 "C4996"이라는 이름의 에러이다.
이 에러(=오류)가 발생하면, 아래에 설명할 SDL검사라는 녀석이 우리가 만든 코드가 빌드되지 않게 막는다.

그래서 대부분의 사람들은 SDL검사를 꺼두거나 오류가 뜨지 않게 설정(오류->경고)하는 편이다.

오류가 뜨면 빌드가 불가능한데, 경고는 빌드가 가능하기 때문이다.



C4996 에러에 대해서는 다음 포스팅에서 알아보고, 오늘은 SDL검사와 그 해결법에 대해서 간단히 알아보자.

(포스팅 순서: "SDL검사" -> C4996에러 -> 버퍼오버플로 -> 안전함수)

 

SDL 검사


SDL 검사가 뭐하는 건지 선배에게 묻는 모습.

 

SDL검사가 뭘까? 꺼야하는 기능이면 왜 있는걸까?



나도 1학년 때 프로그래밍 수업과 동아리에서 프로그래밍을 할 때, 교수님과 선배들이
SDL검사를 끄거나 코드 윗줄에 #define _CRT_SECURE_NO_WARNINGS를 입력하라고 했었다.



물론 교수님이 왜 끄는지(=버퍼오버플로 / 다음 포스팅에서 설명할 것이다.) 간략히 설명해주시겠지만,

SDL검사라는 것에 대해선 자세히 알지 못 했다.
대충 이거 켜두면 오류나서 코드 실행안된다 이 정도? 그럼 대체 왜 있는겨

게다가 수업 내내 기존함수만 써서 이후로도
안전 함수(=기존함수의 문제를 보완한 함수/얘도 나중에 설명)는 잘 안 쓰기도 했고 말이다.

SDL검사라는 것에 대해 당시엔 크게 신경쓰지 않았다.
처음에 의문을 갖다가도 결국엔 그냥 별 생각없이 끄기만 했다.



시중에 판매되는 대부분의 C언어 학습 책들을 살펴보더라도 SDL검사에 대해서는 크게 언급이 없다.
보안에 문제가 있다는 걸 알려주긴 하지만 그 설명이 워낙 짧을 뿐더러, 안전함수에 대한 설명도 적거나 없다.

 

<출처: https://youtu.be/DR-Tzb-OeSg>

 

이러한 이유로 대부분의 사람들은 SDL검사나 안전함수에 대해 자세히 알지 못한 채,
그냥 SDL검사를 자연스럽게 끄고 시작한다.

아니면 코드 윗줄에 #define _CRT_SECURE_NO_WARNINGS 를 입력해버리거나 말이다.

그래서 이번 기회에 이 녀석이 뭐하는 놈인고..를 간단히 설명해보려 한다.



SDL검사란?


화내면서 사실은 내 코드 걱정해주는 츤데레같은 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를 눌러 코드를 실행시켜보면 잘 실행된다.

 

 

++다른 해결방법들


많은 VS 유저들이 다양한 방법으로 오류를 해결하고 있다.

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에러 -> 버퍼오버플로 -> 안전함수)



궁금한 점 있으면 댓글로~~