Upozornění C6053
Volání funkce nesmí řetězec "variable" ukončit nula.
Poznámky
Toto upozornění označuje, že zadaná funkce byla volána takovým způsobem, že výsledný řetězec nemusí být ukončen nulou. Tato chyba může způsobit zneužitelné přetečení vyrovnávací paměti nebo chybové ukončení. Toto upozornění se také vygeneruje, pokud funkce s poznámkami očekává řetězec ukončený hodnotou null, ale předáte řetězec, který není ukončený hodnotou null.
Většina standardní knihovny jazyka C a funkcí zpracování řetězců Win32 vyžaduje a vytváří řetězce s nulovým ukončením. Několik funkcí počítaného řetězce (včetně strncpy
, wcsncpy
, _mbsncpy
, _snprintf
a snwprintf
) nevytvářejí řetězce s nulovým ukončením, pokud přesně vyplní vyrovnávací paměť. V tomto případě následné volání řetězcové funkce, která očekává, že řetězec ukončený nulou překročí konec vyrovnávací paměti a hledá nulu. Program by se měl ujistit, že řetězec končí nulou. Obecně platí, že byste měli funkci counted string předat jednu menší než velikost vyrovnávací paměti a pak explicitně přiřadit nulu poslednímu znaku v vyrovnávací paměti.
Název analýzy kódu: MISSING_ZERO_TERMINATION1
Příklady
Následující ukázkový kód vygeneruje toto upozornění:
#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
}
Chcete-li toto upozornění opravit, ukončete řetězec nulovým ukončením, jak je znázorněno v následujícím vzorovém kódu:
#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);
}
Následující ukázkový kód opraví toto upozornění pomocí funkce bezpečné manipulace s řetězci 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);
}
Heuristika
Toto upozornění je někdy hlášeno u určitých idiomů, které jsou v praxi bezpečné. Vzhledem k četnosti a potenciálním důsledkům této chyby je analytický nástroj zkreslený ve prospěch hledání potenciálních problémů místo jeho typické předsudky snížení šumu.