Advertencia C6059

Parámetro de longitud incorrecto en la llamada a "function". Pase el número de caracteres restantes, no el tamaño del búfer de "variable".

Comentarios

Esta advertencia indica que una llamada a una función de concatenación de cadenas probablemente pasa un valor incorrecto para el número de caracteres que se van a concatenar. Este defecto puede provocar una saturación o bloqueo del búfer que supone una vulnerabilidad de seguridad. Una causa común de este defecto es pasar el tamaño del búfer (en lugar del número restante de caracteres del búfer) a la función de manipulación de cadenas.

Esta advertencia ayuda a identificar el error común de enviar el tamaño del búfer de destino en lugar del tamaño de los datos. Para ello, detecta cuándo se pasa el tamaño utilizado para asignar el búfer, sin cambios, a la función que coloca los datos en el búfer.

Nombre del análisis de código: BAD_CONCATENATION

Ejemplo

El código siguiente genera la advertencia 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 corregir esta advertencia, use el número correcto de caracteres para concatenar, como se muestra en el código siguiente:

#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 corregir esta advertencia mediante las funciones strncpy_s de manipulación de cadenas seguras y strncat_s, vea el código siguiente:

#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

Este análisis detecta cuándo se pasa el tamaño del búfer de destino sin modificar al parámetro length de la función de manipulación de cadenas. Esta advertencia no se da si se pasa algún otro valor como parámetro de longitud, aunque ese valor sea incorrecto.

Tenga en cuenta el código siguiente que genera la advertencia 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 ...
}

La advertencia desaparece cambiando el MAX argumento a strncatMAX - 1, aunque el cálculo de longitud sigue siendo incorrecto.

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

Consulte también