关于GCC Optimizer的问题以及为什么这段代码总是返回42?

Jus*_*rne 6 c optimization gcc

我最近遇到一个错误,在switch语句中初始化了一个变量.我开始玩这个更多,并意识到我不知道GCC在一些优化中试图做的第一件事.

鉴于此代码:

int main(int argc, char** argv) {
       switch (argc) {
               case 1000: return 42;
               int y = 24;
               default: return y;
       }
       return argc;
}
Run Code Online (Sandbox Code Playgroud)

生成的代码总是返回42.发生了什么?为什么int y = 24一切都搞砸了?

$ gcc -Wall -Werror -O2 -c test.c
$ objdump -drwCS -Mintel test.o

testo.o:     file format elf64-x86-64

Disassembly of section .text.startup:

0000000000000000 <main>:
   0:   b8 2a 00 00 00          mov    eax,0x2a
   5:   c3                      ret
Run Code Online (Sandbox Code Playgroud)

小智 4

int main(int argc, char** argv) {
    switch (argc) {
        case 1000: return 42;
        int y = 24;
        default: return y;
    }
    return argc;
}
Run Code Online (Sandbox Code Playgroud)

为了进一步解释这一点,开关并不完全执行线性进程。与此等效的逻辑是:

“如果 argc 为 1000,则返回 42。否则返回 y”

从未使用过,因为它int y = 24;从未达到,编译器可以对此进行优化,并且由于默认情况下有 UB,因此它也可能返回 42。

要解决此问题并按照我怀疑您的意图行事,您只需y在 switch 语句之外进行声明即可。

int main(int argc, char** argv) {
    int y = 24;
    switch (argc) {
        case 1000: return 42;
        default: return y;
    }
    return argc;
}
Run Code Online (Sandbox Code Playgroud)