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

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

啟用全面詳細的g ++警告的標志

啟用全面詳細的g ++警告的標志

C++
慕沐林林 2019-11-05 10:35:18
通常在C下gcc,我將從以下警告標志集開始(從多個來源痛苦地組合起來):-Wall -Wextra -Wformat-nonliteral -Wcast-align -Wpointer-arith -Wbad-function-cast \-Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations -Winline -Wundef \-Wnested-externs -Wcast-qual -Wshadow -Wwrite-strings -Wno-unused-parameter \-Wfloat-equal -pedantic -ansi我將使用這組警告來構建(至少是調試版本),并修復所有可能的內容(通常是所有內容),然后僅在不相關或不可修復的標記時才將其刪除(幾乎永遠不會這樣)。有時,-Werror如果在編譯時必須離開,我也會添加。我只是在學習C ++(是的,我落后時代15年),我想從右腳開始。我的問題是:有人在下面為C ++預編譯了一組類似的完整警告標志g++嗎?(我知道其中許多都一樣。)
查看完整描述

3 回答

?
臨摹微笑

TA貢獻1982條經驗 獲得超2個贊

我仔細研究了一下,發現應該包含最高警告級別的最小包含集。然后,我從該列表中刪除了一些警告,這些警告我認為實際上并沒有表明正在發生不良情況,或者有太多的誤報無法在實際版本中使用。我評論了為什么我排除的每個人都被排除在外。這是我最后建議的警告集:

-pedantic -Wall -Wextra -Wcast-align -Wcast-qual -Wctor-dtor-privacy -Wdisabled-optimization -Wformat=2 -Winit-self -Wlogical-op -Wmissing-declarations -Wmissing-include-dirs -Wnoexcept -Wold-style-cast -Woverloaded-virtual -Wredundant-decls -Wshadow -Wsign-conversion -Wsign-promo -Wstrict-null-sentinel -Wstrict-overflow=5 -Wswitch-default -Wundef -Werror -Wno-unused

存在的可疑警告:

  • -Wno-unused之所以加入,是因為我經常有一些變量,這些變量我以后會用到,但是還沒有編寫功能。刪除有關該內容的警告,使我能夠以自己偏愛的樣式編寫,偶爾會延遲事物的實現。每隔一段時間關閉一次,以確保沒有任何東西滑入裂縫是有用的。

  • -Wdisabled-optimization似乎是強大的用戶偏好設置。我只是將此代碼添加到了我的版本中(出于明顯的原因,僅用于優化的版本),并且它并沒有顯示任何內容,因此,這似乎不是一個特別健談的警告,至少就我編寫代碼的方式而言。我包括了它(即使觸發此警告的代碼不一定是錯誤的),因為我相信使用我的工具而不是反對它們。如果gcc告訴我它無法按照我編寫代碼的方式優化代碼,那么我應該考慮重寫它。我懷疑觸發此警告的代碼可能會受益于更高的模塊化程度,因此,盡管該代碼在技術上并沒有錯(可能),但從樣式上看卻可能是錯的。

  • -Wfloat-equal警告進行安全相等比較(尤其是與非計算值-1進行比較)。我使用此代碼的示例中有一個向量float。我經歷了這個向量,有些元素我還無法評估它們應該是什么,因此我將它們設置為-1.0f(因為我的問題僅使用正數,因此-1在域外)。稍后,我將更新-1.0f值。它不容易使自己適合于其他操作方法。我懷疑大多數人都沒有這個問題,并且比較浮點數的確切數字可能是一個錯誤,因此我將其包含在默認列表中。

  • -Wold-style-cast我正在使用的庫代碼中有很多誤報。特別是,網絡中使用的htonl函數系列,以及我正在使用的Rijndael(AES)加密實現,都警告了我。我打算將它們都替換掉,但是我不確定代碼中是否還有其他東西要抱怨。不過,大多數用戶可能應該默認啟用此功能。

  • -Wsign-conversion是一個艱難的人(幾乎沒有上榜)。在我的代碼中將其打開會產生大量警告(超過100條)。幾乎所有人都是無辜的。但是,我不確定在任何不確定的地方都使用有符號整數,盡管對于我特定的問題域,由于我做大量的整數除法操作,使用無符號值通常會稍微提高效率。我之所以犧牲效率是因為我擔心會意外地將有符號整數提升為無符號然后進行除法(與加法,減法和乘法不同,這是不安全的)。啟用此警告后,我可以安全地將大多數變量更改為無符號類型,并在其他位置添加一些強制類型轉換。當前使用起來有點困難,因為警告并不那么聰明。例如,如果您這樣做unsigned short + (integral constant expression),結果隱式提升為int。如果您將該值分配給unsignedunsigned short,即使它是安全的,它也會警告潛在的標志問題 。對于幾乎所有用戶,這絕對是最可選的警告。

  • -Wsign-promo:參見-Wsign-conversion。

  • -Wswitch-default似乎毫無意義(如果您已經明確列舉了所有可能性,則不必總是想要默認情況)。但是,打開此警告可能會強制執行某些操作,這可能是個好主意。如果您明確想忽略除所列可能性之外的所有內容(但其他數字也是可能的),請輸入default: break;使其明確。如果你明確地列舉所有的可能性,然后打開該警告將有助于確保你把東西像斷言(假),以確保您實際上已經涵蓋了所有可能的選項。它可以讓你在你的問題域是明確和編程強制執行。但是,你必須要在短短堅持斷言(假)到處小心。這比對默認情況不執行任何操作要好,但是與assert一樣,它在發行版本中不起作用。換句話說,您不能依靠它來驗證您從沒有絕對控制權的網絡連接或數據庫中獲得的號碼。異?;蛱嵩绶祷厥翘幚碓搯栴}的最佳方法(但仍然需要您使用默認情況!)。

  • -Werror對我來說很重要 在具有多個目標的多線程構建中編譯大量代碼時,很容易出現警告漏失的情況。將警告變成錯誤可以確保我注意到它們。

然后,有一組警告未包含在上面的列表中,因為我認為它們沒有用。這些是警告和我對為什么不將它們包括在默認列表中的評論:

缺少警告:

  • -Wabi不需要,因為我沒有合并來自不同編譯器的二進制文件。無論如何,我都嘗試使用它進行編譯,但是它沒有觸發,因此它似乎沒有不必要的冗長。

  • -Waggregate-return我認為這不是錯誤。例如,當在類的向量上使用基于范圍的for循環時,它將觸發。返回值優化應解決此問題的任何負面影響。

  • -Wconversion在此代碼上觸發:short n = 0; n += 2;隱式轉換為int時,如果將其轉換回其目標類型,則會引發警告。

  • -Weffc++如果未在初始化列表中初始化所有數據成員,則包括警告。在許多情況下,我故意不執行此操作,因此這組警告過于混亂而無用。偶爾打開一次并掃描其他警告(例如基類的非虛擬析構函數)會很有幫助。作為警告集合(例如-Wall),而不是單獨的單個警告,這將更為有用。

  • -Winline缺席,因為我沒有將inline關鍵字用于優化目的,只是為了在標頭中內聯定義函數。我不在乎優化器是否真正內聯它。如果無法內聯在類主體中聲明的函數(例如,空的虛擬析構函數),則此警告也會抱怨。

  • -Winvalid-pch 丟失了,因為我不使用預編譯的頭文件。

  • -Wmissing-format-attribute不使用,因為我不使用gnu擴展。與-Wsuggest-attribute其他幾個相同

  • 可能值得注意的是-Wno-long-long,它是我不需要的。我使用-std=c++0x-std=c++11在GCC 4.7中)進行編譯,其中包括long long整數類型。那些堅持使用C ++ 98 / C ++ 03的人可以考慮從警告列表中添加該排除項。

  • -Wnormalized=nfc 已經是默認選項,并且看起來是最好的。

  • -Wpadded有時會打開來優化類的布局,但由于并非所有類都具有足夠的元素來消除末尾的填充,因此未啟用它。從理論上講,我可以為“免費”獲得一些額外的變量,但是不值得為此付出額外的努力(如果我的班級大小發生變化,刪除那些以前免費的變量并不容易)。

  • -Wstack-protector 不使用,因為我不使用 -fstack-protector

  • -Wstrict-aliasing=3由開啟,-Wall并且是最準確的,但看起來第1級和第2級會發出更多警告。從理論上講,較低的級別是“更強”的警告,但這是以更多的誤報為代價的。我自己的測試代碼可以在所有3個級別下干凈地編譯。

  • -Wswitch-enum不是我想要的行為。我不想顯式地處理每個switch語句。如果該語言具有某種機制來激活指定的switch語句(以確保將來需要對枚舉進行的更改可以在需要處理的所有地方進行處理),則將很有用,但是對于“全有或全無”設置而言,這是過分的。

  • -Wunsafe-loop-optimizations導致太多虛假警告。定期應用此方法并手動驗證結果可能會很有用。例如,當我遍歷向量中的所有元素以向它們應用一組功能時(使用基于范圍的for循環),它在我的代碼中生成了此警告。它也用于警告常量性病的一個const陣列的構造::串(這里,這是在用戶代碼沒有循環)。

  • -Wzero-as-null-pointer-constant并且-Wuseless-cast是僅限GCC-4.7的警告,我將在過渡到GCC 4.7時添加這些警告。

由于這項研究,我已在gcc上提交了一些錯誤報告/增強功能請求,因此希望最終我能夠將更多的警告從“不包括”列表添加到“包含”列表中。該列表包括該線程中提到的所有警告(另外,我認為還有一些警告)。我沒有提到的另一個警告中包含了本文中未明確提及的許多警告。如果有人發現本帖子完全排除的任何警告,請告訴我。

編輯:好像我錯過了幾個(現在我已經添加了)。實際上,http://gcc.gnu.org上有第二個頁面,該頁面非常隱蔽。常規警告選項和C ++選項(向下滾動至警告底部)


查看完整回答
反對 回復 2019-11-05
?
皈依舞

TA貢獻1851條經驗 獲得超3個贊

嘗試


export CFLAGS="`gcc --help=warnings | grep '\-W' | awk '{print $1 \" \"}' |

sort | uniq` -pedantic -fdiagnostics-show-option -Werror"

這是一個快速而骯臟的開始,肯定需要進行一些調整。一方面,即使您使用與您的語言相對應的名稱來調用編譯器(例如,g++對于C ++),您也會收到不適用于該語言的警告(并且編譯器會舉手并拒絕繼續操作,直到您刪除警告)。


另一件事是我添加的-Werror,因為如果您不修正警告,那么為什么還要關心開啟它們呢?您也可以從列表中刪除警告。(例如,我幾乎從不使用-Waggregate-returnC ++。)


如果沒有其他與性能相關的選項(-Wstack-protector),某些警告將無法執行任何操作。-fdiagnostics-show-option和GCC手冊是您的朋友。


順便說一句,有些警告是互斥的。特別是-Wtraditional和-Wold-style-definition一起使用時-Werror,將無法編譯。


查看完整回答
反對 回復 2019-11-05
  • 3 回答
  • 0 關注
  • 920 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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