C6053
Aviso C6053: telefonar para <função>pode não zero-rescindir seqüência <variável>
Este aviso indica que a função especificada foi chamada de forma que a seqüência de caracteres resultante pode não ser terminada em zero.Esse defeito pode causar uma saturação de buffer explorável ou falhar.Esse aviso também será gerado se uma função com anotações espera uma seqüência de caracteres terminada nula — usando NullTerminated propriedade na sua Pre condição — é uma seqüência de caracteres que não é nula passado terminada.
A maioria dos biblioteca C padrão e funções de manipulação de seqüência de caracteres do Win32 exigem e produzem cadeias de caracteres terminada em zero.Algumas funções 'seqüência de caracteres contadas' (inclusive strncpy, wcsncpy, _mbsncpy, _snprintf, e snwprintf) não produzem cadeias de caracteres terminada em zero se eles exatamente preencher o buffer. Nesse caso, uma telefonar subseqüente para uma função de cadeia de caracteres que espera uma seqüência de caracteres terminada em zero será vão além do participante do buffer procurando o zero.O programa deve se certificar de que a seqüência de caracteres termina com um zero.Em geral, uma abordagem útil é passar um comprimento para a função 'seqüência de caracteres contadas' uma menor do que o dimensionar do buffer e, em seguida, atribuir explicitamente zero para o ú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, zero-encerre a seqüência de caracteres, sistema autônomo mostra o 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);
}
Exemplo de código a seguir corrige esse aviso usando a manipulação de seqüência segura strncpy_s função:
#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);
}
O código a seguir usa a anotação para gerar aviso 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
}
Observe que esse aviso às vezes é relatado em determinados idiomas garantidos de segurança na sessão prática.Por causa de freqüência e possíveis conseqüências desse defeito, a ferramenta de análise é baseada em favor de encontrar problemas em potencial em vez de sua influência típico de redução de Ruídos.
Consulte também
Conceitos
Referência
strncpy_s _strncpy_s_l wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l