Compartilhar via


C6053

Aviso C6053: chamada para <function> pode não zero-encerrar a seqüência de caracteres <variable>.

Este aviso indica que a função especificada foi chamada de tal forma que a string resultante pode não ser terminada em zero. Esse defeito pode causar uma saturação de buffer explorável ou falha. Esse aviso também é gerado se uma função anotada espera uma seqüência de terminação nula — usando NullTerminated propriedade no seu Pre condição — é passado a uma seqüência de caracteres que não seja nula finalizada.

Mais biblioteca padrão c e funções de manipulação de seqüência de caracteres do Win32 exigem e produzem seqüências de caracteres terminada em zero. Alguns 'contados string' funções (incluindo strncpy, wcsncpy, _mbsncpy, _snprintf, e snwprintf) não produzem seqüências de caracteres terminada em zero se eles exatamente preenchem seus buffer. Nesse caso, uma chamada subseqüente para uma função de seqüência de caracteres que espera uma seqüência de caracteres terminada em zero irá além do final 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 'contado string' funcionar com um menor que o tamanho do buffer e atribuir explicitamente zero para o último caractere no buffer.

Exemplo

O exemplo de código 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, conforme mostrado no exemplo de código 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 exemplo de código a seguir corrige esse aviso usando a manipulação de cadeia de caracteres seguras 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 um 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
}

Você deve observar que esse aviso às vezes é relatado em determinados idiomas, a garantia de estar seguros em prática. Devido a freqüência e as possíveis conseqüências deste defeito, a ferramenta de análise é polarizada em favor de encontrar problemas em potencial em vez de seus bias típico de redução de ruído.

Consulte também

Referência

NullTerminated

strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l

Conceitos

Visão geral de anotação