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