Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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