További C hibalista (teljesség igénye nélkül), amit a Rust-ban javítottak:
- K&R közül egyik nyilatkozta tizenpár éve: bánja hogy nulltermináltra tervezték a stringet C-ben. A hibák melegágya lett. Rust: hosszt számlálja. Mellékes előny: daraboláskor Vec<&str> --> bárhol beléphetsz a String-be N hosszban, azaz daraboláskor nem kell adatot másolni, csak pointert és hosszt állít rá a fordító.
- fenti példánál ha max-nál rövidebb "a" vagy "b" adatvektor, lazán beleolvas a másik részbe (information leakage) vagy beleír a másik részbe (code injection, nem várt végtelen ciklus, bármi). Rust: hibát dob túlolvas/túlírásra.
- C-nél adatcsatornában jön a NULL pointer is vissza. Pici figyelmetlenség és kész a biztonsági rés. Rust: if let Some(a) = akarmi(x,y) { ... }
- C fájlokon keresztül hurcolt globális változók: átláthatatlanság melegágya. Rust: csak unsafe {} módon férhetsz hozzá globális változóhoz.
- szálak (thread): konkurens vektorhasználat: Rust ownership
- free utáni vektorhasználat: Rust ownership & lifetime alapú automatikus memória felszabadítás
- C: alapból újraírható változók, "const" a függvényeknél lustaságból elmarad. Rust: alapból nem újraírható változók. Az újraírhatósághoz "mut" kulcsszó kell. Indokolatlan "mut" warningot ad.
- fegyelem netovábbja: double és float között nem tudsz műveletet végezni. Explicit mond meg, hogy melyiket alakítsa át a másikára. C-ben okozott nekem már ez az automatizmus is félreszámolást.
- ...
Visszatekintve a C tényleg olyan, mint biztonsági öv nélkül versenyautót vezetni. Szabadság, szerelem. Továbbá átlagosan 1,2-szeres tempó, de nagyobb eséllyel kompromittálható szoftver.
Lásd még:
- Microsoft: Checked-C (csak részben ad megoldást)
- Microsoft: Verona projekt (Rust alapon, elején tartanak)