Udostępnij za pośrednictwem


Przeciążenia bezpiecznych szablonów

Firma Microsoft ma przestarzałe wiele funkcji biblioteki C Runtime library (CRT) na rzecz wersji rozszerzonych o zabezpieczenia. Na przykład strcpy_s jest to bezpieczniejsze zastąpienie elementu strcpy. Przestarzałe funkcje są typowymi źródłami usterek zabezpieczeń, ponieważ nie uniemożliwiają operacji, które mogą zastąpić pamięć. Domyślnie kompilator generuje ostrzeżenie o wycofaniu podczas korzystania z jednej z tych funkcji. Język CRT udostępnia przeciążenia szablonów języka C++ dla tych funkcji, aby ułatwić przejście do bardziej bezpiecznych wariantów.

Na przykład ten fragment kodu generuje ostrzeżenie, ponieważ strcpy jest przestarzałe:

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

Ostrzeżenie o wycofaniu informuje o tym, że kod może być niebezpieczny. Jeśli sprawdzono, że kod nie może zastąpić pamięci, możesz wybrać kilka opcji. Możesz zignorować ostrzeżenie. Możesz zdefiniować symbol _CRT_SECURE_NO_WARNINGS przed instrukcjami include nagłówków CRT w celu pominięcia ostrzeżenia lub zaktualizować kod, aby użyć strcpy_spolecenia :

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

Przeciążenia szablonu zapewniają więcej opcji. Jeśli zdefiniujesz _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES wartość 1, umożliwia ona przeciążenia szablonów standardowych funkcji CRT, które automatycznie nazywają bardziej bezpieczne warianty. Jeśli _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES wartość to 1, nie są wymagane żadne zmiany w kodzie. Za kulisami wywołanie strcpy metody jest zmieniane na wywołanie strcpy_s metody z argumentem rozmiaru dostarczonym automatycznie.

#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. Aby włączyć przeciążenia szablonu dla funkcji count, zdefiniuj _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT wartość 1. Przed wykonaniem tej czynności upewnij się jednak, że kod przekazuje liczbę znaków, a nie rozmiar buforu (typowy błąd). Ponadto kod, który jawnie zapisuje terminator o wartości null na końcu buforu po wywołaniu funkcji jest niepotrzebny, jeśli jest wywoływany bezpieczny wariant. Jeśli potrzebujesz zachowania obcinania, zobacz _TRUNCATE.

Uwaga

Makro _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT wymaga _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES również zdefiniowanego jako 1. Jeśli _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT wartość jest zdefiniowana jako 1 i _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES jest zdefiniowana jako 0, aplikacja nie będzie wykonywać żadnych przeciążeń szablonu.

Podczas definiowania _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES wartości 1 włącza przeciążenia szablonów bezpiecznych wariantów (nazwy kończące się na "_s"). W takim przypadku, jeśli _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES ma wartość 1, należy wprowadzić jedną małą zmianę w oryginalnym kodzie:

#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 (dodając "_s"); przeciążenie szablonu dba o podanie argumentu rozmiaru.

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 są zdefiniowane jako 1 (włączone).

Przeciążenia szablonu działają tylko dla tablic statycznych. Dynamiczne przydzielone wymagają innych zmian kodu źródłowego. Ponowne przejrzenie powyższych przykładów:

#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 w tym przykładzie:

#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ż

Funkcje zabezpieczeń w narzędziu CRT
Pliki C runtime (CRT) i C++ Standard Library (STL) .lib