Aracılığıyla paylaş


Arabellek Taşması

Değişken karakter boyutları, arabelleğe karakter yerleştirdiğinizde sorunlara neden olabilir. Dizedeki karakterleri szarabelleğe rgchkopyalayan aşağıdaki kodu göz önünde bulundurun:

cb = 0;
while( cb < sizeof( rgch ) )
    rgch[ cb++ ] = *sz++;

Soru şudur: Son bayt bir müşteri adayı baytını kopyalandı mı? Arabellekte taşma olasılığı olduğundan aşağıdakiler sorunu çözmez:

cb = 0;
while( cb < sizeof( rgch ) )
{
    _mbccpy( rgch + cb, sz );
    cb += _mbclen( sz );
    sz = _mbsinc( sz );
}

Çağrı _mbccpy doğru şeyi yapmaya çalışır; 1 veya 2 bayt olsun, tam karakteri kopyalayın. Ancak, kopyalanan son karakterin 2 bayt genişliğindeyse arabelleğe sığmayabileceği dikkate alınmaz. Doğru çözüm:

cb = 0;
while( (cb + _mbclen( sz )) <= sizeof( rgch ) )
{
    _mbccpy( rgch + cb, sz );
    cb += _mbclen( sz );
    sz = _mbsinc( sz );
}

Bu kod, tarafından işaret edilen geçerli karakterin boyutunu test etmek için kullanarak _mbclen döngü testinde olası arabellek taşması sziçin sınar. İşleve _mbsnbcpy çağrı yaparak döngüdeki while kodu tek bir kod satırıyla değiştirebilirsiniz. Örneğin:

_mbsnbcpy( rgch, sz, sizeof( rgch ) );

Ayrıca bkz.

MBCS Programlama İpuçları