C6053

Actualización: noviembre 2007

C6053

Advertencia C6053: La llamada a <función> no puede tener una cadena <variable> terminada en cero

Esta advertencia indica que se ha llamado a la función especificada de tal manera que la cadena resultante puede no terminar en cero. Este defecto puede producir una saturación del búfer explotable o un bloqueo. Esta advertencia también se genera a una función anotada que espera una cadena finalizada con valor null (utilizando la propiedad NullTerminated en su condición Pre) se pasa una cadena no finalizada con valor null.

La mayoría de las funciones de tratamiento de cadenas de la biblioteca estándar de C y Win32 requieren y producen cadenas finalizadas por cero. Algunas funciones de "cadena contada" (entre ellas strncpy, wcsncpy, _mbsncpy, _snprintf y snwprintf) no producen cadenas finalizadas en cero si llenan exactamente su búfer correspondiente. En este caso, una llamada subsiguiente a una función de cadena que espere una cadena finalizada en cero sobrepasará el final del búfer buscando el cero. El programa debe asegurarse de que la cadena finaliza con un cero. En general, un enfoque útil consiste en pasar a la función de "cadena contada" una longitud igual al tamaño del búfer menos uno y, a continuación, asignar cero explícitamente al último carácter del búfer.

Ejemplo

El siguiente ejemplo de código genera esta advertencia:

#include <string.h>
#define MAX 15

size_t f( )
{
  char szDest[MAX];
  char *szSource="Hello, World!";

  strncpy(szDest, szSource, MAX);  
  return strlen(szDest); // possible crash here
}

Para corregir esta advertencia, finalice en cero la cadena como se muestra en el siguiente ejemplo de código:

#include <string.h>
#define MAX 15

size_t f( )
{
  char szDest[MAX];
  char *szSource="Hello, World!";

  strncpy(szDest, szSource, MAX-1);
  szDest[MAX-1]=0;
  return strlen(szDest);
}

El código de ejemplo siguiente corrige esta advertencia mediante la función strncpy_s de manipulación de cadenas de caracteres segura:

#include <string.h>
#define MAX 15

size_t f( )
{
  char szDest[MAX];
  char *szSource= "Hello, World!";

  strncpy_s(szDest, sizeof(szDest), szSource, strlen(szSource));  
  return strlen(szDest);
}

El código siguiente utiliza la anotación para generar la advertencia C6053:

#include<codeanalysis\sourceannotations.h>
using namespace vc_attributes;

void NotNullTerminatedStringReturned 
          (
           [Post(NullTerminated=No)] char* str
          )
{
  // code ...
}

void NullTerminatedStringRequired ([Pre(NullTerminated=Yes)] char* str)
{
  // code ...
}

void f (char* pC )
{
  NotNullTerminatedStringReturned(pC); //pC is not null terminated
  NullTerminatedStringRequired(pC); //requires null terminated pC
}

Debe tener en cuenta que a veces se informa de esta advertencia en ciertas expresiones que, en la práctica, se garantiza que son seguras. Debido a la frecuencia y las consecuencias potenciales de este defecto, la herramienta de análisis tiene tendencia a encontrar problemas potenciales, en lugar de la tendencia normal a reducir ruido.

Vea también

Conceptos

Información general sobre anotaciones

Referencia

NullTerminated

strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l