Aviso C6059
Parâmetro de comprimento incorreto na chamada para 'função'. Passe o número de caracteres restantes, não o tamanho do buffer de 'variável'.
Comentários
Esse aviso indica que uma chamada para uma função de concatenação de cadeias de caracteres provavelmente está passando um valor incorreto para o número de caracteres a serem concatenados. Esse defeito pode causar uma saturação ou falha de buffer explorável. Uma causa comum desse defeito é passar o tamanho do buffer (em vez do número restante de caracteres no buffer) para a função de manipulação de cadeia de caracteres.
Esse aviso ajuda a identificar o erro comum de enviar o tamanho do buffer de destino em vez do tamanho dos dados. Ele faz isso detectando quando o tamanho usado para alocar o buffer é passado, inalterado, para a função que coloca dados no buffer.
Nome da análise de código: BAD_CONCATENATION
Exemplo
O código a seguir gera o aviso 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 ...
}
Para corrigir esse aviso, use o número correto de caracteres para concatenar conforme mostrado no código a seguir:
#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 ...
}
Para corrigir esse aviso usando as funções strncpy_s
de manipulação de cadeia de caracteres segura e strncat_s
, consulte o seguinte código:
#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;
}
Heurística
Essa análise detecta quando o tamanho do buffer de destino é passado sem modificações para o parâmetro length da função de manipulação de cadeia de caracteres. Esse aviso não será dado se algum outro valor for passado como o parâmetro length, mesmo que esse valor esteja incorreto.
Considere o seguinte código que gera aviso 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 ...
}
O aviso desaparece alterando o argumento para strncat
MAX - 1
, mesmo que o MAX
cálculo do comprimento ainda esteja incorreto.
#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 ...
}