Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

great minds think alike

[C] Visual Studio에서 '#define _CRT_SECURE_NO_WARINGS' 를 사용하는 이유 본문

2023/C 언어

[C] Visual Studio에서 '#define _CRT_SECURE_NO_WARINGS' 를 사용하는 이유

gapsoo 2023. 7. 10. 16:53

 

 

 

 


[1] Visual Studio에서

'#define _CRT_SECURE_NO_WARINGS' 를 사용하는 이유

 

C 언어에서 #define _CRT_SECURE_NO_WARNINGS는 컴파일러에게 특정 경고를 무시하도록 지시하는 프리프로세서 지시문이다. 이 지시문을 사용하면 컴파일러에서 발생하는 "보안 경고(C4996)" 메시지를 무시할 수 있다.

_CRT_SECURE_NO_WARNINGS를 정의함으로써 컴파일러에서 발생하는 경고를 무시하는 대신, 몇 가지 함수를 사용하여 버퍼 오버플로우와 같은 보안 취약점에 노출될 수 있다. 이 지시문은 특히 오래된 C 라이브러리 함수인 scanf, gets, strcpy 등을 사용할 때 유용하다. 이러한 함수들은 버퍼 크기를 확인하지 않고 데이터를 처리하기 때문에, 잘못된 입력이나 데이터 크기를 초과하는 경우에 버퍼 오버플로우와 같은 보안 문제가 발생할 수 있다.

경고를 무시하기 위해 _CRT_SECURE_NO_WARNINGS를 사용할 때, 컴파일러는 해당 경고 메시지를 출력하지 않고 컴파일을 진행한다. 이로써 코드의 컴파일 과정에서 발생하는 경고 메시지가 줄어들고, 더 이상 해당 경고를 신경쓰지 않아도 되는 장점이 있다.

 


그러나 이 지시문을 사용할 때 주의해야 한다. 경고를 무시함으로써 보안 취약점이 생길 수 있으므로, 코드의 안전성을 고려해야 한다. 가능하다면 보안 취약점을 피하기 위해 (2)안전한 대안 함수를 사용하는 것이 좋다.

또한, _CRT_SECURE_NO_WARNINGS를 사용하는 경우에도 프로그램의 사용자로부터의 입력을 검증하고, 버퍼 오버플로우와 같은 보안 문제를 방지하기 위해 적절한 조치를 취해야 한다.

 

요약하자면, _CRT_SECURE_NO_WARNINGS를 사용하면 컴파일러에서 발생하는 보안 경고를 무시할 수 있으며, 주로 일부 오래된 C 라이브러리 함수들을 사용할 때 유용하다. 그러나 보안 취약점에 노출될 수 있으므로 신중하게 사용해야 한다.

 

 

 


[2] 추가 학습

 

✏️ (1) 보안 경고(C4996)

"보안 경고(C4996)"는 Microsoft Visual Studio 컴파일러에서 발생하는 경고 메시지 중 하나이다. 이 경고는 보안 취약성을 가진 함수의 사용을 알리는 역할을 한다.

C4996 경고는 오래된 C 표준 함수들이나 비표준 함수들을 사용할 때 발생한다. 이러한 함수들은 보안 취약점을 가지고 있거나, 더 안전한 대안 함수가 있는 경우이다. 예를 들어, scanf, gets, strcpy와 같은 함수들은 입력의 크기를 확인하지 않고 처리하기 때문에, 잘못된 입력이나 데이터 크기를 초과하는 경우에 버퍼 오버플로우 등의 보안 문제가 발생할 수 있다.

Microsoft는 이러한 보안 취약성을 인식하고 개선하기 위해 C4996 경고를 도입했다. 이 경고를 통해 개발자에게 해당 함수들의 사용은 위험하다는 경고 메시지를 보여준다. 개발자는 이러한 경고를 확인하고, 보안 취약성을 가진 함수들을 대체할 수 있는 안전한 대안 함수들을 사용하거나, 적절한 입력 검증과 데이터 처리 방식을 구현해야 한다.

따라서 #define _CRT_SECURE_NO_WARNINGS를 사용하여 _CRT_SECURE_NO_WARNINGS를 정의하면, 이 경고 메시지를 무시하고 해당 함수들을 계속 사용할 수 있게 된다. 하지만 경고를 무시하면서도 보안 취약점을 방지하기 위해서는 코드 내에서 추가적인 보안 검증 및 조치를 수행해야 한다.

요약하자면, "보안 경고(C4996)"는 Microsoft Visual Studio 컴파일러에서 오래된 C 표준 함수나 비표준 함수의 사용으로 인한 보안 취약성을 알리기 위한 경고 메시지이다. 이 경고를 통해 개발자는 해당 함수들의 사용을 검토하고, 안전한 대안 함수나 보안 검증을 적용해야 한다. _CRT_SECURE_NO_WARNINGS를 사용하면 이러한 경고를 무시할 수 있으나, 보안에 대한 추가적인 주의가 필요하다.

 

 

https://learn.microsoft.com/ko-kr/cpp/error-messages/compiler-warnings/compiler-warning-level-3-c4996?view=msvc-170 

 

컴파일러 경고(수준 3) C4996

컴파일러 경고 C4996이 발생하는 이유를 설명하고 이에 대해 수행할 작업을 설명합니다.

learn.microsoft.com

 

 

✏️ (2) 안전한 대안 함수

C 언어에서 안전한 대안 함수를 사용하는 것은 보안 취약성을 완화하고 코드의 안전성을 향상시키는 데 도움이 된다. 아래에 몇 가지 일반적인 C 라이브러리 함수와 그에 대한 안전한 대안 함수들을 제시하겠다.

  1. scanf 대안 함수: scanf 함수는 버퍼 오버플로우와 같은 보안 취약점을 가지고 있다. 대신에 scanf_s 함수를 사용할 수 있다. scanf_s 함수는 버퍼의 크기를 명시적으로 지정하여 안전하게 입력을 처리한다.
  2. gets 대안 함수: gets 함수는 버퍼 오버플로우와 관련된 심각한 보안 취약점을 가지고 있으므로 사용을 피해야 한다. 대신에 fgets 함수를 사용할 수 있다. fgets 함수는 입력 문자열의 크기를 제한하여 버퍼 오버플로우를 방지한다.
  3. strcpy, strcat 대안 함수: strcpy와 strcat 함수는 대상 버퍼의 크기를 확인하지 않고 문자열을 복사하거나 연결하기 때문에 보안 취약점을 가지고 있다. 대신에 strcpy_s, strcat_s 함수를 사용할 수 있다. 이러한 함수들은 대상 버퍼의 크기를 명시적으로 지정하여 안전한 문자열 처리를 수행한다.
  4. sprintf, vsprintf 대안 함수: sprintf와 vsprintf 함수는 형식화된 문자열을 생성할 때 버퍼의 크기를 확인하지 않기 때문에 보안 취약점을 가지고 있다. 대신에 sprintf_s, vsprintf_s 함수를 사용할 수 있다. 이러한 함수들은 대상 버퍼의 크기를 명시적으로 지정하여 버퍼 오버플로우를 방지한다.

이 외에도 각 라이브러리 함수에 대해 특정한 안전한 대안 함수가 제공될 수 있으며, 플랫폼에 따라 다를 수도 있다. 따라서 해당 플랫폼 또는 컴파일러의 문서를 참조하여 안전한 대안 함수에 대한 정보를 확인하는 것이 좋다. 또한, C 언어에서는 메모리 관리와 문자열 처리에 관련된 다양한 라이브러리들이 존재하므로, 특정한 요구사항에 맞게 적절한 라이브러리를 선택하여 사용하는 것도 좋은 방법이다.

 

 

https://learn.microsoft.com/ko-kr/cpp/c-runtime-library/security-features-in-the-crt?view=msvc-170 

 

CRT의 보안 기능

Microsoft C 런타임의 보안 CRT 함수 개요입니다.

learn.microsoft.com

 

 

 


[3] 느낀 점

 

✔️ 글을 쓴 이유: 여름방학동안 학교 친구들과 자발적으로 진행하는 'C언어 study' 에서는 C언어를 처음부터 끝까지 복습하기로 했다. 시험에 나오는 내용(주로 문법적인 내용들)만 공부하기 바빴던 학기 중일 때와는 달리 더 여유롭게 C언어를 공부할 수 있어서, '#define _CRT_SECURE_NO_WARNINGS' 를 사용하는 이유에 대해 자세히 찾아보았다.

 

✔️ Microsoft 공식 홈페이지에서 자세한 설명도 찾아보았다.

 

✔️ 보안의 취약점에는 정말 다양한 종류가 있다는 것을 알게 되었다. 다음에는 버퍼 오버플로우에 대해서도 글을 쓸 예정이다.

 

✔️ scanf_s 과 같이 뒤에 붙는 _s 가 ("secure") 접미사라는 것을 알게 되었다.

 

✔️ 이해를 하고 사용하니까 더 흥미가 느껴지고 잘 안 잊을 것 같다!

'2023 > C 언어' 카테고리의 다른 글

[C] Study mini project_1주차: 조건문  (0) 2023.07.10
[C] C Study mini project_1주차: 수식과 연산자  (0) 2023.07.10
[C] scanf 사용법  (0) 2023.07.08
[C] <stdlib.h> 란?  (0) 2023.07.08
[C] <stdbool.h> 란?  (0) 2023.07.08