안전한 템플릿 오버로드Secure Template Overloads

Microsoft는 여러 CRT(C 런타임) 라이브러리 함수를 보안이 강화된 버전으로 대체했습니다.Microsoft has deprecated many C Runtime library (CRT) functions in favor of security-enhanced versions. 예를 들어 strcpy_sstrcpy보다 더 안전합니다.For example, strcpy_s is the more secure replacement for strcpy. 사용되지 않는 함수는 메모리를 덮어쓸 수 있는 작업을 차단하지 않기 때문에 보안 버그의 일반적인 원인입니다.The deprecated functions are common sources of security bugs, because they do not prevent operations that can overwrite memory. 기본적으로 컴파일러는 이러한 함수 중 하나를 사용할 때 사용 중단 경고를 생성합니다.By default, the compiler produces a deprecation warning when you use one of these functions. CRT는 더 안전한 변형으로 쉽게 전환할 수 있도록 이러한 함수에 대한 C++ 템플릿 오버로드를 제공합니다.The CRT provides C++ template overloads for these functions to help ease the transition to the more secure variants.

예를 들어 이 코드 조각은 strcpy가 더 이상 사용되지 않기 때문에 경고를 생성합니다.For example, this code snippet generates a warning because strcpy is deprecated:

char szBuf[10];  
strcpy(szBuf, "test"); // warning: deprecated  

코드가 안전하지 않을 수 있다는 것을 알리는 사용 중단 경고가 있습니다.The deprecation warning is there to tell you that your code may be unsafe. 코드가 메모리를 덮어쓸 수 없다는 것을 확인한 경우에는 여러 가지 선택 사항이 있습니다.If you have verified that your code can't overwrite memory, you have several choices. 경고를 무시하거나, 경고를 표시하지 않도록 CRT에 대한 include 문 앞에 기호 _CRT_SECURE_NO_WARNINGS를 정의하거나, strcpy_s를 사용하도록 코드를 업데이트할 수 있습니다.You can choose to ignore the warning, you can define the symbol _CRT_SECURE_NO_WARNINGS before the include statements for the CRT headers to suppress the warning, or you can update your code to use strcpy_s:

char szBuf[10];  
strcpy_s(szBuf, 10, "test"); // security-enhanced _s function  

템플릿 오버로드는 추가 옵션을 제공합니다.The template overloads provide additional choices. _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES를 1로 정의하면 더 안전한 변형을 자동으로 호출하는 표준 CRT 함수의 템플릿 오버로드가 사용하도록 설정됩니다.If you define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES to 1, this enables template overloads of standard CRT functions that call the more secure variants automatically. _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES가 1이면 코드를 변경할 필요가 없습니다.If _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES is 1, then no changes to your code are necessary. 내부적으로 strcpy에 대한 호출은 자동으로 제공된 크기 인수를 사용하는 strcpy_s에 대한 호출로 변경됩니다.Behind the scenes, the call to strcpy is changed to a call to strcpy_s with the size argument supplied automatically.

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1  

// ...  

char szBuf[10];  
strcpy(szBuf, "test"); // ==> strcpy_s(szBuf, 10, "test")  

매크로 _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMESstrncpy와 같이 개수를 세는 함수에 영향을 주지 않습니다.The macro _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES does not affect the functions that take a count, such as strncpy. 개수 함수에 대한 템플릿 오버로드를 사용하도록 설정하려면 _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT를 1로 정의합니다.To enable template overloads for the count functions, define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT to 1. 그러나 이러한 작업을 수행하기 전에 코드가 버퍼의 크기가 아닌(일반적인 실수) 문자 개수를 전달하는지 확인해야 합니다.Before doing so, however, make sure that your code passes the count of characters, not the size of the buffer (a common mistake). 또한 안전한 변형이 호출되는 경우 함수 호출 이후 명시적으로 버퍼의 끝에 null 종결자를 쓰는 코드는 필요하지 않습니다.Also, code that explicitly writes a null terminator at the end of the buffer after the function call is unnecessary if the secure variant is called. 잘라내기 동작이 필요한 경우 _TRUNCATE를 참조하세요.If you need truncation behavior, see _TRUNCATE.

참고

_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT 매크로의 경우 _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES도 1로 정의되어야 합니다.The macro _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT requires that _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES is also defined as 1. _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT가 1로 정의되고 _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES가 0으로 정의되는 경우 응용 프로그램은 템플릿 오버로드를 수행하지 않습니다.If _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT is defined as 1 and _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES is defined as 0, the application will not perform any template overloads.

_CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES를 1로 정의하면 안전한 변형(“_s”로 끝나는 이름)의 템플릿 오버로드가 사용하도록 설정됩니다.When you define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES to 1, it enables template overloads of the secure variants (names ending in "_s"). 이 경우 _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES가 1이면 원본 코드에서 작은 변경 작업이 하나 수행되어야 합니다.In this case, if _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES is 1, then one small change must be made to the original code:

#define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1  

// ...  

char szBuf[10];  
strcpy_s(szBuf, "test"); // ==> strcpy_s(szBuf, 10, "test")  

“_s”를 추가하여 함수 이름만 변경해야 합니다. 템플릿 오버로드는 크기 인수를 제공합니다.Only the name of the function needs to be changed (by adding "_s"); the template overload takes care of providing the size argument.

기본적으로 _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT가 0(해제)으로 정의되고 _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES가 1(설정)로 정의됩니다.By default, _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES and _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT are defined as 0 (disabled) and _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES is defined as 1 (enabled).

이러한 템플릿 오버로드는 정적 배열에 대해서만 작동합니다.Note that these template overloads only work for static arrays. 동적으로 할당된 버퍼의 경우 추가 소스 코드 변경이 필요합니다.Dynamically allocated buffers require additional source code changes. 위 예제를 다시 봅니다.Revisiting the above examples:

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1  

// ...  

char *szBuf = (char*)malloc(10);  
strcpy(szBuf, "test"); // still deprecated; you have to change it to  
                       // strcpy_s(szBuf, 10, "test");  

또 다른 예제:And this:

#define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1  

// ...  

char *szBuf = (char*)malloc(10);  
strcpy_s(szBuf, "test"); // doesn't compile; you have to change it to  
                         // strcpy_s(szBuf, 10, "test");  

참고 항목See Also

CRT의 보안 기능 Security Features in the CRT
CRT 라이브러리 기능CRT Library Features