फ्लैग पूरी तरह से सक्षम करने के लिए और जी ++ चेतावनियों को क्रियाशील करना


122

अक्सर सी के तहत 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++? (मुझे पता है कि उनमें से कई समान होंगे।)


69
क्या जीसीसी की जरूरत है (क्योंकि यह तो एकदम करने का फैसला किया है झूठ के बारे में -Wall) एक है -Wbloody_everythingझंडा :-)
paxdiablo

आप अपने प्रश्न को एक डुबकी के रूप में चिह्नित कर सकते हैं लेकिन आप अपने अंतिम संपादन को एक उत्तर के रूप में भी रख सकते हैं क्योंकि आपने वास्तव में अपने प्रश्न का उत्तर दिया था। और मुझे खुशी होगी कि आप इसे
आगे बढ़ाएँगे

4
ओपी और @ पैक्सडीब्लो: जीसीसी ने लगातार इस तरह की बात को खारिज कर दिया है, लेकिन यह क्लैंग में उपलब्ध है -Weverything। मैंने पढ़ा है कि क्लैंग ++ डेवलपर्स भी उपयोगकर्ताओं को इसे चालू करने के बारे में थोड़ा चिंतित हैं; जाहिरा तौर पर यह केवल आंतरिक विकास उपयोग के लिए था। यह कोई मतलब नहीं है, हालांकि, क्योंकि चालू -Weverythingकरना संभवतः संभावित सहायक चेतावनियों को खोजने के लिए सबसे अच्छा संभव तरीका है जिसके बारे में आप पहले नहीं जानते थे।
काइल स्ट्रैंड

1
OP और @paxdiablo अब दिए गए GCC संस्करण के लिए चेतावनियों की पूरी सूची का पता लगाने का एक तरीका है: github.com/barro/compiler-warnings
Kyle Strand

जवाबों:


138

मुझे इसमें शामिल होना पड़ा और इसमें न्यूनतम सेट शामिल थे जिन्हें अधिकतम स्तर की चेतावनी मिलनी चाहिए। फिर मैंने उस सूची से चेतावनी के सेट को हटा दिया जो मुझे लगता है कि वास्तव में इंगित नहीं करता है कि कुछ बुरा हो रहा है, या फिर किसी वास्तविक बिल्ड में उपयोग किए जाने के लिए बहुत सारे गलत सकारात्मक हैं। मैंने टिप्पणी की कि मैंने जिन लोगों को बाहर रखा था उनमें से प्रत्येक को बाहर क्यों रखा गया था। यह सुझाव दिया चेतावनी का मेरा अंतिम सेट है:

-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 के गैर-गणना मूल्य के साथ तुलना)। मेरे कोड में एक उदाहरण जहां मैं इसका उपयोग करता हूं वह यह है कि मेरे पास फ्लोट का एक वेक्टर है। मैं इस वेक्टर के माध्यम से जाता हूं, और कुछ तत्व हैं जो मैं अभी तक मूल्यांकन नहीं कर सकता कि उन्हें क्या होना चाहिए, इसलिए मैंने उन्हें -1.0f पर सेट किया (क्योंकि मेरी समस्या केवल सकारात्मक संख्याओं का उपयोग करती है, -1 डोमेन से बाहर है)। मैं बाद में -1.0f मानों को अद्यतन करता हूं। यह आसानी से ऑपरेशन की एक अलग विधि के लिए उधार नहीं देता है। मुझे संदेह है कि ज्यादातर लोगों को यह समस्या नहीं है, और फ़्लोटिंग पॉइंट में सटीक संख्या की तुलना करना संभवतः एक त्रुटि है, इसलिए मैं इसे डिफ़ॉल्ट सूची में शामिल कर रहा हूं।

  • -Wold-style-castपुस्तकालय कोड मैं उपयोग कर रहा हूँ में झूठी सकारात्मक का एक बहुत कुछ है। विशेष रूप से, नेटवर्किंग में उपयोग किए जाने वाले फ़ंक्शंस के htonl परिवार के साथ-साथ एक Rijndael (AES) एन्क्रिप्शन कार्यान्वयन जो मैं उपयोग कर रहा हूं उसमें पुरानी शैली की कास्ट्स हैं जो मुझे इसके बारे में चेतावनी देती हैं। मैं इन दोनों को बदलने का इरादा रखता हूं, लेकिन मुझे यकीन नहीं है कि मेरे कोड में कुछ और है जो इसके बारे में शिकायत करेगा। अधिकांश उपयोगकर्ताओं को संभवतः डिफ़ॉल्ट रूप से यह होना चाहिए।

  • -Wsign-conversionएक कठिन था (और लगभग सूची नहीं बनाया)। मेरे कोड में इसे चालू करने से भारी मात्रा में चेतावनी (100+) उत्पन्न हुई। उनमें से लगभग सभी निर्दोष थे। हालाँकि, जहाँ भी मुझे यकीन नहीं था, हस्ताक्षरित पूर्णांक का उपयोग करने में सावधानी बरती गई है, हालाँकि अपने विशेष समस्या डोमेन के लिए, मुझे आमतौर पर पूर्णांक विभाजन की बड़ी मात्रा के कारण अहस्ताक्षरित मानों का उपयोग करके थोड़ी दक्षता वृद्धि प्राप्त होगी। मैंने इस दक्षता का बलिदान किया क्योंकि मैं गलती से एक हस्ताक्षरित पूर्णांक को एक अहस्ताक्षरित और फिर विभाजित करने (जो इसके अलावा, घटाव और गुणा के विपरीत सुरक्षित नहीं है) को बढ़ावा देने के बारे में चिंतित था। इस चेतावनी को चालू करने से मुझे अपने अधिकांश चर को बिना किसी प्रकार के सुरक्षित रूप से बदलने और कुछ अन्य स्थानों पर कुछ जातियों को जोड़ने की अनुमति मिली। यह वर्तमान में उपयोग करने के लिए थोड़ा कठिन है क्योंकि चेतावनी वह स्मार्ट नहीं है। उदाहरण के लिए, यदि आप ऐसा करते हैंunsigned short + (integral constant expression), उस परिणाम को संक्षेप में int को बढ़ावा दिया जाता है। यह तो एक संभावित संकेत समस्या के बारे में चेतावनी दी है कि अगर आप के लिए है कि मूल्य निर्दिष्ट unsignedया unsigned short, फिर भी यह सुरक्षित है। यह निश्चित रूप से लगभग सभी उपयोगकर्ताओं के लिए सबसे वैकल्पिक चेतावनी है।

  • -Wsign-promo: देखना -Wsign-conversion

  • -Wswitch-defaultव्यर्थ लगता है (यदि आप स्पष्ट रूप से सभी संभावनाओं को स्पष्ट रूप से जानना चाहते हैं तो आप एक डिफ़ॉल्ट मामला नहीं चाहते हैं)। हालांकि, इस चेतावनी को चालू करने से कुछ ऐसा लागू हो सकता है जो शायद एक अच्छा विचार है। उन मामलों के लिए जहां आप स्पष्ट रूप से सूचीबद्ध संभावनाओं को छोड़कर सब कुछ अनदेखा करना चाहते हैं (लेकिन अन्य संख्या संभव है), फिर अंदर डाल देंdefault: break;स्पष्ट करने के लिए। यदि आप स्पष्ट रूप से सभी संभावनाओं की गणना करते हैं, तो इस चेतावनी को चालू करने से यह सुनिश्चित करने में मदद मिलेगी कि आपने यह सुनिश्चित करने के लिए कि आप वास्तव में सभी संभावित विकल्पों को कवर कर चुके हैं, यह सुनिश्चित करने के लिए कुछ (जैसे) जोर दिया। यह आपको यह स्पष्ट करने देता है कि आपकी समस्या का डोमेन क्या है और प्रोग्रामेटिक रूप से इसे लागू करता है। हालाँकि, आपको हर जगह बस (असत्य) चिपकाने में सावधानी बरतनी होगी। यह डिफ़ॉल्ट मामले के साथ कुछ भी नहीं करने से बेहतर है, लेकिन हमेशा की तरह मुखर होकर, यह रिलीज बिल्ड में काम नहीं करेगा। दूसरे शब्दों में, आप इस पर भरोसा नहीं कर सकते हैं कि आपको प्राप्त संख्याओं को मान्य करने के लिए, कहते हैं, एक नेटवर्क कनेक्शन या एक डेटाबेस जो आपके पास पूर्ण नियंत्रण नहीं है। अपवाद या जल्दी वापस लौटना सबसे अच्छा तरीका है जिसे संभालने के लिए (लेकिन फिर भी आपको एक डिफ़ॉल्ट मामले की आवश्यकता है!)।

  • -Werrorमेरे लिए एक महत्वपूर्ण है। जब बहु-थ्रेड बिल्ड में बड़ी मात्रा में कोड को कई लक्ष्यों के साथ संकलित किया जाता है, तो इसके द्वारा चेतावनी देना आसान होता है। चेतावनियों को त्रुटियों में बदलना सुनिश्चित करता है कि मैं उन्हें नोटिस करता हूं।

फिर चेतावनी का एक सेट है जो उपरोक्त सूची में शामिल नहीं हैं क्योंकि मैंने उन्हें उपयोगी नहीं पाया। ये चेतावनी और मेरी टिप्पणियां हैं कि मैं उन्हें डिफ़ॉल्ट सूची में क्यों शामिल नहीं कर रहा हूं:

अनुपस्थित रहने वाली चेतावनी:

  • -Wabiजरूरत नहीं है क्योंकि मैं अलग-अलग संकलक से बायनेरिज़ का संयोजन नहीं कर रहा हूं। मैंने वैसे भी इसके साथ संकलन करने की कोशिश की, और यह ट्रिगर नहीं हुआ, इसलिए यह अनावश्यक रूप से क्रिया नहीं लगता है।

  • -Waggregate-returnकुछ ऐसा नहीं है जिसे मैं त्रुटि मानता हूं। उदाहरण के लिए, कक्षाओं के वेक्टर पर लूप के लिए रेंज-आधारित का उपयोग करते समय यह ट्रिगर हो जाता है। रिटर्न वैल्यू ऑप्टिमाइज़ेशन को इसके किसी भी नकारात्मक प्रभाव का ध्यान रखना चाहिए।

  • -Wconversionइस कोड पर ट्रिगर: short n = 0; n += 2;int के लिए अंतर्निहित रूपांतरण एक चेतावनी का कारण बनता है जब यह फिर से अपने लक्ष्य प्रकार में परिवर्तित हो जाता है।

  • -Weffc++यदि सभी डेटा सदस्यों को इनिशियलाइज़र सूची में प्रारंभ नहीं किया गया है तो एक चेतावनी शामिल है। मैं जानबूझकर कई मामलों में ऐसा नहीं करता हूं, इसलिए चेतावनियों का सेट उपयोगी होने के लिए बहुत अव्यवस्थित है। यह हर बार एक बार चालू करने और अन्य चेतावनियों के लिए स्कैन करने में मददगार होता है, हालाँकि (जैसे आधार कक्षाओं के गैर-आभासी विध्वंसक)। यह -Wallअपने आप पर एक चेतावनी के बजाय चेतावनी (जैसे ) के संग्रह के रूप में अधिक उपयोगी होगा ।

  • -Winlineअनुपस्थित है क्योंकि मैं अनुकूलन उद्देश्यों के लिए इनलाइन कीवर्ड का उपयोग नहीं करता, सिर्फ हेडर में फ़ंक्शन इनलाइन को परिभाषित करने के लिए। मुझे परवाह नहीं है कि क्या अनुकूलक वास्तव में इसे रेखांकित करता है। यदि यह किसी वर्ग निकाय (जैसे कोई खाली वर्चुअल डिस्ट्रक्टर) में घोषित फ़ंक्शन को इनलाइन नहीं कर सकता, तो यह चेतावनी भी शिकायत करती है।

  • -Winvalid-pch याद आ रही है क्योंकि मैं पहले से तैयार हेडर का उपयोग नहीं करता हूं।

  • -Wmissing-format-attributeका उपयोग नहीं किया जाता है क्योंकि मैं ग्नू एक्सटेंशन का उपयोग नहीं करता हूं। के लिए -Wsuggest-attributeऔर कई अन्य

  • इसकी अनुपस्थिति के लिए संभावित रूप से उल्लेखनीय है -Wno-long-long, जिसकी मुझे कोई आवश्यकता नहीं है। मैं -std=c++0x( -std=c++11जीसीसी 4.7 में) संकलन करता हूं , जिसमें long longपूर्णांक प्रकार शामिल हैं। C ++ 98 / C ++ 03 पर वापस अटके लोग उस बहिष्करण को चेतावनी सूची से जोड़ने पर विचार कर सकते हैं।

  • -Wnormalized=nfc पहले से ही डिफ़ॉल्ट विकल्प है, और सबसे अच्छा लगता है।

  • -Wpaddedकक्षाओं के लेआउट को अनुकूलित करने के लिए कभी-कभी चालू किया जाता है, लेकिन इसे छोड़ा नहीं जाता है क्योंकि सभी वर्गों में अंत में गद्दी को हटाने के लिए पर्याप्त तत्व नहीं होते हैं। सिद्धांत रूप में मुझे 'मुफ्त' के लिए कुछ अतिरिक्त चर मिल सकते हैं, लेकिन यह बनाए रखने के अतिरिक्त प्रयास के लायक नहीं है (यदि मेरा वर्ग आकार बदलता है, तो उन पहले मुक्त चर को निकालना आसान नहीं है)।

  • -Wstack-protector उपयोग नहीं किया जाता है क्योंकि मैं उपयोग नहीं करता हूं -fstack-protector

  • -Wstrict-aliasing=3द्वारा चालू किया गया है -Wallऔर सबसे सटीक है, लेकिन यह स्तर 1 और 2 जैसा दिखता है और अधिक चेतावनी देता है। सिद्धांत रूप में एक निचला स्तर एक 'मजबूत' चेतावनी है, लेकिन यह अधिक गलत सकारात्मकता की कीमत पर है। मेरे अपने परीक्षण कोड को सभी 3 स्तरों के तहत सफाई से संकलित किया गया है।

  • -Wswitch-enumवह व्यवहार नहीं है जो मुझे चाहिए। मैं स्पष्ट रूप से हर स्विच स्टेटमेंट को संभालना नहीं चाहता। यह उपयोगी होगा यदि भाषा में निर्दिष्ट स्विच स्टेटमेंट पर इसे सक्रिय करने के लिए कुछ तंत्र था (यह सुनिश्चित करने के लिए कि फिटकिरी में भविष्य के परिवर्तन को हर जगह पर नियंत्रित किया जाता है जो उन्हें होना चाहिए), लेकिन यह "ऑल-या-नथिंग" सेटिंग के लिए ओवरकिल है।

  • -Wunsafe-loop-optimizationsबहुत अधिक चेतावनी देने का कारण बनता है। यह समय-समय पर इसे लागू करने और परिणामों को मैन्युअल रूप से सत्यापित करने के लिए उपयोगी हो सकता है। एक उदाहरण के रूप में, यह मेरे कोड में इस चेतावनी को उत्पन्न करता है जब मैंने वेक्टर में सभी तत्वों पर उन्हें कार्यों के एक सेट को लागू करने के लिए लूप किया था (लूप के लिए रेंज-आधारित का उपयोग करके)। यह कॉन्स्टेंट स्टैड ऑफ कॉन्स्ट स्टैड :: स्ट्रिंग (जहां यह उपयोगकर्ता कोड में लूप नहीं है) के निर्माण के लिए भी चेतावनी दे रहा है।

  • -Wzero-as-null-pointer-constantऔर -Wuseless-castजीसीसी-4.7 हैं-केवल चेतावनी, जिसे मैं जीसीसी 4.7 में संक्रमण होने पर जोड़ूंगा।

मैंने इस शोध में से कुछ के परिणामस्वरूप gcc पर कुछ बग रिपोर्ट / एन्हांसमेंट अनुरोध दर्ज किए हैं, इसलिए उम्मीद है कि मैं अंततः "सूची में शामिल नहीं" सूची से "चेतावनी" सूची में अधिक चेतावनियों को जोड़ सकूंगा। । इस सूची में इस धागे में उल्लिखित सभी चेतावनियां शामिल हैं (इसके अलावा मुझे कुछ अतिरिक्त लगता है)। इस पोस्ट में स्पष्ट रूप से उल्लेख नहीं की गई कई चेतावनियाँ एक अन्य चेतावनी के हिस्से के रूप में शामिल हैं जिनका मैं उल्लेख करता हूँ। अगर किसी को भी इस पोस्ट से पूरी तरह से बाहर रखा गया है, तो मुझे चेतावनी दें।

संपादित करें: ऐसा लगता है कि मैंने कई याद किए थे (जो मैंने अब जोड़ा है)। वास्तव में http://gcc.gnu.org पर एक दूसरा पेज है जो काफी अच्छी तरह से छिपा हुआ है। सामान्य चेतावनी विकल्प और C ++ विकल्प (चेतावनी के लिए नीचे की ओर स्क्रॉल करें)


मैंने हाल ही में इस उत्तर के लिए अपने शोध के आधार पर एक वृद्धि अनुरोध प्रस्तुत किया है: gcc.gnu.org/bugzilla/show_bug.cgi?id=53313 । यह चेतावनी स्तर बनाकर चेतावनी की स्थिति को नाटकीय रूप से सरल बना देगा। मेरे प्रस्ताव में, मेरे सुझाए गए चेतावनियों का सेट लगभग -W4 है, जिसे बनाने के लिए एक अतिरिक्त प्रस्ताव के साथ -Winf, जिसका अर्थ होगा -प्रत्येक-और-मैं-वास्तव में इसका मतलब-यह-इस समय
डेविड स्टोन

एन्हांसमेंट अनुरोध जो -Wpadded का हिस्सा होगा, को अनुशंसित सूची में जोड़ा जाएगा: gcc.gnu.org/bugzilla/show_bug.cgi?id=53514
डेविड स्टोन 1

एन्हांसमेंट रिक्वेस्ट जो -Weffc ++ के कुछ हिस्सों को अनुशंसित सूची में जोड़ने का कारण बनेगी
डेविड स्टोन

1
@Predelnik: यह उससे कहीं अधिक पेचीदा है। -Wswitch-enumचेतावनी देता है कि यदि आप एक स्विच में प्रत्येक गणना मूल्य को स्पष्ट रूप से नहीं संभालते हैं, और defaultस्पष्ट रूप से गिनती नहीं करते हैं। दूसरी ओर, -Wswitch-defaultआपको चेतावनी देता है कि यदि आपके स्विच में कोई defaultमामला नहीं है , भले ही आपने स्पष्ट रूप से सभी संभावित मूल्यों को कवर किया हो।
डेविड स्टोन

2
Btw - उपयोग -isystemके बजाय -Iअपने "पुराने पुस्तकालय कोड" पर उन सभी झूठे सकारात्मक को रोकने के लिए
गाल्वा

39

D'oh, मेरी सभी मूल खोजों ने चेतावनी ( कैसे पर्याप्त रूप से) को दबाने के लिए 99% पोस्ट किए , लेकिन मैं सिर्फ इस टिप्पणी को पार कर गया , जिसमें झंडे का यह प्यारा सेट है (कुछ कम प्रासंगिक):

क्रॉस चेक के साथ:

http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

-g -O -Wall -Weffc++ -pedantic  \
-pedantic-errors -Wextra -Waggregate-return -Wcast-align \
-Wcast-qual -Wconversion \
-Wdisabled-optimization \
-Werror -Wfloat-equal -Wformat=2 \
-Wformat-nonliteral -Wformat-security  \
-Wformat-y2k \
-Wimplicit  -Wimport  -Winit-self  -Winline \
-Winvalid-pch   \
-Wlong-long \
-Wmissing-field-initializers -Wmissing-format-attribute   \
-Wmissing-include-dirs -Wmissing-noreturn \
-Wpacked  -Wpadded -Wpointer-arith \
-Wredundant-decls \
-Wshadow -Wstack-protector \
-Wstrict-aliasing=2 -Wswitch-default \
-Wswitch-enum \
-Wunreachable-code -Wunused \
-Wunused-parameter \
-Wvariadic-macros \
-Wwrite-strings

इसलिए, मुझे लगता है कि यह एक अच्छा शुरुआती बिंदु है। यह महसूस नहीं किया गया था कि यह एक डुबकी थी, लेकिन कम से कम यह गहराई से दफन था। :-)


1
शायद, लेकिन ऐसा लगता है कि संस्करणों के बीच परिवर्तन होता है, और सूरज के धब्बे और आरएमएस की संभावना पर, इसलिए अत्यधिक स्पष्ट रूप से चोट नहीं पहुंचेगी। यह एक अच्छा प्रारंभिक बिंदु है, वैसे भी।
Sdaz MacSkibbons

3
'केस OPT_W' के लिए 4.5.2 के c-opts.c / opts.c के त्वरित grep से, आप गायब हैं: सख्त अतिप्रवाह, अपरिभाषित, सख्त नल प्रहरी, सामान्यीकृत, बहुचर्चित, अंतर्निहित फ़ंक्शन घोषणा, पदावनत, एंडिफ लेबल। टिप्पणी एस , बिलिन मैक्रो पुनर्परिभाषित, से बड़ा, eq, अबी से बड़ा। यह पागल है कि उन्हें सूचीबद्ध करने के लिए कमांड लाइन विकल्प नहीं है।
टोनी डेलरो

3
मुझे लगता है कि यह पागलपन है जो -Wallऐसा नहीं करता है जो इसे करने की उम्मीद करेगा। लेकिन धन्यवाद, उनमें से कुछ बहुत उपयोगी लगते हैं!
Sdaz MacSkibbons

1
चेतावनियों को अक्षम करने का अपना स्थान है। आखिरकार, वे "चेतावनी" हैं। एक और स्थिति है जब आप एक ध्वज को सक्षम करते हैं जो कई चेतावनियों को सक्षम करता है, लेकिन आप इसके बारे में चयनात्मक होना चाहते हैं।
तमसे सजेलेई

1
आप कैसे उपयोग करने में सक्षम हैं -Waggregate-return? यह मुझे हर प्रयोग के लिए एक चेतावनी देता हैbegin/end()
फ्लेमफायर

13

उनमें से कुछ पहले से -Wallया में शामिल हैं -Wextra

C के लिए एक अच्छा आधार सेटअप है:

-std=c99 -pedantic -Wall -Wextra -Wwrite-strings -Werror

और C ++ के लिए

-ansi -pedantic -Wall -Wextra -Weffc++

( -Werrorसी + + के लिए लंघन क्योंकि -Weffc++कुछ झुंझलाहट है)


10
-वोरर को विशिष्ट प्रकार की चेतावनियों के लिए निष्क्रिय किया जा सकता है, उदाहरण के लिए: -वरोर-वेफेक ++ -नोवा-त्रुटि = effc ++
रॉबर्ट हेंसिंग

2
एएनएसआई : सी मोड में, यह इसके बराबर है -std=c89। C ++ मोड में, यह बराबर है -std=c++98। यानी यदि आप कुछ अन्य निर्दिष्ट करते हैं std, तो उपयोग न करेंansi
शॉन ब्रेकेनरिज

2

प्रयत्न

export CFLAGS="`gcc --help=warnings | grep '\-W' | awk '{print $1 \" \"}' |
sort | uniq` -pedantic -fdiagnostics-show-option -Werror"

यह एक त्वरित और गंदी शुरुआत है जिसे निश्चित रूप से कुछ ट्यूनिंग की आवश्यकता होगी; एक बात के लिए, यहां तक ​​कि अगर आप अपनी भाषा के लिए उपयुक्त नाम से कंपाइलर को बुलाते हैं (जैसे g++सी ++ के लिए), तो आपको चेतावनी मिलेगी कि उस भाषा पर लागू न करें (और संकलक अपने हाथों को फेंक देगा और तब तक मना कर देगा जब तक आप जारी नहीं रखते। चेतावनी को हटा दें)।

एक और बात यह है कि मैंने इसमें जोड़ा है -Werror , क्योंकि यदि आप चेतावनी को ठीक नहीं कर रहे हैं, तो आप उन्हें चालू करने की परवाह क्यों करते हैं? आप सूची से चेतावनी भी ले सकते हैं। (उदाहरण के लिए, मैं लगभग कभी भी -Waggregate-returnC ++ का उपयोग नहीं करता ।)

कुछ चेतावनी अन्य प्रदर्शन से संबंधित विकल्पों के बिना कुछ भी नहीं करेंगे (-Wstack-protector ) के । -fdiagnostics-show-optionऔर जीसीसी मैनुअल आपके मित्र हैं।

वैसे, कुछ चेतावनी पारस्परिक रूप से अनन्य हैं; विशेष रूप से उपयोग करने -Wtraditionalऔर -Wold-style-definitionसाथ में -Werror, संकलन नहीं करेगा।


0

मेरे Clion के CmakeLists.txt में

cmake_minimum_required(VERSION 3.13)
project(cpp17)

set(CMAKE_CXX_STANDARD 17)

set(GCC_COVERAGE_COMPILE_FLAGS "-std=c++17 -Wall -Weffc++ -Wno-error=effc++ -pedantic \
 -Weverything -Wno-c++98-compat -Wno-c++98-compat-pedantic -Wno-newline-eof  \
-pedantic-errors -Wextra -Waggregate-return -Wcast-align \
-Wcast-qual -Wconversion \
-Wdisabled-optimization \
-Werror -Wfloat-equal -Wformat=2 \
-Wformat-nonliteral -Wformat-security  \
-Wformat-y2k \
-Wimplicit  -Wimport  -Winit-self  -Winline -Winvalid-pch   \
-Wlong-long \
-Wmissing-field-initializers -Wmissing-format-attribute   \
-Wmissing-include-dirs -Wmissing-noreturn \
-Wpacked  -Wpadded -Wpointer-arith \
-Wredundant-decls \
-Wshadow -Wstack-protector \
-Wstrict-aliasing=2 -Wswitch-default \
-Wswitch-enum \
-Wunreachable-code -Wunused \
-Wunused-parameter \
-Wvariadic-macros \
-Wwrite-strings")


set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}" )

add_executable(cpp17 main.cpp)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.