Why does GCC not warn for unreachable code?

主宰稳场 提交于 2019-11-27 07:36:02

问题


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.


回答1:


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

The -Wunreachable-code has been removed, because it was unstable: it relied on the optimizer, and so different versions of gcc would warn about different code. The compiler still accepts and ignores the command line option so that existing Makefiles are not broken. In some future release the option will be removed entirely.

Ian




回答2:


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. :-)



来源:https://stackoverflow.com/questions/17249934/why-does-gcc-not-warn-for-unreachable-code

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!