|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Junior Member
Iscritto dal: Jun 2010
Messaggi: 24
|
[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. Codice:
do{ printf("massimo 11 caratteri"); scanf("%s", x); } while(strlen(x) >= 11) ifp=fopen(x,"r"); if(ifp == NULL) exit(1); 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 *** Ultima modifica di Cisky89 : 12-09-2010 alle 17:09. |
![]() |
![]() |
![]() |
#2 | |
Senior Member
Iscritto dal: Mar 2005
Città: ~
Messaggi: 740
|
Quote:
Se la dichiari come "char x[32]" e inserisci una stringa di più di 31 caratteri allora è normale quell'errore...
__________________
Ciao ciao cagnolino Billy ![]() ![]() ![]() MacMini late 2009, 2.53GHz, 4GB ram, 320GB hard disk, Snow Leopard 10.8.2 - iPod Nano 6th gen. XBOX Live GamerTag: InsaneMau |
|
![]() |
![]() |
![]() |
#3 |
Junior Member
Iscritto dal: Jun 2010
Messaggi: 24
|
la variabile e' stata dichiarata cosi:
Codice:
char x[11]; ![]() 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 ![]() |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
Quote:
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: Codice:
scanf("31%s",x); 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.... Ultima modifica di Teo@Unix : 13-09-2010 alle 12:44. |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:45.