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


Предупреждение C28719

Запрещенное использование API: имя функции небезопасно и помечено как нерекомендуемое.

Это предупреждение указывает на использование функции, которая была запрещена и для которой имеется более надежная или безопасная замена.

Замечания

Список всех запрещенных функций, охваченных этой ошибкой, почему они запрещены, и рекомендуемые замены можно найти после следующего примера.

Имя анализа кода: BANNED_API_USAGE

Пример

Следующий код создает это предупреждение:

void example_func(PSTR src) 
{ 
    char dst[100]; 
    strcpy(dst, src);
} 

Эта проблема связана с использованием небезопасной функции strcpy. strcpy не проверяет, достаточно ли размер целевого буфера для размещения исходных данных.

Чтобы устранить эту проблему, можно использовать strcpy_s, более безопасную замену функции в C++11. strcpy_s имеет третий параметр (размер целевого буфера), чтобы убедиться, что копируются только многие байты. Например, следующий код безопаснее:

void example_func(PSTR src) 
{ 
    char dst[100]; 
    strcpy_s(dst, sizeof(dst), src); 
}

Запрещенные функции

ПРИМЕЧАНИЕ. Этот список активно обновляется и улучшается

Запрещенный API Замена Обоснование / Заметки
_fstrcat StringCbCat, StringCbCatEx, StringCchCat, StringCchCatEx Устаревшая 16-разрядная реализация дальнего указателя
_fstrcpy StringCbCopy, StringCbCopyEx, StringCchCopy, StringCchCopyEx Устаревшая 16-разрядная реализация дальнего указателя
_fstrncat StringCbCatN, StringCbCatNEx, StringCchCatN, StringCchCatNEx Устаревшая реализация 16-разрядного дальнего указателя
_fstrncpy strncpy, wcsncpy Устаревшая 16-разрядная реализация дальнего указателя
_ftccat strcat, wcscat Устаревшая 16-разрядная реализация указателя дальнего доступа
_ftccpy strcpy, wcscpy Устаревшая 16-разрядная реализация дальнего указателя
_ftcscat strcat, wcscat Устаревшая 16-разрядная реализация дальнего указателя
_ftcscpy strcpy, wcscpy Устаревшая 16-разрядная реализация дальнего указателя
_getts StringCbGets, StringCbGetsEx, StringCchGets, StringCchGetsEx, gets_s Нет ограничений на размер данных
_gettws gets_s Нет ограничений на размер данных
_getws _getws_s Нет ограничений на размер данных
_mbccat strcat_s, StringCbCat, StringCbCatEx, StringCchCat, StringCchCatEx, strlcat Нет ограничений на размер данных
_makepath _makepath_s Нет ограничений на размер данных
_mbscat _mbscat_s
_snprintf _snprintf_s Не завершает работу с значением NULL
_sntprintf StringCbPrintf, StringCbPrintf_l, StringCbPrintf_lEx, StringCbPrintfEx, StringCchPrintf, StringCchPrintfEx Не добавляет NULL в конец строки
_sntscanf _snscanf_s Максимальная длина отсутствует
_snwprintf _snwprintf_s, StringCbPrintf, StringCbPrintf_l, StringCbPrintf_lEx, StringCbPrintfEx, StringCchPrintf, StringCchPrintfEx Не завершает нулевым символом (NULL)
_splitpath _splitpath_s Проверка границ не выполняется
_stprintf StringCbPrintf, StringCbPrintf_l, StringCbPrintf_lEx, StringCbPrintfEx, StringCchPrintf, StringCchPrintfEx Ограниченное обнаружение ошибок
_stscanf sscanf_s (требуется изменение строки форматирования) Проверка границ не выполняется
_tccat strcat_s, StringCbCat, StringCbCatEx, StringCchCat, StringCchCatEx, strlcat Проверка границ не выполняется
_tccpy strcpy_s, StringCbCopy, StringCbCopyEx, StringCchCopy, StringCchCopyEx, strlcpy Проверка границ не выполняется
_tcscat StringCbCat, StringCbCatEx, StringCchCat, StringCchCatEx Ограниченное обнаружение ошибок
_tcscpy StringCbCopy, StringCbCopyEx, StringCchCopy, StringCchCopyEx Ограниченное обнаружение ошибок
_tcsncat StringCbLength, StringCchLength, UnalignedStringCbLength, UnalignedStringCchLength Максимальная длина отсутствует
_tcsncpy StringCbCopyN, StringCbCopyNEx, StringCchCopyN, StringCchCopyNEx Ограниченное обнаружение ошибок
_tmakepath _makepath_s Проверка границ не выполняется
_tscanf scanf_s Отсутствие проверки границ для выходных данных
_tsplitpath splitpath_s, wsplitpath_s Проверка границ не выполняется
_vsnprintf _vsnprintf_s, StringCchVPrintf, StringCchVPrintf_l, StringCchVPrintf_lEx, StringCchVPrintfEx Ограниченное обнаружение ошибок
_vsntprintf StringCbVPrintf, StringCbVPrintf_l, StringCbVPrintf_lEx, StringCbVPrintfEx, StringCchVPrintf, StringCchVPrintf_l, StringCchVPrintf_lEx, StringCchVPrintfEx Ограниченное обнаружение ошибок
_vsnwprintf _vsnwprintf_s, StringCbVPrintf, StringCbVPrintf_l, StringCbVPrintf_lEx, StringCbVPrintfEx Ограниченное обнаружение ошибок
_vstprintf StringCbVPrintf, StringCbVPrintf_l, StringCbVPrintf_lEx, StringCbVPrinfEx, StringCchVPrintf, StringCchVPrintf_l, StringCchVPrintf_lEx, StringCchVPrintfEx Максимальная длина отсутствует
_wmakepath _wmakepath_s Проверка границ не выполняется
_wsplitpath _wsplitpath_s Проверка границ не выполняется
OemToCharW WideCharToMultiByte Проверка границ не выполняется
StrCat StringCbCat, StringCbCatEx, StringCchCat, StringCchCatEx Ограниченное обнаружение ошибок
StrCatA StringCbCat, StringCbCatEx, StringCchCat, StringCchCatEx Ограниченное обнаружение ошибок
StrCatBuff StringCbCat, StringCbCatEx, StringCchCat, StringCchCatEx Без окончания на NULL
StrCatBuffA StringCbCat, StringCbCatEx, StringCchCat, StringCchCatEx Без нуль-терминации
StrCatBuffW StringCbCat, StringCbCatEx, StringCchCat, StringCchCatEx Отсутствие завершения нулевым символом
StrCatChainW StringCbCatEx, StringCbCatNEx, StringCchCatEx, StringCchCatNEx Без нуль-терминатора
StrCatN StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCat, StringCchCatEx, StringCchCatN, StringCchCatNEx Проверка границ не выполняется
StrCatNA StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCat, StringCchCatEx, StringCchCatN, StringCchCatNEx Проверка границ не выполняется
StrCatNW StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCat, StringCchCatEx, StringCchCatN, StringCchCatNEx Проверка границ не выполняется
StrCatW StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCat, StringCchCatEx, StringCchCatN, StringCchCatNEx Проверка границ не выполняется
StrCpy StringCbCopy, StringCbCopyEx, StringCchCopy, StringCchCopyEx Проверка границ не выполняется
StrCpyA StringCbCopy, StringCbCopyEx, StringCchCopy, StringCchCopyEx Проверка границ не выполняется
StrCpyN StringCbCopy, StringCbCopyEx, StringCchCopy, StringCchCopyEx Не завершает строку символом NULL
StrCpyNA StringCbCopy, StringCbCopyEx, StringCchCopy, StringCchCopyEx Не завершает работу с значением NULL
StrCpyNW StringCbCopy, StringCbCopyEx, StringCchCopy, StringCchCopyEx Ограниченная проверка ошибок
strcpyW StringCbCopy, StringCbCopyEx, StringCchCopy, StringCchCopyEx Проверка границ не выполняется
StrCpyW StringCbCopy, StringCbCopyEx, StringCchCopy, StringCchCopyEx Проверка границ не выполняется
StrNCat StringCbCatN, StringCbCatNEx, StringCchCatN, StringCchCatNEx Ограниченное обнаружение ошибок
StrNCatA StringCbCatN, StringCbCatNEx, StringCchCatN, StringCchCatNEx Ограниченное обнаружение ошибок
StrNCatW StringCbCatN, StringCbCatNEx, StringCchCatN, StringCchCatNEx Ограниченное обнаружение ошибок
StrNCpy StringCbCopy, StringCbCopyEx, StringCchCopy, StringCchCopyEx Не завершает нулевым символом
StrNCpyA StringCbCopy, StringCbCopyEx, StringCchCopy, StringCchCopyEx Не завершает работу с значением NULL
StrNCpyW StringCbCopy, StringCbCopyEx, StringCchCopy, StringCchCopyEx Не заканчивает строку символом NULL
gets gets_s, fgets, StringCbGets, StringCbGetsEx, StringCchGets, StringCchGetsEx Ограниченное обнаружение ошибок; устаревший стандарт C11
lstrcat StringCbCat, StringCbCatEx, StringCchCat, StringCchCatEx Ограниченное обнаружение ошибок
lstrcatA StringCbCat, StringCbCatEx, StringCchCat, StringCchCatEx Ограниченное обнаружение ошибок
lstrcatn StringCbCat, StringCbCatEx, StringCchCat, StringCchCatEx Ограниченное обнаружение ошибок
lstrcatnA StringCbCat, StringCbCatEx, StringCchCat, StringCchCatEx Ограниченное обнаружение ошибок
lstrcatnW StringCbCat, StringCbCatEx, StringCchCat, StringCchCatEx Ограниченное обнаружение ошибок
lstrcatW StringCbCat, StringCbCatEx, StringCchCat, StringCchCatEx Ограниченное обнаружение ошибок
lstrcpy StringCbCopy, StringCbCopyEx, StringCchCopy, StringCchCopyEx Проверка границ не выполняется
lstrcpyA StringCbCopy, StringCbCopyEx, StringCchCopy, StringCchCopyEx Проверка границ не выполняется
lstrcpyn StringCbCopy, StringCbCopyEx, StringCchCopy, StringCchCopyEx Ограниченное обнаружение ошибок
lstrcpynA StringCbCopy, StringCbCopyEx, StringCchCopy, StringCchCopyEx Ограниченное обнаружение ошибок
lstrcpynW StringCbCopy, StringCbCopyEx, StringCchCopy, StringCchCopyEx Проверка границ не выполняется
lstrcpyW StringCbCopy, StringCbCopyEx, StringCchCopy, StringCchCopyEx Проверка границ не выполняется
snscanf sscanf_s Проверка границ не выполняется
snwscanf swscanf_s Проверка границ не выполняется
sprintf sprintf_s Ограниченное обнаружение ошибок
sprintfA sprintf_s Проверка границ не выполняется
sprintfW swprintf_s Проверка границ не выполняется
lstrncat StringCbCat, StringCbCatEx, StringCchCat, StringCchCatEx Ограниченное обнаружение ошибок
makepath
nsprintf sprintf_s Ошибки не обнаруживаются, а границы не проверяются
strcat strcat_s, StringCbCat, StringCbCatEx, StringCchCat, StringCchCatEx, strlcat Ограниченное обнаружение ошибок
strcatA strcat_s, StringCbCat, StringCbCatEx, StringCchCat, StringCchCatEx, strlcat Ограниченное обнаружение ошибок
strcatW strcat_s, StringCbCat, StringCbCatEx, StringCchCat, StringCchCatEx, strlcat Ограниченное обнаружение ошибок
strcpy strcpy_s, StringCbCopy, StringCbCopyEx, StringCchCopy, StringCchCopyEx, strlcpy Проверка границ не выполняется
strcpyA strcpy_s, StringCbCopy, StringCbCopyEx, StringCchCopy, StringCchCopyEx, strlcpy Проверка границ не выполняется
strncat strncat_s, StringCbCatN, StringCbCatNEx, StringCchCatN, StringCchCatNEx, strlcat Ограниченное обнаружение ошибок
strncpy strncpy_s, StringCbCopyN, StringCbCopyNEx, StringCchCopyN, StringCchCopyNEx, strlcpy Ограниченное обнаружение ошибок
swprintf swprintf_s StringCbPrintf, StringCbPrintf_l, StringCbPrintf_lEx, StringCbPrintf, StringCbPrintfEx Ограниченное обнаружение ошибок
ualstrcpyW strcpy_s, StringCbCopy, StringCbCopyEx, StringCchCopy, StringCchCopyEx, strlcpy Проверка границ не выполняется
vsnprintf vsnprintf_s, StringCbVPrintf, StringCbVPrintf_l, StringCbVPrintf_lEx, StringCbVPrintfEx, StringCchVPrintf, StringCchVPrintf_l, StringCchVPrintf_lEx, StringCchVPrintfEx Ограниченное обнаружение ошибок
vsprintf vsprintf_s, StringCbVPrintf, StringCbVPrintf_l, StringCbVPrintf_lEx, StringCbVPrintfEx, StringCchVPrintf, StringCchVPrintf_l, StringCchVPrintf_lEx, StringCchVPrintfEx, vasprintf Ограниченное обнаружение ошибок
vswprintf vswprintf_s
wcscat wcscat_s, StringCbCat, StringCbCatEx, StringCchCat, StringCchCatEx, wcslcat Ограниченное обнаружение ошибок
wcscpy wcscpy_s, StringCbCopy, StringCbCopyEx, StringCchCopy, StringCchCopyEx, wcslcpy Проверка границ не выполняется
wcsncat wcsncat_s, wcslcat Ограниченное обнаружение ошибок
wcsncpy wcsncpy_s, StringCbCopyN, StringCbCopyNEx, StringCchCopyN, StringCchCopyNEx, wcslcpy Ограниченное обнаружение ошибок
wnsprintf StringCbPrintf, StringCbPrintf_l, StringCbPrintf_lEx, StringCbPrintfEx, StringCchPrintf, StringCchPrintfEx Отсутствие завершающего NULL-символа
wnsprintfA StringCbPrintf, StringCbPrintf_l, StringCbPrintf_lEx, StringCbPrintfEx, StringCchPrintf, StringCchPrintfEx Без нуль-терминирования
wsprintf StringCbPrintf, StringCbPrintf_l, StringCbPrintf_lEx, StringCbPrintfEx, StringCchPrintf, StringCchPrintfEx Без NULL-терминатора
wsprintfA StringCbPrintf, StringCbPrintf_l, StringCbPrintf_lEx, StringCbPrintfEx, StringCchPrintf, StringCchPrintfEx Без символа NULL в конце
wsprintfW StringCbPrintf, StringCbPrintf_l, StringCbPrintf_lEx, StringCbPrintfEx, StringCchPrintf, StringCchPrintfEx Нет терминирования NULL
wvnsprintf StringCbVPrintf, StringCbVPrintf_l, StringCbVPrintf_lEx, StringCbVPrintfEx, StringCchVPrintf, StringCchVPrintf_l, StringCchVPrintf_lEx, StringCchVPrintfEx Без окончания символом NULL
wvnsprintfA StringCbVPrintf, StringCbVPrintf_l, StringCbVPrintf_lEx, StringCbVPrintfEx, StringCchVPrintf, StringCchVPrintf_l, StringCchVPrintf_lEx, StringCchVPrintfEx Без окончания NULL-символом
wvnsprintfW StringCbVPrintf, StringCbVPrintf_l, StringCbVPrintf_lEx, StringCbVPrintfEx, StringCchVPrintf, StringCchVPrintf_l, StringCchVPrintf_lEx, StringCchVPrintfEx Без нуль-терминатора
wvsprintf StringCbVPrintf, StringCbVPrintf_l, StringCbVPrintf_lEx, StringCbVPrintfEx, StringCchVPrintf, StringCchVPrintf_l, StringCchVPrintf_lEx, StringCchVPrintfEx Без NULL-терминации
wvsprintfA StringCbVPrintf, StringCbVPrintf_l, StringCbVPrintf_lEx, StringCbVPrintfEx, StringCchVPrintf, StringCchVPrintf_l, StringCchVPrintf_lEx, StringCchVPrintfEx Без NULL-окончания
wvsprintfW StringCbVPrintf, StringCbVPrintf_l, StringCbVPrintf_lEx, StringCbVPrintfEx, StringCchVPrintf, StringCchVPrintf_l, StringCchVPrintf_lEx, StringCchVPrintfEx Без завершения нулевым символом