gpt4 book ai didi

c - 关于 GCC 优化器的问题以及为什么这段代码总是返回 42?

转载 作者:太空狗 更新时间:2023-10-29 17:21:05 32 4
gpt4 key购买 nike

我最近遇到了一个错误,其中在 switch 语句中初始化了一个变量。我开始更多地研究这个问题,并意识到我不知道 GCC 在其中一些优化中试图做什么。

Given this code:

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

生成的代码总是返回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

最佳答案

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

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

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

int y = 24; 从未被使用,因为它从未到达,编译器可以优化它,并且由于默认情况下有 UB,它还不如返回 42。

要解决此问题并按照我怀疑的方式运行,您只需在 switch 语句之外声明 y

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

关于c - 关于 GCC 优化器的问题以及为什么这段代码总是返回 42?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54587269/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com