Przeciążenia bezpiecznych szablonówSecure Template Overloads

Firma Microsoft zakończyła działanie wielu funkcji biblioteki środowiska uruchomieniowego języka C (CRT) na korzyść wersji ulepszonych z zabezpieczeniami.Microsoft has deprecated many C Runtime library (CRT) functions in favor of security-enhanced versions. Na przykład, strcpy_s jest bardziej bezpieczną wymianą strcpy .For example, strcpy_s is the more secure replacement for strcpy. Przestarzałe funkcje są typowymi źródłami błędów zabezpieczeń, ponieważ nie uniemożliwiają operacji, które mogą zastąpić pamięć.The deprecated functions are common sources of security bugs, because they don't prevent operations that can overwrite memory. Domyślnie kompilator generuje ostrzeżenie o zaniechaniu podczas korzystania z jednej z tych funkcji.By default, the compiler produces a deprecation warning when you use one of these functions. CRT udostępnia przeciążenia szablonów języka C++ dla tych funkcji, aby ułatwić przechodzenie do bardziej bezpiecznych wariantów.The CRT provides C++ template overloads for these functions to help ease the transition to the more secure variants.

Na przykład ten fragment kodu generuje ostrzeżenie, ponieważ strcpy jest przestarzały:For example, this code snippet generates a warning because strcpy is deprecated:

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

Ostrzeżenie o zaniechaniu informuje o tym, że kod może być niebezpieczny.The deprecation warning is there to tell you that your code may be unsafe. Jeśli sprawdzono, że Twój kod nie może zastąpić pamięci, możesz wybrać kilka opcji.If you've verified that your code can't overwrite memory, you have several choices. Możesz zignorować ostrzeżenie, można zdefiniować symbol _CRT_SECURE_NO_WARNINGS przed instrukcją include dla nagłówków CRT, aby pominąć ostrzeżenie, lub zaktualizować swój kod, aby użyć 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

Przeciążenia szablonu zapewniają dodatkowe opcje.The template overloads provide additional choices. Jeśli zdefiniujesz _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES na 1, spowoduje to przeciążanie szablonu standardowych funkcji CRT, które automatycznie wywołują bezpieczniejsze warianty.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. Jeśli _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES jest 1, nie są wymagane żadne zmiany w kodzie.If _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES is 1, then no changes to your code are necessary. W tle wywołanie strcpy jest zmieniane na wywołanie strcpy_s z argumentem o rozmiarze dostarczonym automatycznie.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")

Makro _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES nie ma wpływu na funkcje, które przyjmują liczbę, na przykład strncpy .The macro _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES doesn't affect the functions that take a count, such as strncpy. Aby włączyć przeciążenia szablonów dla funkcji count, zdefiniuj _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT na 1.To enable template overloads for the count functions, define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT to 1. Przed wykonaniem tej czynności należy jednak upewnić się, że kod przekazuje liczbę znaków, a nie rozmiar buforu (częsty błąd).Before doing so, however, make sure that your code passes the count of characters, not the size of the buffer (a common mistake). Ponadto kod, który jawnie zapisuje terminator o wartości null na końcu buforu po wywołaniu funkcji jest zbędny, jeśli jest wywoływana bezpieczna zmienna.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. Jeśli konieczne jest zachowanie obcinania, zobacz _TRUNCATE.If you need truncation behavior, see _TRUNCATE.

Uwaga

Makro _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT wymaga _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES również zdefiniowania 1.The macro _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT requires that _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES is also defined as 1. Jeśli _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT jest zdefiniowany jako 1 i _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES jest zdefiniowany jako 0, aplikacja nie będzie wykonywać przeciążeń szablonu.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.

Po zdefiniowaniu wartości _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1 włącza przeciążenia szablonu bezpiecznych wariantów (nazwy kończące się na "_s").When you define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES to 1, it enables template overloads of the secure variants (names ending in "_s"). W takim przypadku, jeśli _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES ma wartość 1, należy wykonać jedną małą zmianę w oryginalnym kodzie: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")

Należy zmienić tylko nazwę funkcji (przez dodanie "_s"); Przeciążenie szablonu wymaga podania argumentu size.Only the name of the function needs to be changed (by adding "_s"); the template overload takes care of providing the size argument.

Domyślnie _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES i _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT są zdefiniowane jako 0 (wyłączone) i _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES zdefiniowane jako 1 (włączone).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).

Te przeciążenia szablonu działają tylko w przypadku tablic statycznych.These template overloads only work for static arrays. Dynamicznie przydzielane bufory wymagają dodatkowych zmian w kodzie źródłowym.Dynamically allocated buffers require additional source code changes. Ponowne odwiedzanie powyższych przykładów:Revisiting the above examples:

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1

// ...

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

I:And this:

#define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1

// ...

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

Zobacz teżSee also

Funkcje zabezpieczeń w CRTSecurity Features in the CRT
Funkcje biblioteki CRTCRT Library Features