簡體   English   中英

gcc -O3標志會導致-O2不會發出警告

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

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