Keresés

Új hozzászólás Aktív témák

  • EQMontoya

    veterán

    válasz Hiftu #3840 üzenetére

    Én is azon gondolkodtam este (némi privát üzenetetek váltását követően), hogy hogyan lehetne ezt kivédeni. Mert ha ctorbab b@ssza el az ember az init sorrendet, arra ugye van warning, egyértelmű user error.
    Ezt viszont már nem veszi észre a fordító, mert az a-t inicializálni próbáló fv. dependál b-n.
    Tehát warning nem lesz, viszont irgalmatlan szívás igen.

    Ugye először lehetne még jönni azzal, hogy ctorból nem hívogatunk tagfüggvenyeket, de nem virtuálisakat nyugodtan lehet.

    Talán a legnagyobb probléma itt az, hogy a ctor valami olyat próbál csinálni, ami nem teljesen feladata, de ez megint megfoghatatlan.

  • dobragab

    addikt

    válasz Hiftu #3838 üzenetére

    Így van. :) Amikor a count_a hívódik, a b adattag még nincs inicializálva, így nettó undefined behaviour.

    Nálam természetesen a saját allokátortól valamiért (debug mód, vagy OS security, vagy direkt kiszúrásból) kinullázott memóriaterületet kaptam, ami véletlenül az adott implementációban az üres vektor memóriaképével egyezett (count == 0, capacity == 0, data == nullptr)... Ezen frankón lefutott a push_back. Otthon egyébként debug módban crash, release-ben fut.

    Az első megoldást választottam, mert a prod kódban ott nem egy sima int van, hanem egy bonyolult, connection állapotot kezelő cucc, rengeteg adattaggal, az egyik konstruktorparaméterére hívtam egy count_a-szerűséget. És még a vektor is csak metaadat, így a tagfüggvényben csak lestem, miért romlik el minden, és a hitem szerint jól inicializált, sehol máshol nem módosított vektorra csak egy nap debugprintf után gondoltam.

    Majd beletúrok az allokációba, hogy debug módban írja felül random adattal a memóriaterületet.

    Amúgy meg szerintem kéne kérnünk egy SPOILER taget a topikba :)

  • Hiftu

    senior tag

    válasz Hiftu #3837 üzenetére

    Közben kipróbáltam. Segmentation fault-ot írt ki. :)
    A b.push_back(i)-re hasalt el.
    Akkor ötletem nem volt rossz, csak az eredménye: az a inicializálásakor még nincsen b vectorod.

    Megoldás #1:
    Felcseréled az a és b változó sorrendjét.
    Ez egy elég gyenge megoldás, több változó esetén szívhatsz vele.

    Megoldás #2:
    Az összefüggő adatok inicializálását kiveszed az inicializálási listából (de szarul hangzik magyarul)
    és berakod a constructor függvénytörzsébe.

Új hozzászólás Aktív témák