मुझे इसमें शामिल होना पड़ा और इसमें न्यूनतम सेट शामिल थे जिन्हें अधिकतम स्तर की चेतावनी मिलनी चाहिए। फिर मैंने उस सूची से चेतावनी के सेट को हटा दिया जो मुझे लगता है कि वास्तव में इंगित नहीं करता है कि कुछ बुरा हो रहा है, या फिर किसी वास्तविक बिल्ड में उपयोग किए जाने के लिए बहुत सारे गलत सकारात्मक हैं। मैंने टिप्पणी की कि मैंने जिन लोगों को बाहर रखा था उनमें से प्रत्येक को बाहर क्यों रखा गया था। यह सुझाव दिया चेतावनी का मेरा अंतिम सेट है:
मैं शामिल करता हूं -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 पर कुछ बग रिपोर्ट / एन्हांसमेंट अनुरोध दर्ज किए हैं, इसलिए उम्मीद है कि मैं अंततः "सूची में शामिल नहीं" सूची से "चेतावनी" सूची में अधिक चेतावनियों को जोड़ सकूंगा। । इस सूची में इस धागे में उल्लिखित सभी चेतावनियां शामिल हैं (इसके अलावा मुझे कुछ अतिरिक्त लगता है)। इस पोस्ट में स्पष्ट रूप से उल्लेख नहीं की गई कई चेतावनियाँ एक अन्य चेतावनी के हिस्से के रूप में शामिल हैं जिनका मैं उल्लेख करता हूँ। अगर किसी को भी इस पोस्ट से पूरी तरह से बाहर रखा गया है, तो मुझे चेतावनी दें।
-Wall) एक है-Wbloody_everythingझंडा :-)