Perl 6 - the future is here, just unevenly distributed

IRC log for #divine, 2015-11-11

| Channels | #divine index | Today | | Search | Google Search | Plain-Text | summary

All times shown according to UTC.

Time Nick Message
17:36 xstill mornfall: každá alloca se alokuje zvlášť na haldě?
17:42 xstill mornfall: int z; free( &z ); to by nemělo přes safety projít, ale projde :-/ což je trochu divný, protože double free poznat umíme
17:59 xstill mornfall: to chce přidat kontrolu na double free do machine.h:809, jako alespoň částečné řešení (pořád to neřeší, že to free má selhat, ne až vyskočení z funkce), lepší řešení by bylo rozlišovat v pointru ne jen heap/ne-heap, ale heap/stack/ostatní přičemž stack by se chovalo jako heap, ale nešlo by na tom zavolat free
18:00 xstill chceš patch na tu kontrolu i do nextu, nebo jen back-port do mainline?
18:15 xstill mornfall: a krom toho ti nefunguje stacksave
18:20 mornfall xstill: na stacksave je test
18:21 xstill tak je špatnej
18:21 mornfall tak ho oprav
18:22 xstill to jo, problém je s VLA v cyklu
18:22 xstill větší problém je ale to free na zásobník
18:24 mornfall počítám že se to teď chová přesně tak jako kdyby &x bylo z malloc-u
18:24 xstill jo, blbý je, že když jsem to opravil tak jak jsem ti psal tak začaly v mainline padat testy
18:24 mornfall tzn. v podstatě to všechno funguje jen se nedetekuje chyba?
18:24 xstill jo, jediný co je špatně je, že můžeš zrušit lokální proměnnou pomocí free
18:25 xstill ten problém s tou mojí opravou ale zdá se souvisí s rozbitým stackrestore
18:25 xstill možná
18:26 mornfall máme nedostatek bitů
18:26 mornfall docela
18:27 xstill jsem pro to v součaným interpretru neřešit víc než jako detekci double free a v novým to bude potřeba nějak vymyslet
18:28 mornfall detekce double free je taky trochu problémová
18:28 mornfall když ty mezi to vletí kanonizace, tak počítám z toho neplatnýho pointru udělá null
18:28 mornfall ti*
18:30 mornfall takže to ještě chce speciální neplatnej, non-null pointr
18:30 xstill udělá se z toho 0:1, ne? to není null
18:30 mornfall pravda,             edit = Pointer( false, 0, 1 ); /* not NULL, so we can detect an invalid free */
18:32 mornfall to skoro vypadá že double free by mělo házet invalid argument v tom druhým free?
18:32 mornfall a dokonce na to je aj test
18:32 xstill jo, to dělá, problém je, že při konci funkce se nekontroloval výsledek free
18:33 xstill to jsem opravil, ale teď je problém, že stackrestore nenuluje tu alloca co uvolní, takže tam vznikne double free
18:33 xstill tak to jdu opravit a uvidím jestli ten test projde
18:33 mornfall no jo tak
18:33 mornfall takže nic není rozbitý nakonec :D
18:34 mornfall jen tam prostě není detekce toho free( &x )
18:34 xstill no, a asi nefunguje stackrestore v cyklu, já na to snad příjdu a pošlu ti patche
18:34 mornfall stackrestore pokud to bude invalidovat tak by měl použít non-null
18:35 xstill proč?
18:36 mornfall aby to bylo stejný jako ostatní uvolněný pointry
18:37 xstill jenže pak zas nemůžeš detekovat to free na stack, protože to free na konci funkce (co dělá divine) ti zařve pokud to stackrestore uvolnil
18:37 xstill to bys musel mít ještě specielní ne-null pointr, kterej může vytvořit jen stackrestore, to je trochu ujetý
18:38 mornfall no, takhle ti zase projde free( &x ) pokud to je neplatnej VLA ukazatel ne?
18:39 xstill jo… obojí je blbě
18:40 mornfall ono pokud by BuiltinFree detekovalo že něco je/není alloca, tak už tady s tímhle není potřeba kouzlit, snad
18:40 mornfall jen zatim nevim jak
18:41 mornfall no vlastně, to není těžký, jen to není ani úplně levný
18:41 mornfall (je to stejný jako stacksave, projít všechny výsledky alloca)
18:42 xstill no, ale musel bys je projít přes všechny stacky všech vláken
18:42 mornfall to není moc dobrý
18:43 xstill to není, ten jeden bit v pointru bolí pomalu míň
18:43 mornfall koho vlastně napadlo volat free( &x ) na lokální proměnnou? :-)
18:44 xstill mě :-D když jsem zjistil, že aloka fakt alokuje úplně stejně jako malloc
18:44 mornfall jako asi chápu že se to může nějak přihodit když si posouváš takový ukazatele mezi funkcema
18:44 mornfall jo tak
18:45 xstill protože jsem se snažil zjistit jak funguje stacksave, protože jsem přemýšlel jak vyřešit cleanup při stackrestore… ty cleanupy nejsou vůbec tak jednoduchý jak bych chtěl
18:46 mornfall jako v MemoryFlag nám zbývá jedna volná hodnota
18:47 mornfall ale to bude hroznej opruz
18:47 mornfall no
18:49 mornfall ukazatel s code = true, heap = true by vyšel nastejno jako zamaskovaný PC, to momentálně nemá jak utéct z registru
18:49 mornfall (z program counter registru teda)
18:49 mornfall ale je to trochu hra s ohněm
18:51 xstill no, pokud z Pointer::code a heap uděláš funkce a do toho Pointer dáš 2 bitovej enum, tak to možná nebude ani tak moc nechutný
18:51 mornfall o to by nešlo
18:52 xstill a o co?
18:52 mornfall no když se na takovou hodnotu podíváš tak fakt nepůjde poznat jestli to je zamaskovanej program counter nebo výsledek alloca
18:52 mornfall a bude to dost na čestný slovo
18:53 xstill jak zmasakrovanej PC?
18:53 mornfall zamaskovanej, ne zmasakrovanej
18:53 mornfall ...
18:53 xstill aha :-D
18:53 mornfall ukazatel na kód a ukazatel na data jsou stejná věc, žejo
18:53 mornfall odlišujou se tím 'code' bitem
18:54 xstill jo, to chápu
18:54 xstill ale nechápu co myslíš tím zamaskovanej
18:54 mornfall jeden bit v struct PC (ten stejnej jako je heap v Pointer-u) je maska
18:55 xstill jakože __divine_interrupt_mask?
18:55 mornfall jo
18:55 xstill aha… to není dobrý potom
18:56 mornfall v nových ukazatelech je 25 bitů tag
18:56 mornfall aktuálně
18:57 mornfall když necháme offset 14, bez code a heap zbývá 9
18:57 mornfall musí se tam vejít ještě rozlišení různých objektů se stejnou hodnotou
19:01 mornfall v mainline bych to asi neřešil vůbec a v next-u můžu zkusit vymyslet jak někde ušetřit nějaký bity
19:02 mornfall (snad půjde rozlišovat code podle nějaké nesmyslné kombinace block/offset z netagový části)
19:02 mornfall no i když... ještě zkusim něco vymyslet
19:03 mornfall nicméně limity jsou teď max 16K jedna alokace a max 64K objektů
19:03 mornfall v mainline
19:04 xstill ok, asi to proberem zítra, já třeba nevím jak chceš ty objekty rozlišovat. A teď se spíš chci zamyslet nad tím jak udělat ten cleanup (bez stacksave zatím), uvažuju jestli stacksave neudělat v userspace (muselo by existovat něco jako __divine_stack_free), ale nevím jestli je garantované, že to poznám staticky jak se to páruje (i když bych asi měl, protože křížit se to nemůže a vo
19:04 xstill lat z restore z jiné funkce než save už ...
19:04 xstill ... počítám vůbec ne)
19:06 xstill ono totiž ty cleanupy budou muset stejně staticky poznat ke kterýmu stacksave ten stackrestore patří, jinak nebudou fungovat
19:06 xstill jdu na chvíli ven…
19:06 mornfall já zatím nevim proč musí cleanup nějak řešit stacksave
19:07 xstill ze stejnýho důvodu jako je potřeba vyhodit ze store bufferu položku při free je potřeba ji vyhodit i při stackrestore
19:08 mornfall to jo, ale když běží cleanup tak se ví že ten rámec se zabije
19:08 mornfall a žádnej stackrestore se už nespustí
19:09 xstill naopak, když běží stackrestore tak musíš udělat cleanup na tu alloca co mažeš
19:09 mornfall jo ty říkáš cleanup ale nemyslíš cleanup :)
19:09 xstill (cleanup pro weakmem)
19:09 xstill ne landingpad cleanup
19:09 mornfall jo
19:10 mornfall to by mělo jít řešit nějakou dohodou o tom co je výsledek stacksave
19:10 mornfall hm
19:10 mornfall teda spíš stackrestore
19:10 mornfall což teda asi nemůžem ovlivnit
19:11 xstill stackrestore? ten nemá výsledek, ne?
19:11 mornfall no nic běž ven, tohle řešit jde, stackrestore bolí už teď
19:11 mornfall nemá (ale lze ho nahradit něčím co má, pravděpodobně)
19:11 xstill proč bych u něj potřeboval výsledek?
19:11 mornfall resp. mu něco takovýho předřadit (co vezme výsledek stacksave a vrátí ten doplněk)
19:12 mornfall aby sis ho pak mohl proiterovat a zničit odpovídající buffery
22:26 xstill mornfall: kdybys měl čas, tak si prosím přečti https://github.com/vlstill/mgrthesis/blob/master/extend.md#local-variable-cleanup jestli jsem to nevymyslel blbě, ale myslím že toto by mělo fungovat (modulo stacksave)

| Channels | #divine index | Today | | Search | Google Search | Plain-Text | summary