Warning C28719
Banned API Usage: function-name is insecure and has been marked deprecated.
This warning indicates that a function is being used that has been banned and has a more robust or secure replacement.
Remarks
A list of all banned functions covered by this error, why they are banned, and recommended replacements can be found after the following example.
Code analysis name: BANNED_API_USAGE
Example
The following code generates this warning:
void example_func(PSTR src)
{
char dst[100];
strcpy(dst, src);
}
This issue stems from the use of the unsafe function strcpy. strcpy does not check if the destination buffer is large enough to fit the source data. To fix this issue, we can use strcpy_s, C++11’s safer replacement to this function. strcpy_s has a third parameter (the size of the destination buffer) to ensure only that many bytes are copied. For example, the following code is safer:
void example_func(PSTR src)
{
char dst[100];
strcpy_s(dst, sizeof(dst), src);
}
Banned Functions
NOTE: This list is actively being updated and improved
Banned API | Replacement(s) | Rationale / Notes |
---|---|---|
_fstrcat |
StringCbCat , StringCbCatEx , StringCchCat , StringCchCatEx |
Legacy 16-bit far pointer implementation |
_fstrcpy |
StringCbCopy , StringCbCopyEx , StringCchCopy , StringCchCopyEx |
Legacy 16-bit far pointer implementation |
_fstrncat |
StringCbCatN , StringCbCatNEx , StringCchCatN , StringCchCatNEx |
Legacy 16-bit far pointer implementation |
_fstrncpy |
strncpy , wcsncpy |
Legacy 16-bit far pointer implementation |
_ftccat |
strcat , wcscat |
Legacy 16-bit far pointer implementation |
_ftccpy |
strcpy , wcscpy |
Legacy 16-bit far pointer implementation |
_ftcscat |
strcat , wcscat |
Legacy 16-bit far pointer implementation |
_ftcscpy |
strcpy , wcscpy |
Legacy 16-bit far pointer implementation |
_getts |
StringCbGets , StringCbGetsEx , StringCchGets , StringCchGetsEx , gets_s |
No size limit on data |
_gettws |
gets_s |
No size limit on data |
_getws |
_getws_s |
No size limit on data |
_mbccat |
strcat_s , StringCbCat , StringCbCatEx , StringCchCat , StringCchCatEx , strlcat |
No size limit on data |
_makepath |
_makepath_s |
No size limit on data |
_mbscat |
_mbscat_s |
|
_snprintf |
_snprintf_s |
Does not NULL-terminate |
_sntprintf |
StringCbPrintf , StringCbPrintf_l , StringCbPrintf_lEx , StringCbPrintfEx , StringCchPrintf , StringCchPrintfEx |
Does not NULL-terminate |
_sntscanf |
_snscanf_s |
No maximum length |
_snwprintf |
_snwprintf_s , StringCbPrintf , StringCbPrintf_l , StringCbPrintf_lEx , StringCbPrintfEx , StringCchPrintf , StringCchPrintfEx |
Does not NULL-terminate |
_splitpath |
_splitpath_s |
No bounds checking |
_stprintf |
StringCbPrintf , StringCbPrintf_l , StringCbPrintf_lEx , StringCbPrintfEx , StringCchPrintf , StringCchPrintfEx |
Limited error detection |
_stscanf |
sscanf_s (requires format string changes) |
No bounds checking |
_tccat |
strcat_s , StringCbCat , StringCbCatEx , StringCchCat , StringCchCatEx , strlcat |
No bounds checking |
_tccpy |
strcpy_s , StringCbCopy , StringCbCopyEx , StringCchCopy , StringCchCopyEx , strlcpy |
No bounds checking |
_tcscat |
StringCbCat , StringCbCatEx , StringCchCat , StringCchCatEx |
Limited error detection |
_tcscpy |
StringCbCopy , StringCbCopyEx , StringCchCopy , StringCchCopyEx |
Limited error detection |
_tcsncat |
StringCbLength , StringCchLength , UnalignedStringCbLength , UnalignedStringCchLength |
No maximum length |
_tcsncpy |
StringCbCopyN , StringCbCopyNEx , StringCchCopyN , StringCchCopyNEx |
Limited error detection |
_tmakepath |
_makepath_s |
No bounds checking |
_tscanf |
scanf_s |
No bounds checking for outputs |
_tsplitpath |
splitpath_s , wsplitpath_s |
No bounds checking |
_vsnprintf |
_vsnprintf_s , StringCchVPrintf , StringCchVPrintf_l , StringCchVPrintf_lEx , StringCchVPrintfEx |
Limited error detection |
_vsntprintf |
StringCbVPrintf , StringCbVPrintf_l , StringCbVPrintf_lEx , StringCbVPrintfEx , StringCchVPrintf , StringCchVPrintf_l , StringCchVPrintf_lEx , StringCchVPrintfEx |
Limited error detection |
_vsnwprintf |
_vsnwprintf_s , StringCbVPrintf , StringCbVPrintf_l , StringCbVPrintf_lEx , StringCbVPrintfEx |
Limited error detection |
_vstprintf |
StringCbVPrintf , StringCbVPrintf_l , StringCbVPrintf_lEx , StringCbVPrinfEx , StringCchVPrintf , StringCchVPrintf_l , StringCchVPrintf_lEx , StringCchVPrintfEx |
No maximum length |
_wmakepath |
_wmakepath_s |
No bounds checking |
_wsplitpath |
_wsplitpath_s |
No bounds checking |
OemToCharW |
WideCharToMultiByte |
No bounds checking |
StrCat |
StringCbCat , StringCbCatEx , StringCchCat , StringCchCatEx |
Limited error detection |
StrCatA |
StringCbCat , StringCbCatEx , StringCchCat , StringCchCatEx |
Limited error detection |
StrCatBuff |
StringCbCat , StringCbCatEx , StringCchCat , StringCchCatEx |
No NULL-termination |
StrCatBuffA |
StringCbCat , StringCbCatEx , StringCchCat , StringCchCatEx |
No NULL-termination |
StrCatBuffW |
StringCbCat , StringCbCatEx , StringCchCat , StringCchCatEx |
No NULL-termination |
StrCatChainW |
StringCbCatEx , StringCbCatNEx , StringCchCatEx , StringCchCatNEx |
No NULL-termination |
StrCatN |
StringCbCat , StringCbCatEx , StringCbCatN , StringCbCatNEx , StringCchCat , StringCchCatEx , StringCchCatN , StringCchCatNEx |
No bounds checking |
StrCatNA |
StringCbCat , StringCbCatEx , StringCbCatN , StringCbCatNEx , StringCchCat , StringCchCatEx , StringCchCatN , StringCchCatNEx |
No bounds checking |
StrCatNW |
StringCbCat , StringCbCatEx , StringCbCatN , StringCbCatNEx , StringCchCat , StringCchCatEx , StringCchCatN , StringCchCatNEx |
No bounds checking |
StrCatW |
StringCbCat , StringCbCatEx , StringCbCatN , StringCbCatNEx , StringCchCat , StringCchCatEx , StringCchCatN , StringCchCatNEx |
No bounds checking |
StrCpy |
StringCbCopy , StringCbCopyEx , StringCchCopy , StringCchCopyEx |
No bounds checking |
StrCpyA |
StringCbCopy , StringCbCopyEx , StringCchCopy , StringCchCopyEx |
No bounds checking |
StrCpyN |
StringCbCopy , StringCbCopyEx , StringCchCopy , StringCchCopyEx |
Does not NULL-terminate |
StrCpyNA |
StringCbCopy , StringCbCopyEx , StringCchCopy , StringCchCopyEx |
Does not NULL-terminate |
StrCpyNW |
StringCbCopy , StringCbCopyEx , StringCchCopy , StringCchCopyEx |
Limited error checking |
strcpyW |
StringCbCopy , StringCbCopyEx , StringCchCopy , StringCchCopyEx |
No bounds checking |
StrCpyW |
StringCbCopy , StringCbCopyEx , StringCchCopy , StringCchCopyEx |
No bounds checking |
StrNCat |
StringCbCatN , StringCbCatNEx , StringCchCatN , StringCchCatNEx |
Limited error detection |
StrNCatA |
StringCbCatN , StringCbCatNEx , StringCchCatN , StringCchCatNEx |
Limited error detection |
StrNCatW |
StringCbCatN , StringCbCatNEx , StringCchCatN , StringCchCatNEx |
Limited error detection |
StrNCpy |
StringCbCopy , StringCbCopyEx , StringCchCopy , StringCchCopyEx |
Does not NULL-terminate |
StrNCpyA |
StringCbCopy , StringCbCopyEx , StringCchCopy , StringCchCopyEx |
Does not NULL-terminate |
StrNCpyW |
StringCbCopy , StringCbCopyEx , StringCchCopy , StringCchCopyEx |
Does not NULL-terminate |
gets |
gets_s , fgets , StringCbGets , StringCbGetsEx , StringCchGets , StringCchGetsEx |
Limited error detection; deprecated by C11 standard |
lstrcat |
StringCbCat , StringCbCatEx , StringCchCat , StringCchCatEx |
Limited error detection |
lstrcatA |
StringCbCat , StringCbCatEx , StringCchCat , StringCchCatEx |
Limited error detection |
lstrcatn |
StringCbCat , StringCbCatEx , StringCchCat , StringCchCatEx |
Limited error detection |
lstrcatnA |
StringCbCat , StringCbCatEx , StringCchCat , StringCchCatEx |
Limited error detection |
lstrcatnW |
StringCbCat , StringCbCatEx , StringCchCat , StringCchCatEx |
Limited error detection |
lstrcatW |
StringCbCat , StringCbCatEx , StringCchCat , StringCchCatEx |
Limited error detection |
lstrcpy |
StringCbCopy , StringCbCopyEx , StringCchCopy , StringCchCopyEx |
No bounds checking |
lstrcpyA |
StringCbCopy , StringCbCopyEx , StringCchCopy , StringCchCopyEx |
No bounds checking |
lstrcpyn |
StringCbCopy , StringCbCopyEx , StringCchCopy , StringCchCopyEx |
Limited error detection |
lstrcpynA |
StringCbCopy , StringCbCopyEx , StringCchCopy , StringCchCopyEx |
Limited error detection |
lstrcpynW |
StringCbCopy , StringCbCopyEx , StringCchCopy , StringCchCopyEx |
No bounds checking |
lstrcpyW |
StringCbCopy , StringCbCopyEx , StringCchCopy , StringCchCopyEx |
No bounds checking |
snscanf |
sscanf_s |
No bounds checking |
snwscanf |
swscanf_s |
No bounds checking |
sprintf |
sprintf_s |
Limited error detection |
sprintfA |
sprintf_s |
No bounds checking |
sprintfW |
swprintf_s |
No bounds checking |
lstrncat |
StringCbCat , StringCbCatEx , StringCchCat , StringCchCatEx |
Limited error detection |
makepath |
||
nsprintf |
sprintf_s |
No error detection or bounds checking |
strcat |
strcat_s , StringCbCat , StringCbCatEx , StringCchCat , StringCchCatEx , strlcat |
Limited error detection |
strcatA |
strcat_s , StringCbCat , StringCbCatEx , StringCchCat , StringCchCatEx , strlcat |
Limited error detection |
strcatW |
strcat_s , StringCbCat , StringCbCatEx , StringCchCat , StringCchCatEx , strlcat |
Limited error detection |
strcpy |
strcpy_s , StringCbCopy , StringCbCopyEx , StringCchCopy , StringCchCopyEx , strlcpy |
No bounds checking |
strcpyA |
strcpy_s , StringCbCopy , StringCbCopyEx , StringCchCopy , StringCchCopyEx , strlcpy |
No bounds checking |
strncat |
strncat_s , StringCbCatN , StringCbCatNEx , StringCchCatN , StringCchCatNEx , strlcat |
Limited error detection |
strncpy |
strncpy_s , StringCbCopyN , StringCbCopyNEx , StringCchCopyN , StringCchCopyNEx , strlcpy |
Limited error detection |
swprintf |
swprintf_s StringCbPrintf , StringCbPrintf_l , StringCbPrintf_lEx , StringCbPrintf , StringCbPrintfEx |
Limited error detection |
ualstrcpyW |
strcpy_s , StringCbCopy , StringCbCopyEx , StringCchCopy , StringCchCopyEx , strlcpy |
No bounds checking |
vsnprintf |
vsnprintf_s , StringCbVPrintf , StringCbVPrintf_l , StringCbVPrintf_lEx , StringCbVPrintfEx , StringCchVPrintf , StringCchVPrintf_l , StringCchVPrintf_lEx , StringCchVPrintfEx |
Limited error detection |
vsprintf |
vsprintf_s , StringCbVPrintf , StringCbVPrintf_l , StringCbVPrintf_lEx , StringCbVPrintfEx , StringCchVPrintf , StringCchVPrintf_l , StringCchVPrintf_lEx , StringCchVPrintfEx , vasprintf |
Limited error detection |
vswprintf |
vswprintf_s |
|
wcscat |
wcscat_s , StringCbCat , StringCbCatEx , StringCchCat , StringCchCatEx , wcslcat |
Limited error detection |
wcscpy |
wcscpy_s , StringCbCopy , StringCbCopyEx , StringCchCopy , StringCchCopyEx , wcslcpy |
No bounds checking |
wcsncat |
wcsncat_s , wcslcat |
Limited error detection |
wcsncpy |
wcsncpy_s , StringCbCopyN , StringCbCopyNEx , StringCchCopyN , StringCchCopyNEx , wcslcpy |
Limited error detection |
wnsprintf |
StringCbPrintf , StringCbPrintf_l , StringCbPrintf_lEx , StringCbPrintfEx , StringCchPrintf , StringCchPrintfEx |
No NULL-termination |
wnsprintfA |
StringCbPrintf , StringCbPrintf_l , StringCbPrintf_lEx , StringCbPrintfEx , StringCchPrintf , StringCchPrintfEx |
No NULL-termination |
wsprintf |
StringCbPrintf , StringCbPrintf_l , StringCbPrintf_lEx , StringCbPrintfEx , StringCchPrintf , StringCchPrintfEx |
No NULL-termination |
wsprintfA |
StringCbPrintf , StringCbPrintf_l , StringCbPrintf_lEx , StringCbPrintfEx , StringCchPrintf , StringCchPrintfEx |
No NULL-termination |
wsprintfW |
StringCbPrintf , StringCbPrintf_l , StringCbPrintf_lEx , StringCbPrintfEx , StringCchPrintf , StringCchPrintfEx |
No NULL-termination |
wvnsprintf |
StringCbVPrintf , StringCbVPrintf_l , StringCbVPrintf_lEx , StringCbVPrintfEx , StringCchVPrintf , StringCchVPrintf_l , StringCchVPrintf_lEx , StringCchVPrintfEx |
No NULL-termination |
wvnsprintfA |
StringCbVPrintf , StringCbVPrintf_l , StringCbVPrintf_lEx , StringCbVPrintfEx , StringCchVPrintf , StringCchVPrintf_l , StringCchVPrintf_lEx , StringCchVPrintfEx |
No NULL-termination |
wvnsprintfW |
StringCbVPrintf , StringCbVPrintf_l , StringCbVPrintf_lEx , StringCbVPrintfEx , StringCchVPrintf , StringCchVPrintf_l , StringCchVPrintf_lEx , StringCchVPrintfEx |
No NULL-termination |
wvsprintf |
StringCbVPrintf , StringCbVPrintf_l , StringCbVPrintf_lEx , StringCbVPrintfEx , StringCchVPrintf , StringCchVPrintf_l , StringCchVPrintf_lEx , StringCchVPrintfEx |
No NULL-termination |
wvsprintfA |
StringCbVPrintf , StringCbVPrintf_l , StringCbVPrintf_lEx , StringCbVPrintfEx , StringCchVPrintf , StringCchVPrintf_l , StringCchVPrintf_lEx , StringCchVPrintfEx |
No NULL-termination |
wvsprintfW |
StringCbVPrintf , StringCbVPrintf_l , StringCbVPrintf_lEx , StringCbVPrintfEx , StringCchVPrintf , StringCchVPrintf_l , StringCchVPrintf_lEx , StringCchVPrintfEx |
No NULL-termination |