バッファー オーバーフロー
文字のサイズが異なると、文字をバッファーへ入れるときに問題となります。文字列 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 ) );