亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C ++編譯錯誤?

C ++編譯錯誤?

C++
www說 2019-12-15 13:08:02
我有以下代碼:#include <iostream>#include <complex>using namespace std;int main() {    complex<int> delta;    complex<int> mc[4] = {0};    for(int di = 0; di < 4; di++, delta = mc[di]) {        cout << di << endl;    }    return 0;}我希望它輸出“ 0、1、2、3”并停止,但它輸出的序列是“ 0、1、2、3、4、5,..”??雌饋肀容^di<4效果不佳,并且總是返回true。如果我只是將其注釋掉,delta=mc[di],我會像往常一樣得到“ 0,1,2,3”。無辜的任務有什么問題?我正在使用帶有-O2選項的Ideone.com g ++ C ++ 14。
查看完整描述

3 回答

?
蕪湖不蕪

TA貢獻1796條經驗 獲得超7個贊

這是由于未定義的行為所致,您mc在循環的最后一次迭代中超出范圍訪問數組。一些編譯器可能會圍繞沒有未定義行為的假設執行主動循環優化。邏輯將類似于以下內容:


mc越界訪問是未定義的行為

假設沒有未定義的行為

因此di < 4始終為真,否則mc[di]會調用未定義的行為

啟用了優化功能的gcc并使用該-fno-aggressive-loop-optimizations標志會導致無限循環行為消失(參見live)。雖然有優化但沒有-fno-aggressive-loop-optimizations的實時示例展示了您觀察到的無限循環行為。


甲代碼godbolt活示例示出了di < 4檢查移除并用無條件JMP代替:


jmp .L6

這幾乎與GCC 4.8之前的Breaks Breaked SPEC 2006 Benchmarks中概述的情況相同。對本文的評論非常好,非常值得閱讀。它注意到clang在文章中抓住了這種情況-fsanitize=undefined,我無法用這種情況來重現這種情況,而gcc使用了這種情況-fsanitize=undefined(請參見實況)。關于優化程序的最臭名昭著的bug可能是對未定義行為的推斷,這是Linux內核空指針檢查刪除。


盡管這是一項激進的優化,但必須注意,正如C ++標準所說,未定義的行為是:


本國際標準沒有規定的行為


從本質上講,這意味著一切皆有可能,并指出(強調我的觀點):


[...]允許的不確定行為范圍從完全忽略具有不可預測結果的情況到在翻譯或程序執行過程中以環境特征的書面方式記錄的行為(帶有或不帶有診斷消息),終止翻譯或執行(帶有診斷消息的發布)。[...]


為了從gcc獲得警告,我們需要將cout循環移到外部,然后我們看到以下警告(實時查看):


warning: iteration 3u invokes undefined behavior [-Waggressive-loop-optimizations]

     for(di=0; di<4;di++,delta=mc[di]){ }

     ^

這可能足以為OP提供足夠的信息,以找出正在發生的事情。像這樣的不一致是我們在未定義行為中可以看到的典型行為類型。更好地理解為什么在面對未定義行為時這種警告會變得不一致,為什么在基于未定義行為進行優化時為什么不發出警告?是一本好書。


注意,-fno-aggressive-loop-optimizations在gcc 4.8發行說明中有記錄。



查看完整回答
反對 回復 2019-12-16
?
揚帆大魚

TA貢獻1799條經驗 獲得超9個贊

這是因為di ++在循環的最后一次運行中執行。


例如;


int di = 0;

for(; di < 4; di++);

// after the loop di == 4

// (inside the loop we see 0,1,2,3)

// (inside the for statement, after di++, we see 1,2,3,4)

當di == 4時,您正在訪問mc [],因此這是一個超出范圍的問題,有可能破壞堆棧的一部分并破壞變量di。


一個解決方案是:


for(int di = 0; di < 4; di++) {

    cout << di << endl;

    delta = mc[di];

}



查看完整回答
反對 回復 2019-12-16
  • 3 回答
  • 0 關注
  • 631 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號