Néhány alap példa. clang -O2 -Wall ... ahogy a legtöbbünk fordít alapból.
#include <stdio.h>
char *datagen() {
return NULL;
}
int main() {
printf("%s\n", datagen());
}
Rust esetén elkülönül az adatcsatorna a hibakezeléstől, nincs NULL pointer állapot:
fn datagen() -> Option<String> {
None
}
fn main() {
if let Some(adat) = datagen() {
println!("{}", adat);
} else {
println!("Nincs adat.");
}
}
És egy másik példa:
#include <stdio.h>
#include <string.h>
struct _teszt {
char szia[4];
char miez[4];
} teszt;
struct _teszt *datagen() {
strcpy(teszt.szia, "szia");
strcpy(teszt.miez, "MIEZ");
return &teszt;
}
int main() {
struct _teszt *t = datagen();
printf("szia: %s\n", t->szia);
printf("miez: %s\n", t->miez);
}
Rust esetén szintén nehéz hibázni, nem engedi az ilyesmit.
Egy kis malloc() oda nem figyelés. Sebaj valamelyi másik területre ráírunk. Tipikus codeinjection sérülékenység forrás:
#include <stdio.h>
#include <string.h>
#include <malloc.h>
struct _teszt {
char szia[4];
char miez[4];
};
void datagen(struct _teszt *teszt) {
strcpy(teszt->szia, "szia");
strcpy(teszt->miez, "MIEZ");
}
int main() {
struct _teszt *t = malloc(4); // nem kevés?
datagen(t);
printf("szia: %s\n", t->szia);
printf("miez: %s\n", t->miez);
// aztán a free() elfelejtődik, a memória zabálódik.
}
Szintén C gyöngyszem, clang nem szól, ellenben a kimenet téves eredményt ad:
#include <stdio.h>
#include <string.h>
#include <malloc.h>
struct _teszt {
char szia[4];
char miez[4];
};
void datagen(struct _teszt *teszt) {
strcpy(teszt->szia, "szia");
strcpy(teszt->miez, "MIEZ");
// ... pár művelet
free(teszt); // kis túlbuzgóság a kolléga által elkövetve
}
int main() {
struct _teszt *t = malloc(4); // nem kevés?
datagen(t);
printf("szia: %s\n", t->szia);
printf("miez: %s\n", t->miez);
}
Ezek kicsiben viccesek, egy több fő által írt nagyobb projekt esetén a hetekig tartó bugvadászat már kevésbé vicces.
A C-t tudni kell uralni. Mindig, hibázás nélkül!