sectree.h for_each_entity() UB

Larry Watterson

Üye
Üye
Mesaj
56
Çözümler
1
Beğeni
189
Puan
699
Ticaret Puanı
0
Burayı görüntülemek için üye girişi yapmalı veya kayıt olmalısınız.


Bu kodda UB var;

it erase edilip continue statement yazılmış. erase(it) sadece silinen elemana ait iterator'ı invalidate eder, statementda loop invalidate edilmiş iteratörü increment ediyor, olması gereken "it = m_set_entity.erase(it)" yazıp for yerine while döngüsüne çevirmek (erase zaten bir sonraki geçerli iterator'ı döndürüyor). Neyse, biraz daha inceleyip özetle C++20 için şöyle bir çözüm üretebilirsiniz;

Burayı görüntülemek için üye girişi yapmalı veya kayıt olmalısınız.


UB ise neden bugüne kadar patlamadı derseniz adı üstünde UB ne olacağını ancak Allah bilebilir, kimse öngöremez teknik detay için compiler dökümanlarına bakmak lazım.
 
Paylaşım için teşekkürler Mustafa, pointer tutan container'larda nullptr kontrolü eklemeyi unutmamak gerek, en azından null kalmış ptrların deref edilmesini engeller.
C++:
Genişlet Daralt Kopyala
template <class _Func>
void for_each_entity(_Func& func)
{
    std::erase_if(m_set_entity, [this](LPENTITY entity) {
        if (!entity || entity->GetSectree() != this) {
            sys_err("<Factor> SECTREE-ENTITY relationship mismatch");
            return true;
        }

        return false;
    });

    std::ranges::for_each(m_set_entity, std::ref(func));
}
 
Paylaşım için teşekkürler Mustafa, pointer tutan container'larda nullptr kontrolü eklemeyi unutmamak gerek, en azından null kalmış ptrların deref edilmesini engeller.
C++:
Genişlet Daralt Kopyala
template <class _Func>
void for_each_entity(_Func& func)
{
    std::erase_if(m_set_entity, [this](LPENTITY entity) {
        if (!entity || entity->GetSectree() != this) {
            sys_err("<Factor> SECTREE-ENTITY relationship mismatch");
            return true;
        }

        return false;
    });

    std::ranges::for_each(m_set_entity, std::ref(func));
}
zaten sanity check, ben atlamışım teşekkürler
 
Geri
Üst