警告 C6053
调用 'function' 可能生成非零结尾的字符串 'variable'。
备注
此警告指示指定函数的调用方式可能导致生成的字符串不以零结尾。 此缺陷可能会导致可利用的缓冲区溢出或崩溃。 如果带批注的函数接受以 null 结尾的字符串,但传递非 null 终止字符串,则也会生成此警告。
大多数 C 标准库和 Win32 字符串处理函数都需要并生成以零结尾的字符串。 一些“计数字符串”函数(包括 strncpy
、wcsncpy
、_mbsncpy
、_snprintf
和 snwprintf
)在完全填充缓冲区时不会生成以零结尾的字符串。 在这种情况下,后续调用预期生成以零结尾字符串的字符串函数时,会超出期望以零结尾的缓冲区的末端。 程序应确保字符串以零结尾。 一般来说,应向“计数字符串”函数传递小于缓冲区大小的长度,然后将零显式赋给缓冲区中的最后一个字符。
代码分析名称:MISSING_ZERO_TERMINATION1
示例
以下示例代码将生成此警告:
#include <string.h>
#define MAX 15
size_t f( )
{
char szDest[MAX];
char *szSource="Hello, World!";
strncpy(szDest, szSource, MAX);
return strlen(szDest); // possible crash here
}
若要更正此警告,请以零结束字符串,如以下示例代码所示:
#include <string.h>
#define MAX 15
size_t f( )
{
char szDest[MAX];
char *szSource="Hello, World!";
strncpy(szDest, szSource, MAX-1);
szDest[MAX-1]=0;
return strlen(szDest);
}
以下示例代码使用安全的字符串操作 strncpy_s
函数来更正此警告:
#include <string.h>
#define MAX 15
size_t f( )
{
char szDest[MAX];
char *szSource= "Hello, World!";
strncpy_s(szDest, sizeof(szDest), szSource, strlen(szSource));
return strlen(szDest);
}
启发
有时,会针对实践中已保证安全的某些惯例报告此警告。 由于此缺陷的出现频率和潜在后果,分析工具偏向于查找潜在问题,而不是一贯偏向于减少干扰。