警告 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、、StringCbCatExStringCchCat、、StringCchCatEx 旧版 16 位远指针实现
_fstrcpy StringCbCopy、、StringCbCopyExStringCchCopy、、StringCchCopyEx 旧版 16 位远指针实现
_fstrncat StringCbCatN、、StringCbCatNExStringCchCatN、、StringCchCatNEx 旧版 16 位远指针实现
_fstrncpy strncpy, wcsncpy 旧版 16 位远指针实现
_ftccat strcat, wcscat 旧版 16 位远指针实现
_ftccpy strcpy, wcscpy 旧版 16 位远指针实现
_ftcscat strcat, wcscat 旧版 16 位远指针实现
_ftcscpy strcpy, wcscpy 旧版 16 位远指针实现
_getts StringCbGets、、StringCbGetsExStringCchGetsStringCchGetsExgets_s 数据没有大小限制
_gettws gets_s 数据没有大小限制
_getws _getws_s 数据没有大小限制
_mbccat strcat_s、、StringCbCatStringCbCatExStringCchCatStringCchCatExstrlcat 数据没有大小限制
_makepath _makepath_s 数据没有大小限制
_mbscat _mbscat_s
_snprintf _snprintf_s 不以 NULL 结尾
_sntprintf StringCbPrintf、、StringCbPrintf_lStringCbPrintf_lExStringCbPrintfExStringCchPrintfStringCchPrintfEx 不以 NULL 结尾
_sntscanf _snscanf_s 无最大长度
_snwprintf _snwprintf_s、、StringCbPrintfStringCbPrintf_lStringCbPrintf_lExStringCbPrintfEx、、 StringCchPrintfStringCchPrintfEx 不以 NULL 结尾
_splitpath _splitpath_s 无边界检查
_stprintf StringCbPrintf、、StringCbPrintf_lStringCbPrintf_lExStringCbPrintfExStringCchPrintfStringCchPrintfEx 有限的错误检测
_stscanf sscanf_s (需要格式字符串更改) 无边界检查
_tccat strcat_s、、StringCbCatStringCbCatExStringCchCatStringCchCatExstrlcat 无边界检查
_tccpy strcpy_s、、StringCbCopyStringCbCopyExStringCchCopyStringCchCopyExstrlcpy 无边界检查
_tcscat StringCbCat、、StringCbCatExStringCchCat、、StringCchCatEx 有限的错误检测
_tcscpy StringCbCopy、、StringCbCopyExStringCchCopy、、StringCchCopyEx 有限的错误检测
_tcsncat StringCbLength、、StringCchLengthUnalignedStringCbLength、、UnalignedStringCchLength 无最大长度
_tcsncpy StringCbCopyN、、StringCbCopyNExStringCchCopyN、、StringCchCopyNEx 有限的错误检测
_tmakepath _makepath_s 无边界检查
_tscanf scanf_s 不检查输出的边界
_tsplitpath splitpath_s, wsplitpath_s 无边界检查
_vsnprintf _vsnprintf_s、、StringCchVPrintfStringCchVPrintf_lStringCchVPrintf_lExStringCchVPrintfEx 有限的错误检测
_vsntprintf StringCbVPrintf、、StringCbVPrintf_lStringCbVPrintf_lExStringCbVPrintfExStringCchVPrintfStringCchVPrintf_l、、 StringCchVPrintf_lExStringCchVPrintfEx 有限的错误检测
_vsnwprintf _vsnwprintf_s、、StringCbVPrintfStringCbVPrintf_lStringCbVPrintf_lExStringCbVPrintfEx 有限的错误检测
_vstprintf StringCbVPrintf、、StringCbVPrintf_lStringCbVPrintf_lExStringCbVPrinfExStringCchVPrintfStringCchVPrintf_l、、 StringCchVPrintf_lExStringCchVPrintfEx 无最大长度
_wmakepath _wmakepath_s 无边界检查
_wsplitpath _wsplitpath_s 无边界检查
OemToCharW WideCharToMultiByte 无边界检查
StrCat StringCbCat、、StringCbCatExStringCchCat、、StringCchCatEx 有限的错误检测
StrCatA StringCbCat、、StringCbCatExStringCchCat、、StringCchCatEx 有限的错误检测
StrCatBuff StringCbCat、、StringCbCatExStringCchCat、、StringCchCatEx 无 NULL 终止
StrCatBuffA StringCbCat、、StringCbCatExStringCchCat、、StringCchCatEx 无 NULL 终止
StrCatBuffW StringCbCat、、StringCbCatExStringCchCat、、StringCchCatEx 无 NULL 终止
StrCatChainW StringCbCatEx、、StringCbCatNExStringCchCatEx、、StringCchCatNEx 无 NULL 终止
StrCatN StringCbCat、、StringCbCatExStringCbCatNStringCbCatNExStringCchCatStringCchCatEx、、 StringCchCatNStringCchCatNEx 无边界检查
StrCatNA StringCbCat、、StringCbCatExStringCbCatNStringCbCatNExStringCchCatStringCchCatEx、、 StringCchCatNStringCchCatNEx 无边界检查
StrCatNW StringCbCat、、StringCbCatExStringCbCatNStringCbCatNExStringCchCatStringCchCatEx、、 StringCchCatNStringCchCatNEx 无边界检查
StrCatW StringCbCat、、StringCbCatExStringCbCatNStringCbCatNExStringCchCatStringCchCatEx、、 StringCchCatNStringCchCatNEx 无边界检查
StrCpy StringCbCopy、、StringCbCopyExStringCchCopy、、StringCchCopyEx 无边界检查
StrCpyA StringCbCopy、、StringCbCopyExStringCchCopy、、StringCchCopyEx 无边界检查
StrCpyN StringCbCopy、、StringCbCopyExStringCchCopy、、StringCchCopyEx 不以 NULL 结尾
StrCpyNA StringCbCopy、、StringCbCopyExStringCchCopy、、StringCchCopyEx 不以 NULL 结尾
StrCpyNW StringCbCopy、、StringCbCopyExStringCchCopy、、StringCchCopyEx 有限的错误检查
strcpyW StringCbCopy、、StringCbCopyExStringCchCopy、、StringCchCopyEx 无边界检查
StrCpyW StringCbCopy、、StringCbCopyExStringCchCopy、、StringCchCopyEx 无边界检查
StrNCat StringCbCatN、、StringCbCatNExStringCchCatN、、StringCchCatNEx 有限的错误检测
StrNCatA StringCbCatN、、StringCbCatNExStringCchCatN、、StringCchCatNEx 有限的错误检测
StrNCatW StringCbCatN、、StringCbCatNExStringCchCatN、、StringCchCatNEx 有限的错误检测
StrNCpy StringCbCopy、、StringCbCopyExStringCchCopy、、StringCchCopyEx 不以 NULL 结尾
StrNCpyA StringCbCopy、、StringCbCopyExStringCchCopy、、StringCchCopyEx 不以 NULL 结尾
StrNCpyW StringCbCopy、、StringCbCopyExStringCchCopy、、StringCchCopyEx 不以 NULL 结尾
gets gets_s、、fgetsStringCbGetsStringCbGetsExStringCchGetsStringCchGetsEx 有限的错误检测;由 C11 标准弃用
lstrcat StringCbCat、、StringCbCatExStringCchCat、、StringCchCatEx 有限的错误检测
lstrcatA StringCbCat、、StringCbCatExStringCchCat、、StringCchCatEx 有限的错误检测
lstrcatn StringCbCat、、StringCbCatExStringCchCat、、StringCchCatEx 有限的错误检测
lstrcatnA StringCbCat、、StringCbCatExStringCchCat、、StringCchCatEx 有限的错误检测
lstrcatnW StringCbCat、、StringCbCatExStringCchCat、、StringCchCatEx 有限的错误检测
lstrcatW StringCbCat、、StringCbCatExStringCchCat、、StringCchCatEx 有限的错误检测
lstrcpy StringCbCopy、、StringCbCopyExStringCchCopy、、StringCchCopyEx 无边界检查
lstrcpyA StringCbCopy、、StringCbCopyExStringCchCopy、、StringCchCopyEx 无边界检查
lstrcpyn StringCbCopy、、StringCbCopyExStringCchCopy、、StringCchCopyEx 有限的错误检测
lstrcpynA StringCbCopy、、StringCbCopyExStringCchCopy、、StringCchCopyEx 有限的错误检测
lstrcpynW StringCbCopy、、StringCbCopyExStringCchCopy、、StringCchCopyEx 无边界检查
lstrcpyW StringCbCopy、、StringCbCopyExStringCchCopy、、StringCchCopyEx 无边界检查
snscanf sscanf_s 无边界检查
snwscanf swscanf_s 无边界检查
sprintf sprintf_s 有限的错误检测
sprintfA sprintf_s 无边界检查
sprintfW swprintf_s 无边界检查
lstrncat StringCbCat、、StringCbCatExStringCchCat、、StringCchCatEx 有限的错误检测
makepath
nsprintf sprintf_s 无错误检测或边界检查
strcat strcat_s、、StringCbCatStringCbCatExStringCchCatStringCchCatExstrlcat 有限的错误检测
strcatA strcat_s、、StringCbCatStringCbCatExStringCchCatStringCchCatExstrlcat 有限的错误检测
strcatW strcat_s、、StringCbCatStringCbCatExStringCchCatStringCchCatExstrlcat 有限的错误检测
strcpy strcpy_s、、StringCbCopyStringCbCopyExStringCchCopyStringCchCopyExstrlcpy 无边界检查
strcpyA strcpy_s、、StringCbCopyStringCbCopyExStringCchCopyStringCchCopyExstrlcpy 无边界检查
strncat strncat_s、、StringCbCatNStringCbCatNExStringCchCatNStringCchCatNExstrlcat 有限的错误检测
strncpy strncpy_s、、StringCbCopyNStringCbCopyNExStringCchCopyNStringCchCopyNExstrlcpy 有限的错误检测
swprintf swprintf_sStringCbPrintf、、StringCbPrintf_lExStringCbPrintf_lStringCbPrintfStringCbPrintfEx 有限的错误检测
ualstrcpyW strcpy_s、、StringCbCopyStringCbCopyExStringCchCopyStringCchCopyExstrlcpy 无边界检查
vsnprintf vsnprintf_s、、StringCbVPrintfStringCbVPrintf_lExStringCbVPrintf_lStringCbVPrintfExStringCchVPrintfStringCchVPrintf_l、、 StringCchVPrintf_lExStringCchVPrintfEx 有限的错误检测
vsprintf vsprintf_s、、StringCbVPrintfStringCbVPrintf_lExStringCbVPrintf_lStringCbVPrintfExStringCchVPrintfStringCchVPrintf_lStringCchVPrintf_lEx、、 StringCchVPrintfExvasprintf 有限的错误检测
vswprintf vswprintf_s
wcscat wcscat_s、、StringCbCatStringCbCatExStringCchCatStringCchCatExwcslcat 有限的错误检测
wcscpy wcscpy_s、、StringCbCopyStringCbCopyExStringCchCopyStringCchCopyExwcslcpy 无边界检查
wcsncat wcsncat_s, wcslcat 有限的错误检测
wcsncpy wcsncpy_s、、StringCbCopyNStringCbCopyNExStringCchCopyNStringCchCopyNExwcslcpy 有限的错误检测
wnsprintf StringCbPrintf、、StringCbPrintf_lStringCbPrintf_lExStringCbPrintfExStringCchPrintfStringCchPrintfEx 无 NULL 终止
wnsprintfA StringCbPrintf、、StringCbPrintf_lStringCbPrintf_lExStringCbPrintfExStringCchPrintfStringCchPrintfEx 无 NULL 终止
wsprintf StringCbPrintf、、StringCbPrintf_lStringCbPrintf_lExStringCbPrintfExStringCchPrintfStringCchPrintfEx 无 NULL 终止
wsprintfA StringCbPrintf、、StringCbPrintf_lStringCbPrintf_lExStringCbPrintfExStringCchPrintfStringCchPrintfEx 无 NULL 终止
wsprintfW StringCbPrintf、、StringCbPrintf_lStringCbPrintf_lExStringCbPrintfExStringCchPrintfStringCchPrintfEx 无 NULL 终止
wvnsprintf StringCbVPrintf、、StringCbVPrintf_lStringCbVPrintf_lExStringCbVPrintfExStringCchVPrintfStringCchVPrintf_l、、 StringCchVPrintf_lExStringCchVPrintfEx 无 NULL 终止
wvnsprintfA StringCbVPrintf、、StringCbVPrintf_lStringCbVPrintf_lExStringCbVPrintfExStringCchVPrintfStringCchVPrintf_l、、 StringCchVPrintf_lExStringCchVPrintfEx 无 NULL 终止
wvnsprintfW StringCbVPrintf、、StringCbVPrintf_lStringCbVPrintf_lExStringCbVPrintfExStringCchVPrintfStringCchVPrintf_l、、 StringCchVPrintf_lExStringCchVPrintfEx 无 NULL 终止
wvsprintf StringCbVPrintf、、StringCbVPrintf_lStringCbVPrintf_lExStringCbVPrintfExStringCchVPrintfStringCchVPrintf_l、、 StringCchVPrintf_lExStringCchVPrintfEx 无 NULL 终止
wvsprintfA StringCbVPrintf、、StringCbVPrintf_lStringCbVPrintf_lExStringCbVPrintfExStringCchVPrintfStringCchVPrintf_l、、 StringCchVPrintf_lExStringCchVPrintfEx 无 NULL 终止
wvsprintfW StringCbVPrintf、、StringCbVPrintf_lStringCbVPrintf_lExStringCbVPrintfExStringCchVPrintfStringCchVPrintf_l、、 StringCchVPrintf_lExStringCchVPrintfEx 无 NULL 终止