警告 C6059

'function' 调用中的长度参数不正确。 传递剩余字符数,而不是 'variable' 的缓冲区大小。

备注

此警告表明,对字符串串联函数的调用可能传递了一个不正确的值,此值表示要连接的字符数。 此缺陷可能会导致可利用的缓冲区溢出或崩溃。 此缺陷的一个常见原因是将缓冲区大小而不是缓冲区中剩余的字符数传递给字符串操作函数。

此警告有助于识别发送目标缓冲区大小而不是数据大小的常见错误。 它通过检测用于分配缓冲区的大小何时传递给将数据放入缓冲区的函数(未更改)来执行此操作。

代码分析名称:BAD_CONCATENATION

示例

下面的代码生成警告 C6059:

#include <string.h>
#define MAX 25

void f( )
{
  char szTarget[MAX];
  const char *szState ="Washington";
  const char *szCity="Redmond, ";

  strncpy(szTarget, szCity, MAX);
  szTarget[MAX -1] = '\0';
  strncat(szTarget, szState, MAX); // wrong size
  // code ...
}

要更正此警告,请使用正确数量的字符进行串联,如以下代码所示:

#include <string.h>
#define MAX 25

void f( )
{
  char szTarget[MAX];
  const char *szState ="Washington";
  const char *szCity="Redmond, ";

  strncpy(szTarget, szCity, MAX);
  szTarget[MAX -1] = '\0';
  strncat(szTarget, szState, MAX - strlen(szTarget)); // correct size
  // code ...
}

要使用安全字符串操作函数 strncpy_sstrncat_s 更正此警告,请参阅以下代码:

#include <string.h>

void f( )
{
  const char *szState ="Washington";
  const char *szCity="Redmond, ";

  size_t nTargetSize = strlen(szState) + strlen(szCity) + 1;
  char *szTarget= new char[nTargetSize];

  strncpy_s(szTarget, nTargetSize, szCity, strlen(szCity));
  strncat_s(szTarget, nTargetSize, szState,
                    nTargetSize - strlen(szTarget));
  // code ...
  delete [] szTarget;
}

启发

此分析检测目标缓冲区大小何时未经修改地传递到字符串操作函数的长度参数中。 如果其他一些值作为长度参数传递,即使该值不正确,也不会给出此警告。

请考虑生成警告 C6059 的以下代码:

#include <string.h>
#define MAX 25

void f( )
{
  char szTarget[MAX];
  const char *szState ="Washington";
  const char *szCity="Redmond, ";

  strncpy(szTarget, szCity, MAX);
  szTarget[MAX -1] = '\0';
  strncat(szTarget, szState, MAX); // wrong size
  // code ...
}

通过将 MAX 参数更改为 strncat 更改为 MAX - 1,警告消失,即使长度计算仍然不正确。

#include <string.h>
#define MAX 25

void f( )
{
  char szTarget[MAX];
  const char *szState ="Washington";
  const char *szCity="Redmond, ";

  strncpy(szTarget, szCity, MAX);
  szTarget[MAX -1] = '\0';
  strncat(szTarget, szState, MAX - 1); // wrong size, but no warning
  // code ...
}

另请参阅