Поделиться через


Переполнение буфера

Различные размеры символов могут вызвать проблемы при помещении символов в буфер. Рассмотрим следующий код, который копирует символы из строки, 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 ) );

См. также

Советы по программированию многобайтовой кодировки