2013-06-22 21 views
11

Mi chiedo perché gcc (4.6.3) mi dà nessun avvertimento per il codice irraggiungibile in questo esempio:gcc non avvisa il codice irraggiungibile

#include <stdio.h> 

int status(void) 
{ 
    static int first_time = 1; 

    if (first_time) { 
     return 1; 
     first_time = 0; /* never reached */ 
    } else { 
     return 0; 
    }  
} 

int main(int argc, const char *argv[]) 
{ 
    printf("first call %d\n", status()); 
    printf("second call %d\n", status()); 
    return 0; 
} 

nota, lo scopo del guasto status() la funzione era mantenere uno stato. Mi aspettavo di ricevere un avviso per questo con -Wall. Ho provato anche -Wunreachable-code, -Wextra, -pedantic e -ansi (come è stato discusso here). Eppure, nessuno di questi mi dà un avvertimento.

Sembra che gcc rimuova silenziosamente l'assegnazione della variabile statica.

A mio parere le opzioni gcc -Wall -Werror dovrebbero generare un errore.

risposta

0

v'è alcun errore nel codice .. si utilizza di ritorno in modo che il programma di lasciare lo stato della funzione e non ha raggiunto first_time = 0, ma non v'è alcun errore per gcc perché l'obiettivo di un ritorno è quello di non raggiunta una certa parte del codice. Un esempio:

int  main(int argc, char **argv) 
{ 
    if (argc != 2) 
     return (-1); 
    //many code 
    //many code 
    //many code 
    //many code 
    //many code 
    //many code 
    //many code 
    //many code 
    //many code 
} 

Quindi, in questo exemple il ritorno parola chiave è utilizzato per fermare il programma se una condizione è male;)

+1

Ma la first_time = 0 assegnazione non può mai essere raggiunto. Qual è lo scopo di -Wunreachable-code, se non solleva alcun avviso per codice unreachalbe come questo? –

+2

Anche il tuo esempio è diverso. Il tuo "codice numeroso" può essere raggiunto, a seconda del valore di argc. –

0

gcc ha decine di passaggi - per vederli provare a compilare con opzioni come

-da -dAp -Wa, -a -fdump-ipa-tutto-tutto -fdump-tree-tutto-tutto--fdump RTL-tutto-tutto

La mia ipotesi è che alcuni passaggio ha fatto morti -codifica del codice prima della tessera designata per emettere l'avvertenza in questione. Quale potrebbe ragionevolmente essere considerato un bug, ma probabilmente il team di gcc considera l'avvertimento più come una convenienza che un impegno morale, e non è motivato a fare molto lavoro per renderlo preciso e completo. Se si desidera contribuire, è possibile disabilitare i passaggi di ottimizzazione uno a uno finché non si individua quello che impedisce l'avviso, quindi presentare una segnalazione relativa al problema. Se questo non vale il tuo tempo, forse aggiustarlo non vale il loro tempo. :-)

15

gcc 4.4 ti avviserà. Nelle versioni successive di gcc questa funzione (codice Wunreachable) è stata rimossa.

vedere qui: http://gcc.gnu.org/ml/gcc-help/2011-05/msg00360.html

+6

Odio quando rimuovono le funzionalità in base a ragioni del genere. E facendo in modo nascosto ... * "Il compilatore accetta e ignora l'opzione della riga di comando " * Quindi, dopo un aggiornamento del compilatore, abbiamo riscontrato un errore, che avrebbe potuto essere evitato se il compilatore avesse avvertito ... – Calmarius