저번 포스팅에서는 SDL검사가 어떤 기능인지에 대해 알아보았었는데
이번엔 SDL검사가 왜 그렇게 귀찮게 해야만 했는지를 C4996 에러를 통해 알아보자.
이전 포스팅 링크: https://zzaekkii.tistory.com/4
[C, VS] SDL 검사 / C4996에러 해결 방법
C4996 에러 이전 포스팅에서 Visual Studio를 사용하며 C언어를 공부할 때, 어떤 오류때문에 코드를 실행할 수 없는 경우가 있다고 했는데 왜 오류가 생기는지와 해결법을 알아보자. 물론 오류엔 여러
zzaekkii.tistory.com
(포스팅 순서: SDL검사 -> "C4996에러" -> 버퍼오버플로 -> 안전함수)
C4996에러란?

비쥬얼 스튜디오에서 scanf, sprintf, strcpy, gets, fscanf, sscanf 등의 함수들을 쓰면
C4996에러가 발생하며 코드가 더이상 컴파일되지 않는다.
그리고는 _s 함수(안전함수)로 바꿔 쓸 것을 권고강요한다.
그래서 C언어를 공부하는 입장에서는 이러한 C4996에러가 공부의 방해요소처럼 느껴진다.
기존함수도 한번 써보고 싶은데 scanf, gets, fopen, sprintf 등
뭔 함수를 쓸 때마다 에러가 뜨니 상당히 불편하다.
C4996에러는 안전하지 않은 함수, CLR 마샬링 라이브러리,
확인된 반복기를 쓸 때 발생한다고 한다.
뒤에 뭔소린지 몰라도 ㄱㅊ 어차피 우리는 안전때문에 그런거임
이 중에서 우리가 주로 겪는 경우는 안전하지 않은 라이브러리 함수를 썼을 때이다.
여기서 안전하지 않다는 의미는 보안에 문제가 있다는 뜻.

위에서 얘기하는 보안 문제란 버퍼오버플로우라는 치명적인 버그 현상을 말하는데
버퍼오버플로를 간단히 요약설명하면 프로그램에서 입력받은 값이
버퍼를 가득 채우다 못해 넘쳐서 버퍼 이후의 공간을 침범하는 현상을 뜻한다.
버퍼오버플로우는 실제 해킹기법으로도 사용되므로 절대 발생하면 안된다.
그래서 비쥬얼 스튜디오는 scanf같은 보안결함함수말고 안전함수를 쓰라는 것이다.
버퍼오버플로에 관한 더 자세한 내용은 다음 포스팅에서 설명할 예정
(많관부)

Microsoft 홈페이지에서 C4996 관련 자료를 찾아보면
버퍼오버플로가 발생하는 기존함수를 deprecated로 취급하고 있다.

여기서 deprecated는 중요도가 떨어져 더 이상 사용되지 않고,
앞으로는 사라지게 될 (컴퓨터 시스템 기능 등)이라는 뜻이다.
나도 사실 처음 들어봤는데 거의 뭐 mamihlapinatapai 급 단어이다.
언젠간 VS에서뿐만 아니라 다른 애들도 안전한 함수 지향으로 바뀌지 않을까~
maybe..?
그렇다고 해도 현재는 Visual Studio말고는 scanf_s 같은 안전함수를 못 알아먹는다;
게다가 Microsoft는 철저히 Windows OS 중심이라 리눅스나 맥에선 안전함수를 쓸 수 없다.

그래서 나중에 안전함수 포스팅에서도 이야기 하겠지만,
나 하나만 안전함수 써봐야 아무 소용이 없구만~하고 느끼게 된다.
나중에 다른 개발자랑 협업하거나 팀 프로젝트를 하면 호환이나 이식이 안되니깐..
지금으로서는 이전 포스팅의 C4996에러 대처법으로 기존함수를 쓰는 게 더 합리적이다.
아직도 안 읽어봤다면 당장 클릭 ㄱㄱ
C4996에 대한 더 자세한 사항이 궁금하다면 Microsoft사에서 설명해놓은 글을 참고.
Compiler Warning (level 3) C4996
Explains why Compiler warning C4996 happens, and describes what to do about it.
learn.microsoft.com
마무리
자 오늘은 이렇게 C4996에러가 무엇인지 알아보았고,
버퍼오버플로란 문제가 발생한다는 것도 알았다.
그럼 다음 포스팅에서는 버퍼오버플로에 관해 자세히 알아보자.
(다음 포스팅 주제: SDL검사 -> C4996에러 -> 버퍼오버플로 -> 안전함수)
더 궁금한 게 있으면 댓글 남겨주세요~
'C 연구 노트' 카테고리의 다른 글
[C/VS] SDL 검사, C4996에러 해결 방법 (0) | 2023.08.13 |
---|---|
[C] Visual Studio 2022 설치 (0) | 2023.08.13 |