CreateItem register işleminden sonra SetCount kontrolü

  • Konuyu açan Konuyu açan Larry Watterson
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 0
  • Gösterim Gösterim 101

Larry Watterson

Üye
Üye
Mesaj
60
Çözümler
1
Beğeni
203
Puan
699
Ticaret Puanı
0
Dün şu konuda sitem ettiğim mevzu.

Olay şu;

C++:
Genişlet Daralt Kopyala
item->SetVID(++m_dwVIDCount);

if (bSkipSave == false)
    m_VIDMap.emplace(item->GetVID(), item);

if (item->GetID() != 0 && bSkipSave == false)
    m_map_pkItemByID.emplace(item->GetID(), item);

if (!item->SetCount(count)) // LOL
    return NULL;

item "SetCOunt" member funcın dönüş değeri kontrol edilmeden VID değeri alıyor ve 2 adet map'e emplace ediliyor. "SetCount" başarısız olursa fonksiyon NULL return ediyor ama item halen iki haritada bulunuyor, sonrasında herhangi bir yerde silinmiyor(DestroyItem çağrılması gerekiyor).

Şu anlık bir sorun teşkil etmiyor çünkü "SetCount" funcının başarısızlık durumu countun 0 ve owner'ın nullptr olmasına bağlı yani kısaca cold path. Mantıksal akış ve ileriye dönük amaçlı düzeltebilirsiiz, buna ek olarak "SetCount" implementasyonunda düzenleme yaptıysanız dikkatli olmanız gerekebilir.

Şu şekilde düzeltebilirsiniz;
C++:
Genişlet Daralt Kopyala
if (!item->SetCount(count)) [[unlikely]]
    return nullptr;

item->SetVID(++m_dwVIDCount);

if (bSkipSave == false)
    m_VIDMap.emplace(item->GetVID(), item);

if (item->GetID() != 0 && bSkipSave == false)
    m_map_pkItemByID.emplace(item->GetID(), item);
 
Geri
Üst