2013-06-22 32 views
11

Zastanawiam się dlaczego gcc (4.6.3) daje mi żadnego ostrzeżenia dla martwy kod w poniższym przykładzie:gcc nie ostrzega o martwy kod

#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; 
} 

pamiętać, że cel wadliwego status() funkcja miała utrzymywać status. Spodziewałem się ostrzeżenia o tym z -Wall. Próbowałem również -Wunreachable-code, -Wextra, i -ansi (jak to zostało omówione here). Jednak żadne z nich nie daje mi ostrzeżenia.

Wygląda, że ​​gcc po cichu usuwa przypisanie zmiennej statycznej.

Moim zdaniem opcje gcc -Wall -Werror powinny spowodować błąd.

Odpowiedz

0

Nie ma błędu w kodzie .. Używasz powrotu, aby program opuścił status funkcji i nie osiągnął first_time = 0, ale nie ma błędu dla gcc, ponieważ celem powrotu jest nieosiągnięcie niektórych część kodu. exemple:

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 
} 

Więc w tym exemple powrót słowo kluczowe jest wykorzystanie do zatrzymania programu, jeśli warunek jest źle;)

+1

Ale first_time = 0 Przyporządkowanie nigdy nie może być osiągnięty. Jaki jest cel - kod Wunreachable, jeśli nie podnosi ostrzeżenia o kodzie unreachalbe? –

+2

Również twój przykład jest inny. Twój "kod" może być osiągnięty, w zależności od wartości argc. –

0

gcc ma dziesiątki podań - zobaczyć je spróbować kompilacji z przełącznikami jak

-da -dAp -wa, -a -fdump-ipa-wszystko-wszystko -fdump-tree-wszystko-wszystko -fdump-RTL-wszystko-wszystko

Domyślam się, że niektórzy wprost zrobiła martwy -kodowanie kodów przed wyznaczoną przepustką do wydania danego ostrzeżenia. Które można rozsądnie uznać za błąd, ale prawdopodobnie zespół gcc traktuje ostrzeżenie bardziej jako udogodnienie niż moralne zobowiązanie i nie jest zmotywowany do wykonania dużej pracy, aby było ono precyzyjne i kompletne. Jeśli chcesz wnieść swój wkład, możesz wyłączyć optymalizację, przechodząc kolejno jeden po drugim, dopóki nie znajdziesz tego, który blokuje ostrzeżenie, a następnie zgłoś błąd raportujący problem. Jeśli to nie jest warte twojego czasu, może naprawienie go nie jest warte poświęcenia czasu. :-)

15

gcc 4.4 da ci ostrzeżenie. W późniejszych wersjach gcc ta funkcja (kod Wunreachable) została usunięta.

Zobacz tutaj: http://gcc.gnu.org/ml/gcc-help/2011-05/msg00360.html

+6

Nienawidzę tego, gdy usuwa funkcje oparte na takich powodach. I robi to potajemnie ... * "Kompilator nadal akceptuje i ignoruje opcję wiersza poleceń " * Po aktualizacji kompilatora mieliśmy błąd, którego można by uniknąć, gdyby kompilator ostrzegł ... – Calmarius