次の方法で共有


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

文字のサイズが異なると、文字をバッファーに挿入するときに問題が発生する可能性があります。 文字列 sz からバッファー rgch に文字をコピーする次のコードを考えます。

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 のプログラミングについて