Почему GCC не предупреждает о недоступном коде?

Интересно, почему gcc (4.6.3) не дает мне предупреждения о недоступном коде в этом примере:

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

Обратите внимание, что целью ошибочной функции status() было сохранение статуса. Я ожидал получить предупреждение об этом с -Wall. Я пробовал также -Wunreachable-code, -Wextra, -pedantic и -ansi (как обсуждалось здесь). Тем не менее, никто из них не дает мне предупреждение.

Похоже, gcc молча удаляет назначение статической переменной.

На мой взгляд, gcc options -Wall -Werror должен -Wall -Werror ошибку.

Ответ 1

GCC 4.4 даст вам предупреждение. В более поздних версиях gcc эта функция (-Wunreachable-code) была удалена.

Смотрите здесь: http://gcc.gnu.org/ml/gcc-help/2011-05/msg00360.html

Код -Wunreachable-code был удален, поскольку он был нестабильным: он опирался на оптимизатор, и поэтому разные версии gcc предупреждали бы о различном коде. Компилятор по-прежнему принимает и игнорирует параметр командной строки, чтобы существующие Make файлы не были повреждены. В некоторых будущих выпусках опция будет полностью удалена.

Ян

Ответ 2

В вашем коде нет ошибки. Вы используете return, чтобы программа оставила статус функции и не достигла first_time = 0, но ошибки gcc нет, потому что цель возврата - не достичь некоторой части кода. Пример:

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
}

Итак, в этом примере ключевое слово return используется для остановки программы, если условие плохое;)

Ответ 3

gcc имеет десятки проходов - чтобы увидеть, как они пытаются скомпилировать с помощью таких переключателей, как

-da -dAp -Wa, -a -fdump-ipa-all-all -fdump-tree-all-all -fdump-rtl-all-all

Моя догадка заключается в том, что какой-то прогон завершил удаление мертвого кода перед проходом, предназначенным для выдачи соответствующего предупреждения. Который можно разумно считать ошибкой, но, скорее всего, команда gcc считает предупреждение более удобным, чем моральное обязательство, и не мотивировано делать много работы, чтобы сделать его точным и полным. Если вы хотите внести свой вклад, вы можете отключить оптимизацию, пропуская один за другим, пока не найдете тот, который предотвращает предупреждение, а затем создайте отчет об ошибке, документирующий проблему. Если это не стоит вашего времени, возможно, исправление не стоит их времени.: -)