バッファー オーバーフロー

文字のサイズが異なると、バッファーに文字を挿入するときに問題が発生する可能性があります。 文字列の文字をバッファーにコピーする次のコードについて考えてみ 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 ) );

関連項目

MBCS プログラミングヒント