缓冲区溢出
将字符放入缓冲区时,不同的字符大小可能会导致问题。 可考虑以下代码,该代码将字符串 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
循环中的代码。 例如:
_mbsnbcpy( rgch, sz, sizeof( rgch ) );