Skip to content

Flag di Compilazione

Per impostazione predefinita, i compilatori moderni come GCC o Clang sono molto silenziosi e tolleranti: non ottimizzano la velocità del codice e non abilitano controlli di sicurezza extra a meno che non sia tu a chiederlo tramite le Flag di Compilazione.

Esistono flag specifici per diverse fasi dello sviluppo del software:

Durante la stesura del codice, vuoi che il compilatore sia spietato e ti segnali ogni minimo comportamento ambiguo.

  • -Wall: Abilita tutti gli avvisi (Warnings) raccomandati. È essenziale usarlo sempre! Trova problemi comuni come variabili non inizializzate, tipi di ritorno errati e parentesi mancanti.
  • -Wextra: Abilita ulteriori avvisi pignoli che -Wall tralascia, come i parametri delle funzioni mai utilizzati o il confronto tra interi signed e unsigned.
  • -Wshadow: Avvisa quando una variabile locale nasconde (“shadowing”) un’altra variabile con lo stesso nome dichiarata in uno scope superiore. Nota bene: né -Wall né -Wextra attivano questo flag di default, ma è vitale aggiungerlo per evitare bug logici silenziosi e difficili da individuare.
  • -Werror: Tratta tutti gli avvisi come Errori fatali. Se c’è anche solo un avviso, il compilatore rifiuterà di produrre l’eseguibile, costringendoti a scrivere codice pulitissimo.
  • -pedantic: Impone il rigoroso rispetto dello standard C scelto (vietando estensioni personalizzate del compilatore).
  • -std=c17: Forza l’utilizzo dello standard C17.
Terminal window
# Esempio di compilazione super-rigida:
gcc -std=c17 -Wall -Wextra -Wshadow -pedantic -Werror main.c -o main

Quando c’è un bug logico e il programma va in crash, hai bisogno di analizzarlo passo-passo. Per farlo, il compilatore deve incorporare i “simboli di debug” (i nomi originali delle tue variabili e i numeri di riga) all’interno dell’eseguibile.

  • -g (oppure -g3): Inserisce abbondanti informazioni per il debugger (come le macro definite).
  • -O0 (Oh-zero): Disabilita tutte le ottimizzazioni.
Terminal window
gcc -g3 -O0 main.c -o main_debug

Una volta testato a fondo, il software deve essere veloce ed efficiente per l’utente finale.

  • -O2: Applica quasi tutte le ottimizzazioni di velocità e spazio sicure. È lo standard industriale per la produzione.
  • -O3: Ottimizzazioni estreme (potrebbe aumentare le dimensioni dell’eseguibile o sfruttare in modo aggressivo loop unrolling e vettorizzazione).
  • -D_FORTIFY_SOURCE=2: Aggiunge controlli extra di sicurezza contro i Buffer Overflow quando usi funzioni a rischio come memcpy o strcpy.
Terminal window
gcc -O2 -D_FORTIFY_SOURCE=2 main.c -o applicazione_finale

Verifica tu stesso perché i warning sono importanti! In questo codice la variabile x non è inizializzata, e compilandolo senza flag il compilatore passerebbe oltre, stampando “spazzatura”. Immagina che -Wall -Werror sia attivato e correggi il codice (inizializza x, per esempio a 5) in modo che non stampi garbage.