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