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