I wonder why gcc (4.6.3) gives me no warning for the unreachable code in this example:
#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;
}
Note, the purpose of the faulty status()
function was to maintain a status. I had expected to get a warning for this with -Wall
. I tried also -Wunreachable-code
, -Wextra
, -pedantic
and -ansi
(as it was discussed here). Yet, none of those give me a warning.
It appears gcc silently removes the static variable assignment.
In my opinion gcc options -Wall -Werror
should throw an error.
gcc 4.4 will give you warning. In the later versions of gcc this feature (Wunreachable-code) has been removed.
See here: http://gcc.gnu.org/ml/gcc-help/2011-05/msg00360.html
There is no mistake in your code.. You use return so the programme leave the function status and don't reached first_time = 0 but there is no mistake for gcc because the goal of a return is to not reached some part of code. An exemple:
So in this exemple the keyword return is use to stop the programme if a condition is bad ;)
gcc has dozens of passes -- to see them try compiling with switches like
-da -dAp -Wa,-a -fdump-ipa-all-all -fdump-tree-all-all -fdump-rtl-all-all
My guess is that some pass has done dead-code elimination before the pass designated to issue the warning in question. Which could reasonably be considered a bug, but likely the gcc team regard the warning more as a convenience than a moral commitment, and aren't motivated to do a lot of work to make it precise and complete. If you want to contribute, you could disable optimization passes one-by-one until you find the one preventing the warning, then file a bug report documenting the problem. If that isn't worth your time, maybe fixing it isn't worth their time. :-)