Partager via


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, szdans 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 ) );

Voir aussi

Conseils de programmation MBCS