134
ROZDZIAŁ 18. SA PISY
int main(void) {
char napisl[80] - "hello char *napis2 ■ "world”;
stmcat(napisl, napis2, sizeof napisl - 1); puts(napis1); return 0;
Osoby, które programowały w językach skryptowych muszą bardzo uważać na łączenie i kopiowanie napisów. Kompilator języka C nie wykryje nadpisania pamięci za zmienną łańcuchową i nie przydzieli dodatkowego obszaru pamięci. Może się zdarzyć, że program pomimo nadpisywania pamięci za łańcuchem będzie nadal działał, co bardzo utrudni wykrywanie tego typu błędów!
Przepełnienie bufora
O co właściwie chodzi z tymi funkcjami strncpy i stmcat? Otóż, niewinnie wyglądające łańcuchy mogą okazać się zabójcze dla bezpieczeństwa programu, a przez to nawet dla systemu, w którym ten program działa. Może brzmi to strasznie, lecz jest to prawda. Może pojawić się tutaj pytanie: “w jaki sposób łańcuch może zaszkodzić programowi?”. Otóż może i to całkiem łatwo. Przeanalizujmy następujący kod:
ftinclude <stdio.h>
Sinclude <string.h> ftinclude <stdlib.h>
int maindnt argc, char **argv) { char haslo.poprawne = 0; char hasło[16];
if (argc!«2) {
fprintf(stderr, "użycie: ‘/.s hasło", argv[0]>; return EXIT_FAILURE;
stropy(hasło, argv[l]>; /* tutaj następuje przepełnienie bufora »/ if (Istrcnp(hasło, "poprawne")) { haslo.poprawne * 1;
if (!haslo.poprawne) {
fputs("Podałeś biedne hasło.\n", stderr); return EXIT_FAILURE;
putsCWitaj, wprowadziłeś poprawne hasło."); return EXIT_SUCCESS;
Jest to bardzo prosty program, który wykonuje jakąś akcję, jeżeli podane jako pierwszy argument hasło jest poprawne. Sprawdźmy czy działa: