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 - 1
strncat
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 ...
}