버퍼 오버플로
문자 크기가 다양하면 버퍼에 문자를 넣을 때 문제가 발생할 수 있습니다. 문자열 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 ) );