Condividi tramite


C6059

Aggiornamento: novembre 2007

C6059

avviso C6059: Parametro di lunghezza errata nella chiamata a <funzione>. Passare il numero di caratteri rimanenti, non la dimensione del buffer di <variabile>

L'avviso indica che è probabile che una chiamata a una funzione di concatenazione di stringhe stia passando un valore non corretto per il numero di caratteri da concatenare. Questo problema potrebbe provocare un arresto anomalo o un sovraccarico del buffer. Una causa diffusa di errore è il passaggio della dimensione del buffer invece del numero di caratteri rimasti nel buffer alla funzione di modifica delle stringhe.

Esempio

Il codice seguente genera questo avviso:

#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 ...                                 
}

Per risolvere il problema, utilizzare il numero corretto di caratteri da concatenare, come illustrato nel codice riportato di seguito.

#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 ...                                 
}

Per risolvere il problema utilizzando la funzione di modifica delle stringhe protetta, vedere il codice riportato di seguito.

#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;
}

Vedere anche

Riferimenti

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