[英]gcc -O3 flag causes warnings that -O2 doesn't
我正在構建一個相當復雜的應用程序,它使用-O0
構建時沒有任何錯誤/警告。 然而,當我嘗試-O3
,我得到了一些令人費解的東西。 例如:
1: static pinfo_t* pinfo[2] = { &gv1, &gv2 }; // GLOBAL
2:
3: int i;
4: int x = sizeof(pinfo);
5:
6: for (i = 0; i < x; i ++)
7: if (pinfo[i]->id == NO_ID)
8: printf("%s\n", pinfo[i]->name);
注意編譯器(gcc v4.3.2)使用-O0
成功構建了這個(也帶有O1和O2)。 但是使用-O3
,編譯器正確地將第7行精確定位為導致錯誤行的潛在問題:
error: array subscript is above array bounds
很公平,但是當我在第7行發表評論時,第8行也沒有問題,這也應該被標記!
任何幫助表示贊賞!
在警告和優化級別中,在GCC中,在優化過程中分析代碼時會生成一些警告,因此當未啟用這些過程時,也不會發出這些警告。 這是一個長期存在的問題,但到目前為止它還沒有在任何人的TODO列表中傳播得足夠高。
美元到甜甜圈,編譯器完全展開-O3循環到類似的東西:
...
if (pinfo[0]->id == NO_ID)
printf("%s\n", pinfo[0]->name);
if (pinfo[1]->id == NO_ID)
printf("%s\n", pinfo[1]->name);
if (pinfo[2]->id == NO_ID)
printf("%s\n", pinfo[2]->name);
...
然后它會觀察到生成的索引超出范圍並向您發出警告。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.