Udostępnij za pośrednictwem


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