136
ROZDZIAŁ 18. SA PISY
Bezpiecznymi alternatywami do strepy i streat są też funkcje strlcpy oraz strlcat opracowana przez projekt 0|x*nBSD i dostępna do ściągnięcia: strlcpy, strlcat. strlcpv() działa podobnie do stmcpy: strlcpy (buf , argv[l], sizeof buf)jednak jest szybsza (nie wypełnia pustego miejsca zerami) i zawsze kończy napis uullcm (czego nie gwarantuje stmcpy). strlcat(dst, sre, size) działa natomiast jak strncat(dst, sre, size-1).
Do innycłi niebezpiecznych funkcji należy np. gets zamiast której należy używać fgets. Zawsze możemy też alokować napisy dynamicznie:
tfinclude <stdio.h> sinclude <string.h>
•include <atdlib.h>
int main(int arge, char *«argv) { char haslo.poprawne = 0; char *haslo;
if (arge!"2) {
fprintf(stderr, "użycie: Xs hasło", argv[0]); return EXIT_FAILURE;
hasło = malloc(strlen(argv[l]) + 1); /• +1 dla znaku nuli •/ if (!hasło) {
fputs("Za mało pamięci.\n", stderr); return EXIT_FAILURE;
strepy(hasło, argv[l]); if (Istrcmp(hasło, "poprawne")) { haslo.poprawne ■ 1;
if (!haslo.poprawne) {
fputs("Podałeś biedne hasło.\n", stderr); return EXIT_FAILURE;
puts("Witaj, wprowadziłeś poprawne hasło.");
free(haslo)
return EXIT_SUCCESS;
Nadużycia z udziałem ciągów formatujących
J«>dnak to nie koniec kłopotów z napisami. Wielu programistów, nieświadomych zagrożenia często używa tego typu konstrukcji:
iinclude <stdio.h>
int main (int arge, char *argv[])
{
printf (argv[l]);
)
Z punktu widzenia bezpieczeństwa jest to iKtrdzo poważny błąd programu, który może nieść ze solxj katastrofalne skutki! Prawidłowo napisany kisł |xnvinieu wyglądać następująco: