PDA

Visualizza la versione completa : [C] Controllo sulla lunghezza della stringa mancante?


86frame
09-05-2006, 16:52
Ciao a tutti
oggi mentre stavo facendo un programma di quelli pallosi che ci aveva lasciato il prof. di uni ho riscontrato un problema strano che ho estrapolato e inserito in questo semplice programmino: :master:

#include<stdio.h>
#include<stdlib.h>

main()
{
char *prova;
prova=(char*)malloc(5*sizeof(char));
scanf("%s",prova);
printf("%c",prova[0]);
printf("%c",prova[1]);
printf("%c",prova[2]);
printf("%c",prova[3]);
printf("%c",prova[4]);
printf("%c",prova[5]);
}

Nello scanf ho scritto una parola + lunga di 5 caratteri e non mi dava nessun errore,poi ho inserito l'ultimo printf per vedere se li stampava anche gli elementi che "trabbordavano" dall'array e con sgomento ho visto che li stampava!!! :oVVoVe: sono arrivato alla conclusione che C non fa nessun controllo sulla lunghezza della stringa se corrisponde alla relativa variabile, è una conclusione sensata? :dottò: il fatto che non mi dia una Segmentation fault è dato dal fatto che i carattereri che escono dall'array vanno a finire in zone di memoria ancora destinate al programma?.....il punto essenziale....come faccio a controllare che l'utente non metti + caratteri di quanto ne può contenere la variabile "prova" ? :dhò: :cry:

oregon
09-05-2006, 17:25
Originariamente inviato da 86frame
Ciao a tutti
oggi mentre stavo facendo un programma di quelli pallosi che ci aveva lasciato il prof. di uni ho riscontrato un problema strano che ho estrapolato e inserito in questo semplice programmino: :master:

#include<stdio.h>
#include<stdlib.h>

main()
{
char *prova;
prova=(char*)malloc(5*sizeof(char));
scanf("%s",prova);
printf("%c",prova[0]);
printf("%c",prova[1]);
printf("%c",prova[2]);
printf("%c",prova[3]);
printf("%c",prova[4]);
printf("%c",prova[5]);
}

Nello scanf ho scritto una parola + lunga di 5 caratteri e non mi dava nessun errore,poi ho inserito l'ultimo printf per vedere se li stampava anche gli elementi che "trabbordavano" dall'array e con sgomento ho visto che li stampava!!! :oVVoVe: sono arrivato alla conclusione che C non fa nessun controllo sulla lunghezza della stringa se corrisponde alla relativa variabile

Ottima conclusione ... del resto, da nessuna parte c'e' scritto che la scanf effettua tale controllo ... ed e' per questo che la scanf e' una funzione *altamente sconsigliata* al fine di evitare attacchi di tipo "buffer overflow".

E non e' solo quella ... sono tante ...


Originariamente inviato da 86frame
il fatto che non mi dia una Segmentation fault è dato dal fatto che i carattereri che escono dall'array vanno a finire in zone di memoria ancora destinate al programma?.....

E' cosi' ...


Originariamente inviato da 86frame
il punto essenziale....come faccio a controllare che l'utente non metti + caratteri di quanto ne può contenere la variabile "prova" ? :dhò: :cry:

Non usi la scanf.

1) Utilizzi una corrispondente funzione "safe" (che effettua tale controllo) che dipende dalle librerie del compilatore che usi ...

2) Ne scrivi una tua che effettui i controlli carattere per carattere.

MItaly
09-05-2006, 18:28
Tra parentesi è abbastanza chiaro il perché non ti abbia dato un segmentation fault: la memoria che hai utilizzato era poca, e per di più stavi scrivendo nello heap, piuttosto capiente.

ascatem2
09-05-2006, 20:30
io sono alle superiori, ma mi hanno consigliato di usare fgets() per leggere le stringhe.....sarebbe una funzione per i file, ma come stream gli dai stdin e sei apposto :)

86frame
09-05-2006, 22:26
GRAZIE a tutti per le rsp...proverò e vi farò sapere..... :smack: :zizi: :yuppi:

Loading