Condividi tramite


Avviso C6059

Parametro di lunghezza non corretto nella chiamata a 'function'. Passare il numero di caratteri rimanenti, non la dimensione del buffer di 'variable'.

Osservazioni:

Questo avviso indica che una chiamata a una funzione di concatenazione di stringhe sta probabilmente passando un valore non corretto per il numero di caratteri da concatenare. Questo difetto può causare un sovraccarico o un arresto anomalo del buffer sfruttabile. Una causa comune di questo difetto consiste nel passare la dimensione del buffer (anziché il numero di caratteri rimanenti nel buffer) alla funzione di manipolazione delle stringhe.

Questo avviso consente di identificare l'errore comune di inviare le dimensioni del buffer di destinazione anziché le dimensioni dei dati. Lo fa rilevando quando le dimensioni usate per allocare il buffer vengono passate, invariate, alla funzione che inserisce i dati nel buffer.

Nome dell'analisi del codice: BAD_CONCATENATION

Esempio

Il codice seguente genera l'avviso C6059:

#include <string.h>
#define MAX 25

void f( )
{
  char szTarget[MAX];
  const char *szState ="Washington";
  const char *szCity="Redmond, ";

  strncpy(szTarget, szCity, MAX);
  szTarget[MAX -1] = '\0';
  strncat(szTarget, szState, MAX); // wrong size
  // code ...
}

Per correggere l'avviso, usare il numero corretto di caratteri per concatenare come illustrato nel codice seguente:

#include <string.h>
#define MAX 25

void f( )
{
  char szTarget[MAX];
  const char *szState ="Washington";
  const char *szCity="Redmond, ";

  strncpy(szTarget, szCity, MAX);
  szTarget[MAX -1] = '\0';
  strncat(szTarget, szState, MAX - strlen(szTarget)); // correct size
  // code ...
}

Per correggere questo avviso usando le funzioni strncpy_s di manipolazione delle stringhe sicure e strncat_s, vedere il codice seguente:

#include <string.h>

void f( )
{
  const char *szState ="Washington";
  const 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;
}

Euristica

Questa analisi rileva quando la dimensione del buffer di destinazione viene passata non modificata nel parametro length della funzione di manipolazione delle stringhe. Questo avviso non viene specificato se un altro valore viene passato come parametro di lunghezza, anche se tale valore non è corretto.

Si consideri il codice seguente che genera l'avviso C6059:

#include <string.h>
#define MAX 25

void f( )
{
  char szTarget[MAX];
  const char *szState ="Washington";
  const char *szCity="Redmond, ";

  strncpy(szTarget, szCity, MAX);
  szTarget[MAX -1] = '\0';
  strncat(szTarget, szState, MAX); // wrong size
  // code ...
}

L'avviso viene eliminato modificando l'argomento MAX in MAX - 1strncat in , anche se il calcolo della lunghezza non è ancora corretto.

#include <string.h>
#define MAX 25

void f( )
{
  char szTarget[MAX];
  const char *szState ="Washington";
  const char *szCity="Redmond, ";

  strncpy(szTarget, szCity, MAX);
  szTarget[MAX -1] = '\0';
  strncat(szTarget, szState, MAX - 1); // wrong size, but no warning
  // code ...
}

Vedi anche