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