C6209
Mise à jour : novembre 2007
C6209
Avertissement C6209 : Lors de l'utilisation de 'sizeof<variable1>' en tant que paramètre <numéro> dans l'appel à <fonction> où <variable2> peut être un tableau de caractères larges, avez-vous utilisé le nombre de caractères plutôt que le nombre d'octets ?
Cet avertissement indique qu'un paramètre dans un appel de fonction peut être défini de manière incorrecte sur un nombre d'octets au lieu d'un nombre de caractères. Si tel est le cas, ce défaut risque de provoquer une altération de la mémoire ou un blocage du programme, ainsi qu'une faille de sécurité exploitable, dans certains cas.
Ce défaut est généralement dû à l'utilisation de sizeof sur un tableau de caractères. L'opérateur sizeof calcule toujours le nombre d'octets. Pour les caractères ANSI, ce nombre correspond au nombre de caractères ; toutefois, pour les caractères Unicode, ce nombre est égal à deux fois le nombre de caractères.
Il est généralement recommandé de calculer le nombre d'éléments contenus dans un tableau en divisant la taille du tableau par celle de chaque élément.
Cet avertissement est généré dans les cas suivants :
Une variable est passée comme un paramètre et sizeof passé par la variable comme un autre paramètre.
Le type de variable et le type de paramètre formel sont des variétés de caractère de type pointeur vers large.
Exemple
L'exemple de code suivant génère cet avertissement car sizeofpC est passé à la fonction 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 ...
}
Pour corriger cet avertissement, passez la taille correcte, comme indiqué dans le code suivant :
#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 ...
}
Notez que l'heuristique utilisée peut être incorrecte pour certains styles de codage ; par conséquent, cet avertissement peut ne pas correspondre à un défaut réel dans le code.