- Katılım
- 6 Kas 2021
- Mesajlar
- 4,519
- Tepkime puanı
- 5,799
- Puanları
- 113
- Yaş
- 32
- Konum
- Türkiye
- Dc
- fatihbulut
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;
Kod:
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;
Kod:
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);
