View Full Version : [c] stack smashing detected
ciao a tutti,
volevo chiedere se qualcuno sa dirmi perche la seguente porzione di codice mi da come errore stack smashing detected quando provo a eseguirlo.
do{
printf("massimo 11 caratteri");
scanf("%s", x);
}
while(strlen(x) >= 11)
ifp=fopen(x,"r");
if(ifp == NULL)
exit(1);
piu precisamente se inserisco molti caratteri(40/50 circa) il programma mi fa reinserire i dati (giustamente), ma quando poi provo a inserire il nome di un file esistente mi da questo errore.
la variabile x in questo caso non è stata allocata dinamicamente...se la alloco dinamicamente mi esce fuori come errore *** glibc detected *** ./prova: free():invalid next size (normal): 0x0000000000628030 ***
maulattu
12-09-2010, 19:07
ciao a tutti,
volevo chiedere se qualcuno sa dirmi perche la seguente porzione di codice mi da come errore stack smashing detected quando provo a eseguirlo.
do{
printf("massimo 11 caratteri");
scanf("%s", x);
}
while(strlen(x) >= 11)
ifp=fopen(x,"r");
if(ifp == NULL)
exit(1);
piu precisamente se inserisco molti caratteri(40/50 circa) il programma mi fa reinserire i dati (giustamente), ma quando poi provo a inserire il nome di un file esistente mi da questo errore.
la variabile x in questo caso non è stata allocata dinamicamente...se la alloco dinamicamente mi esce fuori come errore *** glibc detected *** ./prova: free():invalid next size (normal): 0x0000000000628030 ***
puoi riportare come è stata dichiarata la variabile "x"?
Se la dichiari come "char x[32]" e inserisci una stringa di più di 31 caratteri allora è normale quell'errore...
la variabile e' stata dichiarata cosi:
char x[11];
ma cmq c'e il while che controlla che il numero di lettere in x sia < 11, e in caso contrario mi fa reinserire il nome del file :D
il problema sta secondo me nel fopen, xke se inserisco prima 50 caratteri ad esempio, e poi inserisco un nome del file esistente, e quindi corretto mi esce fuori stack smashing detected.
il problema e' che nn so cm risolvere questo...mmm...problema :D
Teo@Unix
12-09-2010, 21:50
la variabile e' stata dichiarata cosi:
char x[11];
ma cmq c'e il while che controlla che il numero di lettere in x sia < 11, e in caso contrario mi fa reinserire il nome del file :D
il problema sta secondo me nel fopen, xke se inserisco prima 50 caratteri ad esempio, e poi inserisco un nome del file esistente, e quindi corretto mi esce fuori stack smashing detected.
il problema e' che nn so cm risolvere questo...mmm...problema :D
Non importa se tu controlli il numero di caratteri con strlen() perchè la sovrascrittura avrà già avuto luogo.
La funzione scanf() è pericolosa ed il suo utilizzo è sconsigliato. Nell'atto della chiamata a scanf() avrai un overrun se vengono inseriti più byte della dimensione del buffer "x".
Il fatto che è la free(), che prob. hai messo in coda, a segnalarti ciò, è perchè la free andando a liberare la memoria del buffer, trova nell'header "dell'heap buffer" (probabilmente) valori inattesi.....
Se vuoi utilizzarla comunque puoi utilizzare una stringa di formato di questo tipo per un buffer di 32 byte:
scanf("31%s",x);
Quindi in caso di stringa troppo lunga si avrà un troncamento ma la memoria contigua al buffer rimarrà intonsa.
Se la lunghezza massima non è nota, puoi utilizzare i flag di scanf() di cui onestamente non ricordo quali siano esattamente nel tuo caso, ma lo trovi su qualsiasi manuale....
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.