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_s
polecenia :
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