【发布时间】:2024-01-05 12:37:01
【问题描述】:
今天我正在审查一个人的代码,他声明了一个变量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;
}
现在,我无法弄清楚两件事:
- 我应该启用哪些确切的 gcc 标志才能收到此警告?
- 为什么将
i声明为 volatile 会抑制该警告?
【问题讨论】: