Hlavní navigace

Názor ke zprávičce Kolem 70 % vážných bezpečnostních chyb v Chromiu jsou chyby používání paměti od anonym - Přemýšlíte o tom způsobem vhodným pro jazyky s...

  • Aktualita je stará, nové názory již nelze přidávat.
  • 27. 5. 2020 11:02

    bez přezdívky

    Přemýšlíte o tom způsobem vhodným pro jazyky s GC. V C++/Rustu tak jde přemýšlet taky, ale není to úplně šikovné. Nebudu se soustředit na implementační detaily, ale vezmu to obecně.

    Objekty v jazycích s GC existují naprosto nezávisle. Prostě žijí minimálně tak dlouho, dokud o nich někdo ví. A až na ně všichni zapomenou tak možná někdy umřou. Objekty v jazycích s GC nemají vlastně dobře ohraničený konec života. GC svým způsobem emuluje nekonečnou paměť, kdy objekty jen vytvářím a až doslouží tak je prostě ignoruju.

    Naproti tomu v C++/Rustu se vychází z toho, že většina objektů má nějakého logického vlastníka. Jen minimum objektů má cenu vlastnit sdíleně třeba přes reference counting. Například ten váš seznam lidí k notifikaci nemá důvod existovat samostatně bez toho primárního spojení. Takže bude mít jediného vlastníka a i jeho život bude s tím vlastníkem provázaný.

    A život záznamu v tabulce těch notifikací je zase svázaný s životem toho spojení s protistranou. Ve chvíli, kdy nějaké spojení umře, tak umřou i všechny vlastněné objekty.
    Ten příklad je hodně vágní, takže je těžké mluvit o nějakých konkrétních datových strukturách. Ale nevidím tam vlastně nic, co by vůbec vyžadovalo sdílení vlastnictví a tím i reference counting.

    Hlavní rozdíl v uvažování je ten, že pokud v jazyce s GC někam předáváte ukazatel, tak si ho ten volaný může bez omezení uložit a prodloužit tomu objektu život.
    V C++ to není dobrý nápad, takže to dělá (v novém c++) málokdo. Když předávám ukazatel, tak předpokládám že si ho volaný nebude nikam ukládat a po návratu z funkce už ten ukazatel neexistuje. Pokud chci volanému předat vlastnictví, tak dostane smart pointer. Jinak to dělá akorát historický kód, případně nějaké zprasenosti.
    Rozdíl mezi C++ a Rustem je v tomhle jen ten, že mi borrow checker vynutí abych ten půjčený ukazatel zase vrátil a nenechal si ho. V C++ je to jen dobrý zvyk, který ale překladač nemá jak vynutit.