[英]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.