Bagikan melalui


Peringatan C28616

Kondisi AV multithreaded

Peringatan ini menunjukkan bahwa utas berpotensi mengakses objek yang dihapus jika didahului.

Keterangan

Seharusnya tidak ada akses ke objek yang dihitung referensi setelah jumlah referensi berada di nol.

Nama analisis kode: INTERLOCKEDDECREMENT_MISUSE1

Contoh

Kode berikut menghasilkan peringatan ini. Ini adalah contoh urutan waktu utas yang dapat mengekspos masalah ini. Dalam contoh ini, m_cRef adalah anggota dari this:

Utas if T1 menjalankan kondisi, penurunan m_cRef menjadi 1, dan kemudian didahulukan.

Utas if T2 lain menjalankan kondisi, penurunan m_cRef ke 0, menjalankan if isi (di mana this dihapus), dan mengembalikan NULL.

Ketika T1 dijadwalkan ulang, T1 akan mereferensikan m_cref pada baris 9. Dengan demikian akan mengakses variabel anggota setelah pointer terkait this dihapus—dan ketika tumpukan untuk objek berada dalam status tidak diketahui.

ULONG CObject::Release()
{
    if (0 == InterlockedDecrement(&m_cRef))
    {
        delete this;
        return NULL;
    }
    /* this.m_cRef isn't thread safe */
    return m_cRef;
}

Kode berikut tidak mereferensikan memori tumpukan apa pun setelah objek dihapus.

ULONG CObject::Release()
{
    ASSERT(0 != m_cRef);
    ULONG cRef = InterlockedDecrement(&m_cRef);
    if (0 == cRef)
    {
        delete this;
        return NULL;
    }
    return cRef;
}