( asch | 2024. 03. 13., sze – 08:42 )

>Mind a ketten igazat írtok.

Kivéve, hogy bzt téved. Konkrétan azt írta, hogy a Rust is ugyanolyan kódot generál, mint az ASAN, ami blődség, és pont a lényeg megértésének hiányára utal. Én is követtem már el szakmai tévedést, és még ragaszkodtam is hozzá egy darabig, de aztán a végén csak utánajártam és korrigáltam amit még lehetett. De ez már túlzás, hogy megír egy komplett számláló rendszerprogramot, hogy "bizonyítson" valamit amit senki se ért, de közben nem néz végig egy Rust vagy Java tutoriált, hogy mégis hogyan működik a memória biztonság.

>Az általad irt példa halmozott probléma, talán erre is lesz majd pattern vagy a fordítóban vagy egyéb segéd programban mint pl Valgrind.

Nem értem mitől lenne halmozott, egy darab elrontott pointer aritmetika van benne. A minta egyébként simán előfordul C programokban, hogy pointer szerint matatunk valamit.

Az első esetben annyit kellett trükközni, hogy két külön forrásban legyen az sprintf és a buffer, így a compilernek sosincs meg az egész kontextus, ezért nem tud fordítási időben bufferméretet ellenőrizni. Nem hajánál fogva előhúzott minta, számtalanszor láttam ilyet valódi programban is.

A másodikban azért van pointer szerinti kiíratás, hogy garantált legyen, hogy a b változót is stackre allokálja a fordító. Ha mindkettő stacken van, akkor máris elérhető egyik a másik hibás offsetelésével. A kérdés csak az, hogy mennyi az offset, ami fordítófüggő, de mindig van olyan szám, amivel éppen észrevétlenül hibázik a rendszer.

A menedzselt nyelvekben azért nem lehet ilyet csinálni, mert "pointer helyett" "referencia" van, ami pointer+méret+típus információ és minden esetben ellenőrzive van, hogy pontosan oda címzünk amire jogunk van. Az ellenőrzés sokszor lehet fordítás idejű zéró plusz költséggel (egyébként érdekes módon pont azon egyszerű esetekben tud fordítási időben ellenőrzni a fordító, amikor a C fordító is tud érvelni a pointer méretére), de amikor plusz utasítás, akkor se óriási a költség, mivel regiszterben vagy cache-elt memóriában közlekedik a metaadat, amit gyorsan el lehet érni.