Почему 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 считает предупреждение более удобным, чем моральное обязательство, и не мотивировано делать много работы, чтобы сделать его точным и полным. Если вы хотите внести свой вклад, вы можете отключить оптимизацию, пропуская один за другим, пока не найдете тот, который предотвращает предупреждение, а затем создайте отчет об ошибке, документирующий проблему. Если это не стоит вашего времени, возможно, исправление не стоит их времени.: -)