バッファー オーバーフロー
文字のサイズが異なると、バッファーに文字を挿入するときに問題が発生する可能性があります。 文字列の文字をバッファーにコピーする次のコードについて考えてみ szrgch ます。
cb = 0;
while( cb < sizeof( rgch ) )
rgch[ cb++ ] = *sz++;
質問は、最後のバイトが先頭バイトをコピーしたかどうかということです。 次の例では、バッファーがオーバーフローする可能性があるため、問題は解決されません。
cb = 0;
while( cb < sizeof( rgch ) )
{
_mbccpy( rgch + cb, sz );
cb += _mbclen( sz );
sz = _mbsinc( sz );
}
_mbccpyこの呼び出しは、 — 1 か2バイトかにかかわらず、完全な文字をコピーします。 ただし、文字が2バイト幅の場合、コピーされた最後の文字がバッファーに合わないことは考慮されません。 正しい解決策は次のとおりです。
cb = 0;
while( (cb + _mbclen( sz )) <= sizeof( rgch ) )
{
_mbccpy( rgch + cb, sz );
cb += _mbclen( sz );
sz = _mbsinc( sz );
}
このコードは、を使用し _mbclen て、が指す現在の文字のサイズをテストするループテストで、バッファーオーバーフローが発生する可能性があるかどうかをテストし sz ます。 関数を呼び出すことによって、 _mbsnbcpy ループ内のコードを while 1 行のコードに置き換えることができます。 次に例を示します。
_mbsnbcpy( rgch, sz, sizeof( rgch ) );