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:57 (15 anni fa)] – [Esercizio 4: Macro con parametri, macro fattoriale] 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 3: 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 4: 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 5. Liste generiche in C =====+===== 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 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
Linea 123: Linea 121:
 </code> </code>
 e una seconda che ha come chiavi stringhe usando analoghe funzioni per la copia ed il confronto. 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.1298998678.txt.gz · Ultima modifica: 01/03/2011 alle 16:57 (15 anni fa) da Susanna Pelagatti

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki