缓冲区溢出

将字符放入缓冲区时,不同的字符大小可能会导致问题。 可考虑以下代码,该代码将字符串 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 ) );

另请参阅

MBCS 编程提示