Advertencia C6053

Es posible que la llamada a "function" no sea una cadena de terminación cero "variable".

Comentarios

Esta advertencia indica que se ha llamado a la función especificada de tal forma que la cadena resultante podría no terminar en cero. Este defecto puede provocar una saturación o bloqueo del búfer que supone una vulnerabilidad de seguridad. Esta advertencia también se genera si una función anotada espera una cadena terminada en NULL, pero se pasa una cadena no terminada en NULL.

La mayoría de las funciones de control de cadenas estándar de Win32 y de la biblioteca estándar de C requieren y generan cadenas terminadas en cero. Algunas funciones de "cadena con recuento" (incluidas strncpy, wcsncpy, _mbsncpy, _snprintfy snwprintf) no generan cadenas terminadas en cero si rellenan exactamente su búfer. En ese caso, una llamada posterior a una función de cadena que espera una cadena terminada en cero irá más allá del final del búfer buscando el cero. El programa debe asegurarse de que la cadena pasada termina en cero. En general, debe pasar una longitud a la función de "cadena contada" que sea menor que el tamaño del búfer y, después, asignar explícitamente cero al último carácter del búfer.

Nombre del análisis de código: MISSING_ZERO_TERMINATION1

Ejemplos

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, termine la cadena en cero, como se muestra en el código de ejemplo siguiente:

#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 segura de cadenas:

#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);
}

Heurística

Esta advertencia se notifica a veces en ciertas expresiones garantizadas para ser seguras en la práctica. Dadas la frecuencia y las posibles consecuencias de este defecto, la herramienta de análisis tiene un sesgo, lo que ayuda a encontrar posibles problemas, en lugar de su sesgo típico de reducir el ruido.

Consulte también