Partilhar via


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 strncatMAX - 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 ...
}

Confira também