Compartilhar via


C6053

Aviso C6053: a chamada para a <função> não pode terminar com cadeia de caracteres zero <variável>

Esse aviso indicar que a função especificada esteve chamada de tal modo que a cadeia de caracteres resultante talvez não zero ser encerrada.Este defeito pode causar uma explorável excesso de buffer ou falhar.Esse aviso também é gerado se uma função anotada espera que uma cadeia de caracteres de caracteres é passada uma cadeia de caracteres que não seja nula encerrada.

Funções de manipulação a maioria biblioteca de 2.0 C e de cadeia de caracteres padrão do Win32 necessários e gerenciar cadeias de caracteres zero terminadas.Alguns “as funções de cadeia de caracteres contada” (inclusive strncpy, wcsncpy, _mbsncpy, _snprintf, e snwprintf) não gerenciar cadeias de caracteres zero encerradas se forem preenchidos exatamente o buffer.Nesse caso, uma chamada subsequente a uma função de cadeia de caracteres que aguarda uma cadeia de caracteres terminada zero passará de extremidade do buffer que procura nulo.O programa deve ter certeza de que a cadeia de caracteres termina com um valor nulo.Em geral, você deve transmitir um comprimento “à função de uma cadeia de caracteres contada” menor que o tamanho do buffer e depois atribuir explicitamente zero ao último caractere no buffer.

Exemplo

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, sem finalizar a cadeia de caracteres conforme mostrado no código de exemplo a seguir:

#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 esse aviso usando a função seguro de strncpy_s de manipulação de cadeia de caracteres:

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

Você deve observar que esse aviso é relatado às vezes em determinados idioma certamente seguro na prática.Devido às consequências de frequência e o potencial desse defeito, a ferramenta de análise é inclinada em favor de encontrar problemas potenciais em vez da diferença típica de reduzir o ruído.

Consulte também

Referência

strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l

Outros recursos

Visão geral de anotação

NullTerminated