C6053C6053

Ostrzeżenie C6053: wywołanie metody <function> nie może kończyć się ciągiem zero <variable>warning C6053: call to <function> may not zero-terminate string <variable>

To ostrzeżenie wskazuje, że określona funkcja została wywołana w taki sposób, że otrzymany ciąg może nie być zakończony zerem.This warning indicates that the specified function has been called in such a way that the resulting string might not be zero-terminated. Usterka może spowodować przepełnienie buforu lub awarię.This defect might cause an exploitable buffer overrun or crash. To ostrzeżenie jest również generowane, jeśli funkcja z adnotacją oczekuje, że ciąg zakończony znakiem null jest przekazaniem ciągu, który nie jest zakończony znakiem null.This warning is also generated if an annotated function expects a null terminated string is passed a string that is not null terminated.

Większość funkcji obsługi ciągów standardowych C i Win32 wymaga i tworzy ciągi zakończone zerem.Most C standard library and Win32 string handling functions require and produce zero-terminated strings. Niektóre funkcje "zliczane ciąg" (w tym strncpy , wcsncpy , _mbsncpy , _snprintf i snwprintf ) nie generują ciągów zakończonych zerem, jeśli dokładnie wypełniają swój bufor.A few 'counted string' functions (including strncpy, wcsncpy, _mbsncpy, _snprintf, and snwprintf) do not produce zero-terminated strings if they exactly fill their buffer. W takim przypadku kolejne wywołanie funkcji String, która oczekuje, że ciąg zakończony zerem zostanie przekroczenia końca buforu szukanego przez zero.In this case, a subsequent call to a string function that expects a zero-terminated string will go beyond the end of the buffer looking for the zero. Program powinien upewnić się, że ciąg ma wartość zero.The program should make sure that the string ends with a zero. Ogólnie rzecz biorąc, należy przekazać długość do funkcji "zliczane ciąg", która jest mniejsza niż rozmiar buforu, a następnie jawnie przypisać zero do ostatniego znaku w buforze.In general, you should pass a length to the 'counted string' function one smaller than the size of the buffer and then explicitly assign zero to the last character in the buffer.

PrzykładyExamples

Następujący przykładowy kod generuje to ostrzeżenie:The following sample code generates this warning:


#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ć zero ciągu, jak pokazano w poniższym przykładowym kodzie:To correct this warning, zero-terminate the string as shown in the following sample code:


#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 koryguje to ostrzeżenie przy użyciu bezpiecznej funkcji manipulowania ciągami strncpy_s :The following sample code corrects this warning using safe string manipulation strncpy_s function:


#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 na niektórych idiomy, które mają być bezpieczne w dobrej kondycji.You should note that this warning is sometimes reported on certain idioms guaranteed to be safe in practice. Ze względu na częstotliwość i potencjalne konsekwencje tej wady narzędzie do analizy jest rozliczane na rzecz znajdowania potencjalnych problemów, a nie typowego obniżenia szumów.Because of the frequency and potential consequences of this defect, the analysis tool is biased in favor of finding potential issues instead of its typical bias of reducing noise.

Zobacz teżSee also