안녕하세요 오늘은 언제부턴가 나타나게 된 이 녀석에 대해 알아보고자 합니다.
이 프로그램을 한번 보죠
#include <stdio.h>
int main(void) {
int a;
scanf("%d", &a);
printf("%d\n", a);
return 0;
}
너무나 평범한 프로그램입니다.
하지만 이 프로그램을 visual studio에서 실행하고자 하면, 다음과 같은 에러가 발생합니다.
이건 왜 발생할까요? 어떻게 해결할까요?
지금부터 시작합니다.
1. 왜 나왔는가?
이 에러는 visual studio에서 주로 발생하는 에러입니다.
visual studio 2005부터, scanf, fopen, strcpy같은 함수를 사용하면 보안에 문제가 있다는 이유로 에러가 떴었죠,
그래도 visual studio 2019 전 까지는 프로그램 생성하기 전에 SDL check항목을 해제해서 이 부분을 막아줄 수 있었는데,
2019부터는 프로그램 생성할때 이 항목을 해제할 수 없게 만들어버리면서, 다시 이 에러가 뜨게 되었죠.
이 2019 버전의 보안 문제를 해결할 수 있는 방법이 #define _CRT...인 겁니다.
2. #define 말고 다른 방법은 없는가?
I 1번에서 설명했듯이, visual studio 2019이전에는 프로그램을 만들때 SDL check항목을 체크해제해서 해결할 수 있었습니다. 이것이 가장 보편적인 해결책이었습니다.
II IDE를 바꾸시면 됩니다. 보통 C언어를 입문하시면 visual studio를 많이 쓰실텐데, code block(얘는 바뀌었을 수도 있음), dev c++, vs code같은 다른 IDE를 통해 개발하시면 이런 에러가 뜨지 않습니다.
+ 추가합니다. 점차 갈수록 막히는 IDE가 많아질 수 있어서... 이 방법은 권장하지 않습니다.
III #define _CRT_SECURE_NO_WARNINGS를 프로그램 가장 위에 입력하시면 됩니다. 소제목에서는 다른 방법을 구한다 했지만, 그래도 에러를 제거하는 방법중 하나로 소개해보았습니다.
IV #pragma warning(disable:4996)를 프로그램 가장 위에 입력하시면 됩니다. 이게 가장 직관적입니다. 프로그램(컴파일러)에게 4996번 에러를 무시해라"라는 메세지는 보내는 코드란걸 영어만 할줄 아시면 깨달을 수 있습니다. 위에서 보신 에러메세지 사진의 가장 왼쪽에 있는 C4996이 에러코드입니다.
V visual studio의 프로그램 창에서
프로그램 창 상단 Project(프로젝트) - [program name] Property([프로그램 이름] 설정) 를 클릭
클릭했을때 뜨는 창에서 왼쪽에 C/C++ 또는 C/C++ - General(일반)클릭클릭한 후, 오른쪽 창에서 SDL checks (SDL체크) 의 Yes(sdl+)를 No(sdl-)로 변경을 하시면 됩니다. 앞써 이 에러가 뜨는 원인이 보안상의 이유라 했죠? 이 해결책은 보안검사를 하지 않도록 만듭니다.꽤 복잡한 감이 없지않아 있지만, 코드에 아무것도 적지 않아도 된다는 장점이 있습니다.
VI scanf, fopen같은 에러 유발 함수를 scanf_s, fopen_s같은 visual studio에서 따로 지원하는 함수도 바꾸어주시면 됩니다. 에러메세지를 읽어보셨다면 아시겠지만, 이방법은 visual studio에서 권장하는 방법입니다. (그러나 여러분 주변의 대부분의 개발자는 이 방법을 추천하지 않을겁니다.) 함수를 보안상에 문제가 없는 함수로 바꾸어주는 방법으로, 말만 들으면 가장 안전할 것 같지만, 이 scanf_s류의 함수는 다른 IDE 또는 gcc에서는 지원을 전혀 하지 않으며, 사용법도 기존의 것과 조금씩 다릅니다. 즉, 프로그램에 있어 호환성을 내다버리는 큰 문제가 있는 방법이죠. 여러분이 팀 프로젝트를 하면서 scanf를 쓸 일은 적겠지만, scanf 대신 scanf_s를 적으시면 많은 동료 개발자가 심히 큰 불편을 느낄겁니다.
3. 기타
이걸 검색해보고 "보안상의 문제"에만 꽃혀서 겁먹는 친구가 (내 주변에) 있습니다. 말이 보안상의 문제지 scanf를 쓴다고 해도 이런걸 검색해보는 수준에서는 전혀 보안상에 문제가 되지 않으며,
이 문제가 정말로 심각한 문제라면 지금쯤 거의 모든 프로그래밍 언어가 심각한 문제를 겪고있을 겁니다.
이 문제는 전혀 심각하지 않은 문제이며, 오히려 개인적으로는 visual studio가 이 문제에 과잉대응하고 있다 생각합니다. 그 증거로, 이 보안검사를 하지 않는 다른 IDE도 전혀 문제없이 잘 돌아가고 있습니다.
( + 물론 오버플로우 공격이 중요하지 않다는 것은 아닙니다만... 방금 hello world 띄운 입문자들이 주로 쓰는 프로그램에서 굳이 이걸 필수사항으로 넣어야 했을까? 라는 의문이 있습니다. (아님 제가 아직 보안쪽을 많이 안파서 중요성을 모르는 것일 수도 있고...) )
아래는 SDL에 관련된 문서입니다. 관심이 있다면 한 번 읽어보는 것을 추천드립니다
https://docs.microsoft.com/ko-kr/cpp/c-runtime-library/security-features-in-the-crt?view=msvc-160
CRT의 보안 기능
Microsoft C 런타임의 보안 CRT 함수에 대 한 개요입니다.
docs.microsoft.com
이상 읽어주셔서 감사합니다.
'C C++ language' 카테고리의 다른 글
C언어 소수 판단 하는 방법 [with source] (0) | 2021.04.03 |
---|---|
C언어 계단모양으로 별 출력하는 방법 [with source] (0) | 2021.03.27 |
C언어 입력받은 글자또는 문자 출력 방법 (0) | 2021.03.13 |
C언어 " 큰따음표와 ' 작은 따음표의 차이점 (0) | 2021.03.06 |
C언어 십진법 이진법 변환기 [with source] (0) | 2021.02.27 |