Поделиться через


Предупреждение C6059

Неправильный параметр длины при вызове функции. Передайте количество оставшихся символов, а не размер буфера переменной.

Замечания

Это предупреждение указывает, что вызов функции объединения строк, вероятно, передает неверное значение для количества символов для объединения. Этот дефект может вызвать переполнение или сбой буфера эксплойтов. Распространенная причина этого дефекта заключается в передаче размера буфера (вместо оставшегося числа символов в буфере) в функцию обработки строк.

Это предупреждение помогает определить общую ошибку отправки размера целевого буфера вместо размера данных. Это делается путем определения того, когда размер, используемый для выделения буфера, передается без изменений в функцию, помещая данные в буфер.

Имя анализа кода: 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_s безопасной обработки строк, strncat_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 ...
}

См. также