PDA

Visualizza la versione completa : [C] Devo fare un programma che va in segmentation fault!


cicciox80
12-06-2008, 10:46
Ciao a tutti, domani devo tenere un seminario su gdb, per dare qualche esempio pratico, vorrei mostrare un semplice programmino che va in segmentation fault (errore di accesso alla memoria), così mostro come trovare con gdb l'errore.

So che la richiesta è un può fuori dal normale (in genere qua si chiede di togliere questi errori!!!)

Qualche idea su quale programma fare? (magari che abbia anche un senso)

thanks!

xam85reBanned
12-06-2008, 11:06
int main(void)
{
char *s = "stringa"; /* s è un puntatore ad una stringa posizionata nel segmento di sola lettura dell'eseguibile.
Quando il programma viene caricato, questo segmento è generalmente mappato dal
sistema operativo in una zona della memoria di sola lettura */

*s = 'a'; /* questo tenta di scrivere nella memoria di sola lettura, causando l'errore di segmentazione */
return 0;
}


Fonte (http://it.wikipedia.org/wiki/Errore_di_segmentazione)

MItaly
12-06-2008, 12:08
char * stringa=NULL;
char stringa2[20];
gets(stringa); /*questo è un segfault sicuro */
gets(stringa2); /*questo pure se superi i 20 caratteri */
scanf("%s",stringa2); /*idem con patate*/

così imparano anche a non usare la gets (in assoluto) e la scanf senza specificare un limite di acquisizione di caratteri. Poi ci sarebbe anche il metodo che io uso per vedere se il compilatore sta compilando per davvero


int * s=NULL;
*s=0;

ma questo credo che sia veramente troppo banale.

GreyFox86
12-06-2008, 12:35
Puoi anche fare un ciclo che scriva dati in un array fin oltre il suo ultimo elemento.

cicciox80
12-06-2008, 17:37
Grazie a tutti, ma mi serviva un problema "più concreto", e sopratutto qualcosa che la gcc -Wall non mi avverte già con un warning :)

pallinopinco
12-06-2008, 17:46
Grazie a tutti, ma mi serviva un problema "più concreto"


Più concreto di esempi (classici) compilabili e "funzionanti"? :confused: Cosa intendi per "concreto"?



e sopratutto qualcosa che la gcc -Wall non mi avverte già con un warning


Ho provato a compilare i codici proposti con l'opzione -Wall di gcc senza ricevere alcun warning.

MacApp
12-06-2008, 19:47
Attento che, il segmentation fault, NON è garantito. Insomma è una "fortuna" se ti capita quando fai eseguire al tuo programma in azione dal risultato indefinito.

MItaly
12-06-2008, 21:13
Originariamente inviato da cicciox80
Grazie a tutti, ma mi serviva un problema "più concreto"
Uno dei problemi di sicurezza più concreti di molte applicazioni è il buffer overflow dato dal non fornire buffer di dimensioni adeguate e dal mancato utilizzo di funzioni "sicure" (come la fgets rispetto alla gets).
Altro esempio:


char stringa[]="Questa è una stringa certamente più lunga di venti caratteri, ne convenite?";
char buffer[20];
strcpy(buffer,stringa);
.

Loading