gcc优化对静态const int的引用,即使它已经被修改

时间:2016-06-06 10:44:03

标签: c gcc optimization

我找到了一个意外的"以下代码的行为,它通过derefering其指针修改 static const int

#include <stdio.h>

static const int a;

int main(int argc, char *argv[])
{
    printf("a=%d\n", a);
    *((int *) &a) = 120;
    printf("a=%d\n", *((volatile *) &a));
    printf("a=%d\n", a);
    return 0;
}

使用GCC Debian 4.9.2-10编译的程序的输出(以及带有 -Os 的Debian 4.4.5-8)是:

a=0
a=120
a=0

除非使用 volatile 强制转换,否则编译器似乎会优化变量值。在编译期间没有给出警告,我发现程序在Debian 4.4.5-8中使用 -Os 表现不同。实际上,如果没有请求大小优化,它会打印&#34;期望&#34;第三行的值为120。

这是正常行为吗?

提前感谢您的意见

1 个答案:

答案 0 :(得分:1)

  

这是正常行为吗?

不,这是未定义的行为,因为您修改了使用const限定符定义的对象:

*((int *) &a) = 120;

这意味着无论发生什么,你都不应该做出任何正确或不正确的假设。