C6059
Ostrzeżenie C6059: nieprawidłowa długość parametru w wywołaniu <function>.Należy przekazać liczbę pozostałych znaków a nie rozmiar buforu dla <variable>
To ostrzeżenie wskazuje, że wywołanie funkcji łączenia ciągu, prawdopodobnie przekazuje niepoprawną wartość dla liczby znaków do złączenia.Wada może spowodować przepełnienie buforu lub awarię.Typową przyczyną tej wady jest przekazywanie rozmiaru buforu, zamiast pozostałej liczby znaków w buforze, do funkcji wykonującej operacje na ciągach.
Przykład
Poniższy kod generuje to ostrzeżenie:
#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 ...
}
Aby poprawić to ostrzeżenie, należy używać poprawnej liczby znaków do łączenia, jak pokazano w poniższym kodzie:
#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 ...
}
Aby poprawić to ostrzeżenie używając bezpiecznej funkcji do wykonywania operacji naciągach, zobacz następujący kod:
#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;
}
Zobacz też
Informacje
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