簡體   English   中英

gcc優化標志中斷代碼

[英]gcc optimization flag break code

當未設置優化標志時,此代碼可以正常工作:

#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以及其他構建。 都是一樣的行為。

您正在使用GNU語言擴展,因此讓我們看一下GNU文檔

在語句表達式中,在語句中創建的任何臨時對象都將在該語句的結尾處銷毀。

var每次都會被銷毀,並且指向其第一個元素(由表達式返回的內容)的指針不安全地取消引用。

var指向的值分配在堆棧上。 但是,var的范圍是包含在其中的括號。 設置指向var的指針會導致未定義的行為。 如您所見,在大多數情況下,打印時堆棧中的值並未更改。 但是,這可能會因不同的優化設置而改變。 這不是錯誤。 這只是不確定行為的本質。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM