Przeciążenia bezpiecznych szablonów
Wiele funkcji CRT mają została zaniechana na rzecz wersje nowsze, zwiększonych zabezpieczeń (na przykład, strcpy_s zastępuje bardziej bezpieczne strcpy).CRT zapewnia overloads szablonu do ułatwiania sobie przejście do bezpiecznego więcej wariantów.
Na przykład, kod ten generuje ostrzeżenie, ponieważ strcpy jest przestarzałe:
char szBuf[10];
strcpy(szBuf, "test"); // warning: deprecated
Można zignorować ostrzeżenie.Zdefiniowanie symbolu _CRT_SECURE_NO_WARNINGS ostrzeżenia lub zaktualizować kod w strcpy_s:
char szBuf[10];
strcpy_s(szBuf, 10, "test"); // security-enhanced _s function
Overloads szablonu zapewnia dodatkowe opcje.Definiowanie _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES na wartość 1 umożliwia overloads szablonu standardowych funkcji CRT, które automatycznie wywoływać bezpieczniejsze wariantów.Jeśli _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES ma wartość 1, a następnie nie zmiany kodu są niezbędne.Za kulisami wywołanie strcpy zostanie zmieniona na wywołanie do strcpy_s z argumentem rozmiar dostarczane automatycznie.
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
...
char szBuf[10];
strcpy(szBuf, "test"); // ==> strcpy_s(szBuf, 10, "test")
_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMESnie wpływa na funkcje, które count, takich jak strncpy.Aby włączyć overloads szablonu dla funkcji count, należy zdefiniować _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT do 1.Przedtem, jednak należy się upewnić, że Twój kod przekazuje licznik znaków, nie rozmiar buforu (wspólne pomyłka).Ponadto kod, który jawnie zapisuje null terminator na końcu buforu po wywołanie funkcji nie jest konieczne, jeśli bezpieczne wariant jest wywoływana.Jeśli konieczne jest zachowanie obcinania, zobacz _TRUNCATE.
[!UWAGA]
Makro _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT wymaga, aby _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES jest również określona jako 1.Jeśli _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT jest zdefiniowana jako 1 i _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES jest zdefiniowana jako 0, aplikacja nie będzie wykonywał żadnych overloads szablonu.
Definiowanie _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES na wartość 1 umożliwia overloads szablonu wariantów bezpieczne (nazwy kończące się w "_s").W przypadku gdy _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES ma wartość 1, a następnie jeden niewielkie zmiany muszą być dokonywane na oryginalnego kodu:
#define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1
...
char szBuf[10];
strcpy_s(szBuf, "test"); // ==> strcpy_s(szBuf, 10, "test")
Tylko nazwę funkcji, musi być zmienione (dodając "_s"); przeciążenie szablonu wykona dostarczanie argument rozmiar.
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 jest zdefiniowana jako 1 (włączone).
Należy zauważyć, że te szablonu overloads działa tylko dla tablic statyczne.Bufory przydzielany dynamicznie wymagają zmiany kodu źródłowego dodatkowe.Ponowne odwiedzanie powyższych przykładach:
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
...
char *szBuf = (char*)malloc(10);
strcpy(szBuf, "test"); // still deprecated; have to change to
// strcpy_s(szBuf, 10, "test");
I to:
#define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1
...
char *szBuf = (char*)malloc(10);
strcpy_s(szBuf, "test"); // doesn't compile; have to change to
// strcpy_s(szBuf, 10, "test");