( kroozo | 2021. 04. 18., v – 11:47 )

Először access, csak aztán lenne assignment, de már az accessnél elhasal az access violation miatt. A Rust példában viszont nem volt assignment, akkor maradjunk annál C-ben is:

char *x = NULL;
printf(x);

Erről volt ugyanis szó, csak rossz volt a C-s példa.

Ok. És igen, igazad van, természetesen előbb access. 

Nem az unsafe alatti részt kell ellenőrizni, hanem a safe részt. Történik egy kiírás, amiben egy referencia alól akarunk stringet kiírni. A referencia függvényből jön, azaz letárolódik az értéke valahova, mielőtt használja a safe rész. Azt már a safe módú kiíró fogja címként felhasználni, tehát letárolta valahova, akkor meg már ellenőrizheti is, hogy olyan helyre mutat, ahova egyáltalán a task hozzáférhet, mert nem lehetetlen ezt ellenőrizni, hogy hozzáférhetsz-e valamihez, vagy sem; le is írtam, hogyan lehet ellenőrizni.

Persze, hogy lehetne, csak ha ezt a mentalitást generalizálod, akkor oda fogsz jutni a végén, hogy nincs is unsafe, mert mindent, amit ott csináltál, leellenőrzünk, hogy megfelel-e a safe szerint. Márpedig az unsafe azért van, hogy meg tudd kerülni az ellenőrzések megkötéseit, ha az tényleg szükséges. Én értem, hogy ez tud bajt okozni, és limitálja a hasznosságot, de én továbbra is azt gondolom, hogy ez nem a safe hiányossága, hanem a rossz unsafe kód következménye. És szerintem az egy teljesen élhető kompromisszum, hogy mondhatod, hogy most ne legyél okosabb nálam, tudom mit csinálok, akkor hagyja neked a tool, hogy rendben kisgazdám, de akkor te vagy a felelős a következményekért is.