Udostępnij za pośrednictwem


C6053

Ostrzeżenie C6053: wywołanie <function> może nie zakończyć zerem ciągu <variable>

To ostrzeżenie wskazuje, że określona funkcja została wywołana w taki sposób, że wynikowy ciąg nie może być zakończony zerem.Wada ta może spowodować przepełnienie buforu lub awarię.To ostrzeżenie jest również generowane jeśli adnotowana funkcja spodziewa się ciągu zakończonego wartością null, a został przekazany ciąg, który nie jest zakończony wartością null.

Większość standardowych biblioteki języka C i funkcji obsługi ciągów Win32 wymaga i produkuje ciągi zakończone zerem.Kilka funkcji "zliczania ciągu" (łącznie z strncpy, wcsncpy, _mbsncpy, _snprintf, i snwprintf) nie wytwarza ciągów zakończonych zerem, jeśli dokładnie wypełniają one ich bufor.W tym przypadku kolejne wywołania funkcji ciągu, która oczekuj ciągu zakończonego zerem będą wykraczać poza koniec buforu w poszukiwaniu zera.Program powinien upewnić się, że ciąg kończy się zerem.Ogólnie rzecz biorąc do funkcji "zliczania ciągu" należy przekazywać długość o jedną mniejszą od rozmiaru buforu i jawnie przypisać zero do ostatniego znaku w buforze.

Przykład

Poniższy przykładowy kod generuje to ostrzeżenie:

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

Aby poprawić to ostrzeżenie, należy zakończyć ciąg zerem tak jak pokazano w poniższym przykładowym kodzie:

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

Następujący przykładowy kod naprawia to ostrzeżenie używając bezpiecznej funkcji wykonywania operacji na ciągach strncpy_s:

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

Należy zauważyć, że to ostrzeżenie jest czasami raportowane w niektórych idiomach, dla których istnieje gwarancja, że są w praktyce bezpieczne.Przez częstotliwość i potencjalne konsekwencje tej wady narzędzie analizy jest obciążone przez znajdowanie potencjalnych problemów, zamiast typowego obciążenia zmniejszania hałasu.

Zobacz też

Informacje

strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l

Inne zasoby

Omówienie adnotacji

NullTerminated