- Mesaj
- 60
- Çözümler
- 1
- Beğeni
- 203
- Puan
- 699
- Ticaret Puanı
- 0
Dün şu konuda sitem ettiğim mevzu.
Olay şu;
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;
Olay şu;
C++:
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++:
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);