C6059
upozornění C6059: parametr nesprávné délky ve volání funkce <funkce>.Předávejte počet zbývajících znaků, nikoli velikost vyrovnávací paměti proměnné <proměnná>
Toto upozornění znamená, že volání funkce pro zřetězení řetězců pravděpodobně předává nesprávnou hodnotu počtu znaků ke zřetězení.Tato vada může způsobit zneužitelný přeběh vyrovnávací paměti nebo zhroucení.Obvyklou příčinou této vady je předávání velikosti vyrovnávací paměti (namísto zbývajícího počtu znaků v ní) do funkce pro práci s řetězcem.
Příklad
Následující kód generuje toto upozornění:
#include <string.h>
#define MAX 25
void f( )
{
char szTarget[MAX];
char *szState ="Washington";
char *szCity="Redmond, ";
strncpy(szTarget,szCity, MAX);
szTarget[MAX -1] = '\0';
strncat(szTarget, szState, MAX); //wrong size
// code ...
}
Chcete-li napravit toto upozornění, použijte správný počet znaků ke zřetězení, jak je ukázáno v následujícím kódu:
#include <string.h>
#define MAX 25
void f( )
{
char szTarget[MAX];
char *szState ="Washington";
char *szCity="Redmond, ";
strncpy(szTarget,szCity, MAX);
szTarget[MAX -1] = '\0';
strncat(szTarget, szState, MAX - strlen(szTarget)); // correct size
// code ...
}
Pro nápravu tohoto upozornění použitím bezpečné funkce pro práci s řetězci si prohlédněte následující kód:
#include <string.h>
void f( )
{
char *szState ="Washington";
char *szCity="Redmond, ";
size_t nTargetSize = strlen(szState) + strlen(szCity) + 1;
char *szTarget= new char[nTargetSize];
strncpy_s(szTarget, nTargetSize, szCity,strlen(szCity));
strncat_s(szTarget, nTargetSize, szState,
nTargetSize - strlen(szTarget));
// code ...
delete [] szTarget;
}
Viz také
Referenční dokumentace
strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l
strncat_s, _strncat_s_l, wcsncat_s, _wcsncat_s_l, _mbsncat_s, _mbsncat_s_l