Partilhar via


Aviso C6053

A chamada para 'function' pode não ter terminado zero a cadeia de caracteres 'variable'.

Comentários

Esse aviso indica que a função especificada foi chamada de tal forma que a cadeia de caracteres resultante pode não ser terminada em zero. Esse defeito pode causar uma saturação ou falha de buffer explorável. Esse aviso também será gerado se uma função anotada esperar uma cadeia de caracteres terminada em nulo, mas você passar uma cadeia de caracteres terminada em não nulo.

A maioria das funções de manipulação de cadeias de caracteres de biblioteca padrão C e Win32 requerem e produzem cadeias de caracteres terminadas em zero. Algumas funções de "cadeia de caracteres contada" (incluindo strncpy, , , _snprintfwcsncpy_mbsncpye snwprintf) não produzem cadeias de caracteres terminadas em zero se preencherem exatamente seu buffer. Nesse caso, uma chamada subsequente para uma função de cadeia de caracteres que espera que uma cadeia de caracteres com término zero vá além do final do buffer procurando o zero. O programa deve garantir que a cadeia de caracteres termine com um zero. Em geral, você deve passar um comprimento para a função "cadeia de caracteres contada" menor que o tamanho do buffer e atribuir explicitamente zero ao último caractere no buffer.

Nome da análise de código: MISSING_ZERO_TERMINATION1

Exemplos

O código de exemplo a seguir gera este aviso:

#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 corrigir esse aviso, encerre a cadeia de caracteres zero, conforme mostrado no seguinte código de exemplo:

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

O código de exemplo a seguir corrige este aviso usando a função de manipulação strncpy_s de cadeia 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);
}

Heurística

Este aviso é por vezes relatado em certos idiomas garantidos como seguros na prática. Devido à frequência e às possíveis consequências desse defeito, a ferramenta de análise é tendenciosa em favor de encontrar possíveis problemas em vez de seu viés típico de redução de ruído.

Confira também