Предупреждение 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 ...
}