Поделиться через


Безопасные перегрузки шаблонов

Многие функции 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");

См. также

Ссылки

Функции библиотеки CRT

Основные понятия

Функции безопасности в CRT