gpt4 book ai didi

c - 使用 volatile 限定符可以抑制编译器警告

转载 作者:行者123 更新时间:2023-12-01 16:35:00 25 4
gpt4 key购买 nike

今天我正在检查一个人的代码,他在其中声明了一个变量 volatile 。在询问时,他告诉我这会在某些系统上产生奇怪的行为。

在删除 volatile 并编译时,它产生了此编译器警告

iteration 2 invokes undefined behavior [-Waggressive-loop-optimizations]

该代码与下面的代码非常相似,数组被越界访问。由于他使用了不同的代码库,其中 Makefile 不同,因此他的系统上没有生成此警告。

int a[4]={1,2,3,4};
int i; //when declared volatile int i, doesn't produce warning
i=0;
while(i<5) {
printf("%d\t", a[i]); //a[4] will invoke undefined behavior
i+=2;
}

现在,我无法弄清楚两件事:

  1. 我应该启用哪些具体的 gcc 标志才能收到此警告?
  2. 为什么将 i 声明为 volatile 会抑制该警告?

最佳答案

当积极的循环优化看到以下代码时...

int i;
i=0;
while(i<5) {
printf("%d\t", a[i]);
i+=2;
}

...它将使用一种称为“循环展开”的技术来重写它,如下所示...

printf("%d\t", a[0]);
printf("%d\t", a[2]);
printf("%d\t", a[4]);

问题!迭代 0 和 1 没问题,但迭代 2 将执行越界数组访问,从而调用未定义的行为。这就是您收到警告的原因。

i声明为 volatile 会阻止编译器进行此优化(因为它无法确定另一个进程没有修改的值i 在循环执行期间),所以它必须保持代码原样。您仍然有未定义的行为,只是编译器没有警告您。总而言之,这是你同事的一次糟糕的“修复”。

关于c - 使用 volatile 限定符可以抑制编译器警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53343882/

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