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 sz
in 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 sz
das 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
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für