gcc优化标志中断代码

时间:2013-05-15 03:25:37

标签: c++ pointers optimization gcc

如果没有设置优化标志,此代码可以正常工作:

#include <cstdio>
int main(){
  float *ptr = ({float var[10] = {1,2,3,4,5,6,7,8,9,10}; var;});
  float *ptr1 = ({float var[10]; for(int i_=0;i_<10;i_++)var[i_]=i_+1; var;});
  float *ptr2 = ({float var[10]; var[4]=5; var;});
  printf("\n value = %f %f %f",ptr[4],ptr1[4],ptr2[4]);
}

按预期返回5 5 5。 但是当设置优化标志时,它会返回5 0 5

ptr1有与循环相关的问题。为什么? 也许这是一个错误?

我正在使用最新的4.8.0,经过测试的x64,x86以及其他版本。所有相同的行为。

2 个答案:

答案 0 :(得分:8)

你正在使用GNU语言扩展,所以让我们看一下GNU documentation

  

在语句表达式中,语句中创建的任何临时语句都会在该语句结束时被销毁。

每次都会销毁

var,并且指向其第一个元素的指针(表达式返回的内容)不能安全地取消引用。

答案 1 :(得分:2)

var指向的值在堆栈上分配。但是,var的范围是它包含在其中的括号。设置指向var的指针会导致未定义的行为。如您所见,在大多数情况下,堆栈中的值在打印时没有改变。但是,这可能会随着不同的优化设置而改变。这不是一个错误。这只是未定义行为的本质。