警告 C6053

调用 'function' 可能生成非零结尾的字符串 'variable'。

备注

此警告指示指定函数的调用方式可能导致生成的字符串不以零结尾。 此缺陷可能会导致可利用的缓冲区溢出或崩溃。 如果带批注的函数接受以 null 结尾的字符串,但传递非 null 终止字符串,则也会生成此警告。

大多数 C 标准库和 Win32 字符串处理函数都需要并生成以零结尾的字符串。 一些“计数字符串”函数(包括 strncpywcsncpy_mbsncpy_snprintfsnwprintf)在完全填充缓冲区时不会生成以零结尾的字符串。 在这种情况下,后续调用预期生成以零结尾字符串的字符串函数时,会超出期望以零结尾的缓冲区的末端。 程序应确保字符串以零结尾。 一般来说,应向“计数字符串”函数传递小于缓冲区大小的长度,然后将零显式赋给缓冲区中的最后一个字符。

代码分析名称: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);
}

启发

有时,会针对实践中已保证安全的某些惯例报告此警告。 由于此缺陷的出现频率和潜在后果,分析工具偏向于查找潜在问题,而不是一贯偏向于减少干扰。

另请参阅