Scoprire gli errori in semplici programmi in C
 |
A cura di Di Fusco Francesco 2011-02-12 |
Gli avvertimenti del compilatore sono un aiuto essenziale quando si programma in C e C++. Per dimostrare ciò, il programma seguente contiene un errore subdolo: usa la funzione printf incorrettamente, specificando un formato floating-point '%f' per un valore intero:
// prova_errore.c
#include < stdio.h >
#include < stdio.h >
int main()
{
printf("Due + Due = %f",4);
return 0;
}
Questo errore non è ovvio a prima vista, ma può essere scoperto dal compilatore se l'opzione di avvertimento -Wall è stata abilitata.
Compilando il programma precedente prova_errore.c con l'opzione di warning1 produce il seguente messaggio:
gcc -Wall prova_errore.c -o prova_errore.exe
prova_errore.c: In function ‘main’:
prova_errore.c:5: warning: format ‘%f’ expects type ‘double’, but argument 2 has type ‘int’
Questo indica che una stringa di formato è stata usata non correttamente nel file prova_errore.c alla riga 5. I messaggi prodotti da gcc hanno sempre la forma:
file:numero-riga:messaggio
Il compilatore distingue tra messaggi di errore, che impediscono la compilazione con successo, ed i messaggi di warning che indicano possibili problemi (ma che comunque non interrompono la compilazione).
In questo caso, il corretto specificatore di formato dovrebbe essere '%d' per un argomento intero. Senza l'opzione di warning -Wall il programma sembra essere stato compilato senza problemi, ma produce risultati non corretti:
gcc prova_errore.c -o prova_errore.exe
./prova_errore.exe
Due + Due = 0.000000
L'errato specificatore di formato fa in modo che l'output sia corretto, perché alla funzione printf viene passato un intero invece di un numero floating-point1. I numeri interi ed i numeri floating point sono memorizzati in formati differenti in memoria, e generalmente occupano un differente numero di byte, portando ad un risultato spurio.
Chiaramente è molto pericoloso sviluppare un programma senza controllare gli avvertimenti del compilatore. Delle funzioni che non sono usate correttamente, possono causare il crash del programma oppure produrre risultati non corretti.
Abilitare l'opzione di warning del compilatore -Wall catturerà molti degli errori più comuni che si verificano nella programmazione in C.
|
|
|
Documenti allegati: |
gcc_warning.pdf |
prova_errore.c |