Entrambe le parti precedenti la revisioneRevisione precedenteProssima revisione | Revisione precedente |
informatica:sol:laboratorio16:esercitazionib:esercitazione2 [25/02/2016 alle 11:51 (10 anni fa)] – [Esercitazione 2] Susanna Pelagatti | informatica:sol:laboratorio16:esercitazionib:esercitazione2 [03/03/2016 alle 08:23 (10 anni fa)] (versione attuale) – [Esercizio 1: preprocessing, compilazione e linking] Susanna Pelagatti |
---|
| |
| |
===== Esercizio 1: preprocessing, compilazione e linking ===== | ===== Esercizio 1: Preprocessing, compilazione e linking ===== |
Seguire l'esempio dei lucidi visti nella lezione di proprocessing, compilazione e linking verificando i vari passi utilizzando il programma esempio presentato ed i comandi descritti nei {{:informatica:sol:laboratorio15:esercitazionib:c006prepcomplinkong.pdf|lucidi presentati a lezione}} | Seguire l'esempio dei lucidi visti nella lezione di proprocessing, compilazione e linking verificando i vari passi utilizzando il programma esempio presentato ed i comandi descritti nei {{:informatica:sol:laboratorio15:esercitazionib:c006prepcomplinkong.pdf|lucidi presentati a lezione}} |
| |
===== Esercizio 2: verificare gli accessi in memoria: valgrind ===== | ===== Esercizio 2: Creare ed usare una libreria di liste ===== |
| |
Verificare la correttezza degli accessi ai puntatori compiuti dalle funzioni su liste di interi della libreria libList.a utilizzando ''valgrind''. | Realizzare una libreria che fornisce le operazioni su liste implementate negli esercizi 2 e 3 dell'[[informatica:sol:laboratorio16:esercitazionib:esercitazione1|esercitazione 1.]] |
Questo strumento permette fra l'altro di capire se tutte le variabili sono inizializzate prima del loro uso, se accediamo a memoria gia' deallocata o mai allocata e situazioni similari | |
| In C tipicamente per realizzare una libreria si difinisce un file ''.h'' con i prototipi ed i tipi messi a disposizione dalla libreria e si fornisce il codice pre-compilato in un opportuno file di libreria ''.a''. |
| |
| Nel nostro caso l'header si chiamera' ''lista.h'' e la libreria si chiamera' ''libList.a''. |
| |
Per fare questo procedere come segue: | Procedere nel modo seguente: |
* compilare il file da verificare con opzione ''-g'' per includere le informazioni di debugging. Ad esempio se il mio file si chiama ''main.c'' posso compilare con | |
| * Definire un file ''lista.h'' che contiene i tipi ed i prototipi delle funzioni implementate |
| * Definire un file ''lista.c'' che contiene il codice che implementa le funzioni. |
| * Generare il modulo oggetto ''lista.o'' da inserire nella libreria con il comando ''gcc'' come segue |
<code> | <code> |
bash$ gcc -Wall -pedantic -g -o prova main.c | $ gcc -Wall -pedantic -c lista.c |
</code> | </code> |
* eseguire | * Creare la libreria con i lcomando ''ar'' come segue |
<code> | <code> |
bash$ valgrind ./prova | $ ar -r libList.a lista.o |
</code> | </code> |
in questo modo, a schermo verranno riportare le infrazioni rilevate. Ad esempio, //invalid read// o //invalid write// sono accessi in lettura o scrittura a memoria non allocata o gia' deallocata. | |
| Quando la creazione e' andata a buon fine creare un file ''main.c'' che contenga uno dei main di test sviluppati negli esercizi precedenti e compilarlo utilizzando la libreria. In particolare : |
| * il main di test dovra' includere il file ''lista.h'' |
| * in fase di compilazione utilizzare la libreria sviluppata con |
| <code> |
| $ gcc -Wall -pedantic main.c -lList -L. |
| </code> |
| dove l'opzione ''-l'' indica il nome della libreria da usare in fase di linking e l'opzione ''-L'' specifica la directory dove cercarla (oltre alle directory standard tipo ''/usr/lib''). |
| . |
| |
===== Esercizio 3: Manipolare ''errno'' e uso di ''perror()'' ===== | ===== Esercizio 3: Manipolare ''errno'' e uso di ''perror()'' ===== |
Ripetere l'esecizio 4 utilizzando la funzione ''rand_r()''. A che serve questa funzione ? Quali sono le principali differenze ? (//Suggerimento//: partire dall'analisi accurata del ''man'') | Ripetere l'esecizio 4 utilizzando la funzione ''rand_r()''. A che serve questa funzione ? Quali sono le principali differenze ? (//Suggerimento//: partire dall'analisi accurata del ''man'') |
| |
===== Esercizio 6: Libreria di liste ===== | ===== Esercizio 6: Verificare gli accessi in memoria: valgrind ===== |
| |
Realizzare una libreria che fornisce le operazioni su liste implementate negli esercizi 2 e 3 dell'[[informatica:sol:laboratorio16:esercitazionib:esercitazione1|esercitazione 1.]] | Verificare la correttezza degli accessi ai puntatori compiuti dalle funzioni su liste di interi della libreria libList.a utilizzando ''valgrind''. |
| Questo strumento permette fra l'altro di capire se tutte le variabili sono inizializzate prima del loro uso, se accediamo a memoria gia' deallocata o mai allocata e situazioni similari |
In C tipicamente per realizzare una libreria si difinisce un file ''.h'' con i prototipi ed i tipi messi a disposizione dalla libreria e si fornisce il codice pre-compilato in un opportuno file di libreria ''.a''. | |
| |
Nel nostro caso l'header si chiamera' ''lista.h'' e la libreria si chiamera' ''libList.a''. | |
| |
Procedere nel modo seguente: | Per fare questo procedere come segue: |
| * compilare il file da verificare con opzione ''-g'' per includere le informazioni di debugging. Ad esempio se il mio file si chiama ''main.c'' posso compilare con |
* Definire un file ''lista.h'' che contiene i tipi ed i prototipi delle funzioni implementate | |
* Definire un file ''lista.c'' che contiene il codice che implementa le funzioni. | |
* Generare il modulo oggetto ''lista.o'' da inserire nella libreria con il comando ''gcc'' come segue | |
<code> | <code> |
$ gcc -Wall -pedantic -c lista.c | bash$ gcc -Wall -pedantic -g -o prova main.c |
</code> | </code> |
* Creare la libreria con i lcomando ''ar'' come segue | * eseguire |
<code> | <code> |
$ ar -r libList.a lista.o | bash$ valgrind ./prova |
</code> | </code> |
| in questo modo, a schermo verranno riportare le infrazioni rilevate. Ad esempio, //invalid read// o //invalid write// sono accessi in lettura o scrittura a memoria non allocata o gia' deallocata. |
Quando la creazione e' andata a buon fine creare un file ''main.c'' che contenga uno dei main di test sviluppati negli esercizi precedenti e compilarlo utilizzando la libreria. In particolare : | |
* il main di test dovra' includere il file ''lista.h'' | |
* in fase di compilazione utilizzare la libreria sviluppata con | |
<code> | |
$ gcc -Wall -pedantic main.c -lList -L. | |
</code> | |
dove l'opzione ''-l'' indica il nome della libreria da usare in fase di linking e l'opzione ''-L'' specifica la directory dove cercarla (oltre alle directory standard tipo ''/usr/lib''). | |
. | |
| |
| |