Dépassement de capacité du tampon
Différentes tailles de caractères peuvent entraîner des problèmes lorsque vous placez des caractères dans une mémoire tampon. Considérez le code suivant, qui copie les caractères d’une chaîne, sz
dans une mémoire tampon : rgch
cb = 0;
while( cb < sizeof( rgch ) )
rgch[ cb++ ] = *sz++;
La question est : Le dernier octet a-t-il copié un octet de tête ? Ce qui suit ne résout pas le problème, car il peut potentiellement dépasser la mémoire tampon :
cb = 0;
while( cb < sizeof( rgch ) )
{
_mbccpy( rgch + cb, sz );
cb += _mbclen( sz );
sz = _mbsinc( sz );
}
L’appel _mbccpy
tente d’effectuer la bonne opération : copiez le caractère complet, qu’il s’agisse de 1 ou 2 octets. Mais il ne tient pas compte du fait que le dernier caractère copié peut ne pas correspondre à la mémoire tampon si le caractère est de 2 octets de large. La solution correcte est la suivante :
cb = 0;
while( (cb + _mbclen( sz )) <= sizeof( rgch ) )
{
_mbccpy( rgch + cb, sz );
cb += _mbclen( sz );
sz = _mbsinc( sz );
}
Ce code teste le dépassement de mémoire tampon possible dans le test de boucle, en utilisant _mbclen
pour tester la taille du caractère actuel pointé par sz
. En effectuant un appel à la _mbsnbcpy
fonction, vous pouvez remplacer le code dans la while
boucle par une seule ligne de code. Par exemple :
_mbsnbcpy( rgch, sz, sizeof( rgch ) );