Bagikan melalui


Luapan Buffer

Berbagai ukuran karakter dapat menyebabkan masalah saat Anda memasukkan karakter ke dalam buffer. Pertimbangkan kode berikut, yang menyalin karakter dari string, sz, ke dalam buffer, rgch:

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

Pertanyaannya adalah: Apakah byte terakhir menyalin byte prospek? Berikut ini tidak menyelesaikan masalah karena berpotensi meluapkan buffer:

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

_mbccpy Panggilan mencoba melakukan hal yang benar - salin karakter lengkap, apakah itu 1 atau 2 byte. Tetapi tidak memperhitungkan bahwa karakter terakhir yang disalin mungkin tidak sesuai dengan buffer jika karakternya lebarnya 2 byte. Solusi yang benar adalah:

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

Kode ini menguji kemungkinan luapan buffer dalam pengujian perulangan, menggunakan _mbclen untuk menguji ukuran karakter saat ini yang ditujukkan oleh sz. Dengan melakukan panggilan ke _mbsnbcpy fungsi, Anda dapat mengganti kode dalam perulangan while dengan satu baris kode. Contohnya:

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

Lihat juga

Tips Pemrograman MBCS