clang -O2 -Wall ... ahogy a legtöbbünk fordít alapból.Amíg debuggolsz, addig
-Weverything jobb, persze mindent az sem szűr ki.Rust esetén elkülönül az adatcsatorna a hibakezeléstől, nincs NULL pointer állapot:Már bocs de ennek a Rust kódnak
fn datagen() -> Option {
None
}
fn main() {
if let Some(adat) = datagen() {
println!("{}", adat);
} else {
println!("Nincs adat.");
}
}ez a C-s megfelelője#include
char *datagen() {
return NULL;
}
int main() {
char *adat;
if (adat = datagen())
{
printf("%s\n", adat);
}
else
{
printf("Nincs adat.\n");
}
}és nem az, amit te írtál, ez pedig ugyanúgy azt fogja kiírni, hogy nincs adat. Így könnyű ráfogni a C-re, hogy szar, ha direkt kihagyod a hibakezelést, Rust-ban meg belerakod...Rust esetén szintén nehéz hibázni, nem engedi az ilyesmit.
unsafe esetén se?Egy kis malloc() oda nem figyelés. Sebaj valamelyi másik területre ráírunk. Tipikus codeinjection sérülékenység forrás:Az oda nem figyelés is számít? Mert ennyi erővel végy egy 1.20-nál régebbi Rust fordítót, vagy futtasd egy olyan platformon, ahol az LLVM nem támogatja a stack probing-ot, aztán egy kis oda nem figyelés egy rekurziónál és kész a segfault, safe módban is. Egyébként, amiket írtál, hogy "elfelejtődik" a
free(), Valgrind-del ki lehet mérni, hogy mindent felszabadítottál-e.A C-t tudni kell uralni. Mindig, hibázás nélkül!Hibázni egyik nyelvben sem lehet, különben bugos lesz a programod. Az meg had ne legyen egy lowlevel nyelv hátránya, hogy tudni kell vele bánni; ennyi erővel az assembly is szar. Egyébként nem tudom, hogy mit akartál ezzel bizonyítani; ha azt, hogy Rust-ban könnyebb programozni, azt senki sem vitatta, ha meg azt, hogy már tökéletesen működő C kódokat le kéne cserélni Rust-ra, azt meg ezzel nem sikerült.