Pufferüberlauf

Unterschiedliche Zeichengrößen können beim Einfügen von Zeichen in einen Puffer Probleme verursachen. Beachten Sie den folgenden Code, der Zeichen aus einer Zeichenfolge szin einen Puffer kopiert: rgch

cb = 0;
while( cb < sizeof( rgch ) )
    rgch[ cb++ ] = *sz++;

Die Frage lautet: Wurde das letzte Byte ein Leadbyte kopiert? Im Folgenden wird das Problem nicht behoben, da er den Puffer potenziell überlaufen kann:

cb = 0;
while( cb < sizeof( rgch ) )
{
    _mbccpy( rgch + cb, sz );
    cb += _mbclen( sz );
    sz = _mbsinc( sz );
}

Der _mbccpy Aufruf versucht, das richtige Zu tun – kopieren Sie das vollständige Zeichen, unabhängig davon, ob es sich um 1 oder 2 Bytes handelt. Es wird jedoch nicht berücksichtigt, dass das letzte kopierte Zeichen möglicherweise nicht in den Puffer passt, wenn das Zeichen 2 Byte breit ist. Die richtige Lösung ist:

cb = 0;
while( (cb + _mbclen( sz )) <= sizeof( rgch ) )
{
    _mbccpy( rgch + cb, sz );
    cb += _mbclen( sz );
    sz = _mbsinc( sz );
}

Dieser Code testet auf mögliche Pufferüberlauf im Schleifentest, wobei _mbclen die Größe des aktuellen Zeichens getestet wird, auf szdas verwiesen wird. Durch einen Aufruf der _mbsnbcpy Funktion können Sie den Code in der while Schleife durch eine einzelne Codezeile ersetzen. Beispiel:

_mbsnbcpy( rgch, sz, sizeof( rgch ) );

Siehe auch

Tipps für die MBCS-Programmierung