C6209
Aggiornamento: novembre 2007
C6209
avviso C6209: utilizzo di 'sizeof<variabile1>' come parametro <numero> nella chiamata a <funzione> dove <variabile2> potrebbe essere una matrice di caratteri di tipo "wide". Si intendeva utilizzare il conteggio di caratteri invece del conteggio di byte?
L'avviso indica che un parametro a una chiamata a funzione potrebbe erroneamente essere un conteggio di byte invece che un conteggio di caratteri. In tal caso, l'errore potrebbe causare un arresto anomalo o un danneggiamento, anche se in alcune situazioni è possibile che si verifichi un problema di protezione.
Una causa comune dell'errore è l'utilizzo di sizeof su una matrice di caratteri. L'operatore sizeof calcola sempre il numero di byte. Per i caratteri ANSI, il numero dei byte è uguale al numero di caratteri, mentre per Unicode è doppio rispetto al numero dei caratteri.
Generalmente è consigliabile calcolare il numero di elementi di una matrice dividendo la dimensione della matrice per la dimensione di ciascun elemento.
L'avviso viene generato quando:
Una variabile viene passata come parametro e sizeof della variabile viene passato come altro parametro.
Sia il tipo di variabile che il tipo di parametro formale sono varietà di puntatore-a-carattere di tipo "wide".
Esempio
Nell'esempio di codice riportato di seguito l'avviso viene generato quando sizeofpC viene passato alla funzione my_wcsncpy:
#include<windows.h>
extern void my_wcsncpy(wchar_t *, wchar_t *, size_t);
void f( )
{
WCHAR pC[15];
wchar_t* input = L"Hello, World!";
my_wcsncpy(pC, input, sizeof pC);
// code ...
}
Per risolvere il problema, passare la dimensione corretta come illustrato nel codice seguente:
#include<windows.h>
extern void my_wcsncpy(wchar_t *, wchar_t *, size_t);
void f( )
{
WCHAR pC[15];
wchar_t* input = L"Hello, World!";
my_wcsncpy(pC, input, (sizeof pC) / (sizeof pC[0]));
// code ...
}
Si noti che l'euristica utilizzata potrebbe non essere corretta per alcuni stili di codifica, pertanto questo avviso potrebbe non corrispondere a un errore vero e proprio nel codice.