Безопасные перегрузки шаблонов
Многие функции CRT стали нерекомендуемыми в пользу новых более безопасных версий (например, strcpy_s является более безопасной заменой для strcpy). CRT предоставляет перегруженные шаблоны, которые помогают упростить переход к более безопасным вариантом.
Например, этот код создает предупреждение, поскольку strcpy стала нерекомендуемой:
char szBuf[10];
strcpy(szBuf, "test"); // warning: deprecated
Можно игнорировать предупреждение. Определите символ _CRT_SECURE_NO_WARNINGS, чтобы отключить предупреждение, или обновите код для использования strcpy_s:
char szBuf[10];
strcpy_s(szBuf, 10, "test"); // security-enhanced _s function
Перегруженные версии шаблонов предоставляют дополнительные возможности. Определение _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES как 1 включает использование перегруженных шаблонов стандартных функций CRT, вызывающих более безопасные варианты автоматически. Если _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES определено как 1, то никаких изменений в коде не требуется. Вызов strcpy будет в фоновом режиме изменен на вызов strcpy_s с автоматически предоставленным аргументом размера.
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
...
char szBuf[10];
strcpy(szBuf, "test"); // ==> strcpy_s(szBuf, 10, "test")
_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES не влияет на функции, которые принимают число, например strncpy. Чтобы включить перегруженные шаблоны для функций, принимающих число, определите _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT как 1. Однако перед этим действием стоит убедиться, что код передает число символов, а не размер буфера (частая ошибка). Кроме того, код, который явно записывает значение NULL в конец буфера после вызова функции, является необязательным, если вызывается безопасный вариант. При необходимости усечения обратитесь к разделу _TRUNCATE.
Примечание
Макрос _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT требует, чтобы _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES также был определен как 1.Если _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT определен как 1 и _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES определен как 0, в приложении не выполняются никакие перегруженные шаблоны.
Определение _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES как 1 включает перегруженные шаблоны безопасных вариантов (имена оканчиваются на «_s»). В этом случае, если _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES определено как 1, одно незначительное изменение должно быть сделано в исходном коде.
#define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1
...
char szBuf[10];
strcpy_s(szBuf, "test"); // ==> strcpy_s(szBuf, 10, "test")
Только имена функций должны быть изменены (путем добавления «_s»); шаблонная перегрузка предоставит аргумент размера.
По умолчанию _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES и _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT определены как 0 (запрещено), а _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES определена как 1 (разрешено).
Обратите внимание, что эти шаблонные перегрузки работают только для статических массивов. Динамически выделенные буферы требуют дополнительных изменений исходного кода. Изучая вышеприведенные примеры:
#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");
А также:
#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");