Причина , почему нет предупреждения от пропущенного оператора return
, заключается в том, что это не «неправильно» - стандарт C явно это допускает, и такая программа четко определена; только вы не должны использовать возвращаемое значение, если ни одно из них не было возвращено.
Какими бы ни были предупреждения, которые отправляются по умолчанию, в большинстве случаев это те, которые в стандарте C называются нарушениями ограничений - соответствующий компилятор должен их диагностировать. Следовательно, использование -pedantic-errors
или -std=c17
или подобного ничего не сделает вообще , потому что это делает компилятор более педантичным (то есть, более диагностическим) в отношении следования стандарту C, который говорит, что в конце концов, это нормально.
В GCC предупреждением можно управлять с помощью -Wreturn-type
, который также будет активирован с помощью -Wall
. (Почему вы не используете -Wall
?!):
% echo 'int foo() { }' > noreturn.c && gcc -c -Wreturn-type noreturn.c
noreturn.c: In function ‘foo’:
noreturn.c:1:1: warning: control reaches end of non-void function [-Wreturn-type]
int foo() { }
^~~