gpt4 book ai didi

c - GCC优化标志问题

转载 作者:行者123 更新时间:2023-11-30 20:53:49 24 4
gpt4 key购买 nike

我在使用 gcc 编译器构建的一些 C 代码时遇到问题。相关代码有一个枚举,其值用作 switch 语句中的情况来配置对象。相当标准的东西。

当我使用 -O0 选项标志编译代码时,一切都会正确构建和运行,没有问题。但是,当该标志设置为 -O2 时,代码不再按预期工作。

当我单步执行代码并监视局部变量时,枚举(应该只是三个枚举值之一)实际上是 -104!这会导致程序无法配置对象。

有没有人遇到过这种情况,可以提供一些指导吗?我以前没有遇到过这种情况,如果有人能解释为什么编译器会这样做,以便我可以进行任何必要的更改,我将不胜感激。

相关代码片段:

value = 0u;

switch(test_config) {
case DISABLE:
break;

case INTERNAL:
value = 1u;
break;

case EXTERNAL:
value = 2u;
break;

default:
valid = FALSE;
break;
}

if (valid) {
configure_test(value);
}

有问题的枚举:

typedef enum  {
DISABLE,
INTERNAL,
EXTERNAL
} test_config_t;

这是导致问题的代码。我最初没有包含它,因为我不希望问题是“请修复我的代码”,而是我一直在谷歌搜索寻找为什么 gcc 优化标志会对同一段代码产生不同结果的原因,但没有找到任何东西特别有帮助。另外,我不在电脑前,不得不在手机上输入此内容,这也没有帮助。所以我来到这里是因为这里的专家比我懂得更多,可以为我指明正确的方向。

我可能应该包含一些更多信息。该代码在硬件上运行,这也可能是问题所在,我也在研究这个问题。从 FSBL 运行时,代码适用于 -O0,但不适用于 -O2。所以它可能是硬件,但我不知道为什么它以一种方式工作而不是另一种方式。

最佳答案

您没有提供足够的详细信息(因为您的问题没有显示任何实际代码,所以它应该有一些 MCVE ),但您很可能有一些 undefined behavior你应该是scared .

请记住C11C99 (像大多数 programming languages 一样)是由用英语编写的显式规范(不仅是通过在代码中观察到的具体行为)定义的,并且部分定义了运行时行为有效的 C 程序。阅读 n1570 .

我强烈建议阅读 Lattner 的博客 What Every C programmer should know about Undefined Behavior在接触或编译源代码之前。

我建议至少使用(几乎)所有警告和调试信息进行编译,例如使用gcc -Wall -Wextra -g,然后改进代码以消除警告,并在gdb调试器和valgrind下运行它。 。了解更多关于 Invoking GCC 。您也可以(暂时)使用一些 sanitizer instrumentation options ,特别是 -fsanitize=undefined-fsanitize=address。您还可以将 -std=gnu99-pedantic 添加到编译器标志中。请注意 gdb watchpoints是一个非常有用的调试器功能,可用于查找值已更改或意外的原因。

当您为发布版本或启用优化的基准测试进行编译时,还请保留警告标志(因此请使用 gcc -O2 -Wall -Wextra 进行编译);优化可能会发出额外的警告,您也应该纠正这些警告。顺便说一句,GCC同时接受 -O2-g

当您发现此类问题时,请在怀疑编译器之前先质疑自己的代码
(因为编译器经过了很好的测试;在近 40 年的编程生涯中,我只发现了一个编译器错误)。

关于c - GCC优化标志问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45297302/

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