Strumenti Utente

Strumenti Sito


informatica:sol:laboratorio11:esercitazioni:esercitazione3

Differenze

Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.

Link a questa pagina di confronto

Entrambe le parti precedenti la revisioneRevisione precedente
Prossima revisione
Revisione precedente
informatica:sol:laboratorio11:esercitazioni:esercitazione3 [01/03/2011 alle 16:54 (15 anni fa)] – [Esercizio 1. Liste generiche in C] Susanna Pelagattiinformatica:sol:laboratorio11:esercitazioni:esercitazione3 [21/03/2011 alle 16:01 (14 anni fa)] (versione attuale) – [Esercizio 5. Approfondiamo l'uso di valgrind (e alcune opzioni utili di gcc ...)] Susanna Pelagatti
Linea 1: Linea 1:
 +====== Esercitazione 3 ======
 +
 +Dove si approfondisce la conoscenza delle fasi di preprocessing, compilazione e linking, si prova ad implementare delle liste generiche in C e si studiano piu' approfonditamente le caratteristiche dei ''valgrind'' ed alcune opzioni di ''gcc''. Rassegnadoci all'idea che un programmo che passa tutti test puo' nondimeno essere scorretto ....
 +
 ===== Esercizio 1: Getting started -- Preprocessing, compilazione e linking ===== ===== Esercizio 1: Getting started -- Preprocessing, compilazione e linking =====
-0.1) Compilare ed eseguire il seguente programma:+1) Compilare ed eseguire il seguente programma:
 <code c> <code c>
 #include <stdio.h> #include <stdio.h>
Linea 18: Linea 22:
 Chi segnala un errore? E' fallita la fase di preprocessing, la compilazione o il linking? Cosa contine il modulo oggetto se specifico l'opzione -c? Come si risolve il problema? Chi segnala un errore? E' fallita la fase di preprocessing, la compilazione o il linking? Cosa contine il modulo oggetto se specifico l'opzione -c? Come si risolve il problema?
  
-0.2) Cosa accade se eliminiamo la linea+2) Cosa accade se eliminiamo la linea
 <code c> <code c>
 #include <math.h> #include <math.h>
Linea 24: Linea 28:
 ? A questo punto cosa va storto? Sapete interpretare i messaggi a video e stabilire chi li ha scritti e perche'? Viene generato l'eseguibile? ? A questo punto cosa va storto? Sapete interpretare i messaggi a video e stabilire chi li ha scritti e perche'? Viene generato l'eseguibile?
  
-0.3) Generare il modulo oggetto con+3) Generare il modulo oggetto con
 <code> <code>
 gcc -Wall -pedantic -c ff.c gcc -Wall -pedantic -c ff.c
Linea 31: Linea 35:
 Utilizzare //objdump, nm, readelf// per capire cosa contengono la tabella di rilocazione, la tabella dei simboli esportati ed esterni, le sezioni data, BSS e codice. (utilizzare il man e cercare su google). Utilizzare //objdump, nm, readelf// per capire cosa contengono la tabella di rilocazione, la tabella dei simboli esportati ed esterni, le sezioni data, BSS e codice. (utilizzare il man e cercare su google).
  
-0.4) Usare l'opzione //-E// e la //-S// del gcc: che cosa succede? Cosa accade specificando il flag -g assieme a -S? +4) Usare l'opzione //-E// e la //-S// del gcc: che cosa succede? Cosa accade specificando il flag -g assieme a -S? 
  
-===== Esercizio 2: Makefile per la libreria di liste ===== 
-Con riferimento agli esercizi 1 e 3 della [[informatica:sol:laboratorio11:esercitazioni:esercitazione1|esercitazione 1 ]], definire un file Makefile che contenga  
-  * le regole per generare correttamente main.o e lista.o  
-  * la regola PHONY ''lib'' per generare correttamente la libreria libList.a 
-  * la regola per generare l'eseguibile a partire da oggetti e librerie 
-  * un target PHONY ''cleanall'' che elimini gli oggetti e gli eseguibili 
  
-utilizzare dove possibile le regole implicite, le variabili e le convenzioni viste a lezione. Usare ''gcc -MM'' per generare automaticamente le liste di dipendenze per i target relativi ai moduli oggetto. 
  
-===== Esercizio 4: Macro con parametri, macro di somma =====+ 
 +===== Esercizio 2: Macro con parametri, macro SOMMA =====
 Usare le macro con parametri per definire una macro che somma (operatore +) i propri argomenti Usare le macro con parametri per definire una macro che somma (operatore +) i propri argomenti
 <code c> <code c>
Linea 54: Linea 52:
  
  
-===== Esercizio 5: Macro con parametri, macro fattoriale =====+===== Esercizio 3: Macro con parametri, macro FATTORIALE =====
  
 Scrivere una macro con parametri che calcoli il fattoriale di un numero N, passato come parametro e ne stampi il risultato. Ad esempio, posso utilizzare la macro per calcolare il fattoriale di 4+1 con Scrivere una macro con parametri che calcoli il fattoriale di un numero N, passato come parametro e ne stampi il risultato. Ad esempio, posso utilizzare la macro per calcolare il fattoriale di 4+1 con
Linea 65: Linea 63:
 FATTORIALE(FATTORIALE(4+1))  FATTORIALE(FATTORIALE(4+1)) 
 </code> </code>
 +===== Esercizio 4. Liste generiche in C =====
 +
 +In questo esercizio si richiede di realizzare alcune funzioni che lavorano su liste generiche in C. Una lista generica e' rappresentata con la seguenti struct
 +<code c>
 +typedef struct elem {
 +  /** chiave */
 +  void * key;
 +  /** informazione */
 +  struct elem * next;
 +} elem_t;
 +
 +typedef struct {
 +  /** la testa della lista */
 +  elem_t * head;
 +  /** la funzione per confrontare due chiavi */
 +  int (* compare) (void *, void *);
 +  /** la funzione per copiare una chiave */
 +  void * (* copyk) (void *);
 +} list_t;
 +</code>
 +la prima struttura (''elem_t'') rappresenta un nodo della lista generica. Ogni nodo contiene una chiave ''key'' che puo' avere tipo qualsiasi.
 +La seconda struttura (''list_t'') permette di definire una particolare lista a partire da quella generica. Per farlo bisogna fornire due funzioni:
 +  * ''compare'' permette di confrontare due chiavi, ritorna 0 se sono uguali ed un valore diverso da 0 altrimenti
 +  * ''copyk'' crea una copia della chiave (allocando la memoria necessaria) e ritorna il puntatore alla copia (se tutto e' andato bene) o NULL (se si e' verificato un errore)
 +
 +Si chiede di realizzare le funzioni che permettono di creare/distruggere una lista generica e quelle per inserire ed estrarre un elemento generico. 
 +Realizzare un main di test che prova ad istanziare la lista in due versioni: una prima a valori interi usando le seguenti funzioni per il confronto e la copia:
 +<code c>
 +/** funzione di confronto per lista di interi 
 +    \param a puntatore intero da confrontare
 +    \param b puntatore intero da confrontare
 +    
 +    \retval 0 se sono uguali
 +    \retval p (p!=0) altrimenti
 +*/
 +int compare_int(void *a, void *b) {
 +    int *_a, *_b;
 +    _a = (int *) a;
 +    _b = (int *) b;
 +    return ((*_a) - (*_b));
 +}
 +/** funzione di copia di un intero 
 +    \param a puntatore intero da copiare
 +
 +    \retval NULL se si sono verificati errori
 +    \retval p puntatore al nuovo intero allocato (alloca memoria)
 +*/
 +void * copy_int(void *a) {
 +  int * _a;
 +
 +  if ( ( _a = malloc(sizeof(int) ) ) == NULL ) return NULL;
 +
 +  *_a = * (int * ) a;
 +
 +  return (void *) _a;
 +}
 +</code>
 +e una seconda che ha come chiavi stringhe usando analoghe funzioni per la copia ed il confronto.
 +
 +===== Esercizio 5. Approfondiamo l'uso di valgrind (e alcune opzioni utili di gcc ...) =====
 +Compilare ed eseguire il codice seguente usando valgrind
 +<code c>
 +#include <stdio.h>
 +#include <stdlib.h>
 +#include <unistd.h>
 +#include <time.h>
 +#define N 5
 +
 +int main(void)
 +{
 +  int * a;
 +  int i;
 +
 +  if ( ( a = malloc(N*sizeof(int))) == NULL )
 +    return EXIT_FAILURE;
 +  srand(time(NULL));
 +  i=0;
 +  while (i<N)
 +    {
 +     
 +      a[++i]=rand()%2;
 +      printf("iterazione %d\n",i);
 +    }
 +  printf("exiting ...\n");
 +  return EXIT_SUCCESS;
 +}
 +</code>
 +che problemi vengono segnalati ? Perche' ?
 +
 +Provare a compilare (dopo averlo salvato in file.c) usando le seguenti opzioni di "gcc" che permettono di rilevare altri errori statici:
 +<code>
 +bash$ gcc -O -pedantic -Wall -Wextra -Wformat=2 -ggdb -o exe file.c 
 +</code>
 +viene segnato qualcosa ? Perche'
 +
 +Utilizzare le opzioni sopra e valgrind per analizzare il comportamento dei programmi in {{:informatica:sol:laboratorio11:esercitazioni:vgrind.tar|vgrind.tar}}. Alcuni errori sono segnalati dal compilatore, altri da valgrind, altri no nsono segnalati da nessuno dei due, a significare che una programma che compila senza warning e viene eseguito senza proteste da valgrind puo' comunque essere scorretto ... 
 +
 +Attenzione:
 +  * non confondete l'opzione ''-o'' (minuscolo) con l'opzione ''-O'' (maiuscolo)
 +  * la ''-o'' serve a dare un nome specifico al file eseguibile (''exe'' nel comando sopra)
 +  * L'opzione ''-O'' richiede l'esecuzione dell'ottimizzatore del codice, il che ha, come effetto collaterale, quello di permettere la rilevazione di un maggior numero di situazioni che meritano di essere segnalate dalle opzioni di warning.
 +
 +Il ''gcc'' e` un sistema ricco di opzioni (qualche centinaio) le quali possono essere attivate o meno (oltre che esplicitamente a linea di
 +comando) come default a seconda della compilazione a cui il compilatore stesso e` stato sottoposto. Mentre il risultato della compilazione - di
 +un programma corretto ;) - non viene influenzato da un punto di vista funzionale, l'uso di opzioni diverse o di versioni diverse del
 +compilatore puo` comportare una maggiore o minore capacita` di rilevazione di possibili "anomalie" del codice a tempo di compilazione
 +(come anche una diversa capacita` di ottimizzazione - nel tempo o nello spazio - dell'eseguibile prodotto) e addirittura eseguibili con un
 +comportamento funzionalmente diverso se il codice sorgente contiene errori.
 +
 +
informatica/sol/laboratorio11/esercitazioni/esercitazione3.1298998469.txt.gz · Ultima modifica: 01/03/2011 alle 16:54 (15 anni fa) da Susanna Pelagatti

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki